Sida 2 av 3

Postat: 10 januari 2008, 11:29:49
av JimmyAndersson
"men nu vet jag inte vilken port jag ska använda till lysdioden..."



*host*

En kommentar hämtad Sodjan's kod:

"Blinka med hela PORTA!"

:)

Postat: 10 januari 2008, 11:34:28
av sodjan
Som Jimmy sa, vilken pinne som helst på PORTA kan användas.
Notera att jag (för att få lite mer kompakt kod) använder COMF
vilket ställer om hela PORTA...

Postat: 10 januari 2008, 19:10:27
av ElectricMan
hur skulle det se ut om man väljer en specifik port då?

Postat: 10 januari 2008, 19:38:32
av sodjan
Det verkar som om du rör ihop "port" och "pin"...

Postat: 10 januari 2008, 19:40:46
av ElectricMan
Aja, pinne då :)

EDIT: eller kan nån förklara lite?

Postat: 10 januari 2008, 22:08:55
av chrille112
PORTA = 0b00000001

sätter pinne 1 hög på PORTA

Postat: 10 januari 2008, 22:19:32
av sodjan
> PORTA = 0b00000001
> sätter pinne 1 hög på PORTA

Nej nej nej, det där kommer bara att ge ett felmeddelande !!

Kolla BCF/BSF instruktionerna. T.ex :

BCF PORTA, 0 ; Sätt RA0 = "0"
BSF PORTA, 0 ; Sätt RA0 = "1"

o.s.v...

(Sen, om du vill, kan du läsa lite om "Read-Modify-Write" (RMW) mot
port-pinnar, men det är lite överkurs just nu...)

Postat: 10 januari 2008, 22:32:47
av chrille112
Sorry, glömde att det var ASM som gällde. I C fungerar det utmärkt :P

Postat: 8 maj 2008, 22:34:16
av dechaine
sodjan skrev:Alltså, att *börja* sin resa i PIC världen genom att pilla med firmware
till programmeraren, låter väl kanske inte som riktigt rätt ände... :-) :-)

Och JAL är en väldigt udda konstruktion som det igentligen inte finns
mycket anledning att bry sig om alls.

> Någon som har någon bra exempelkod för att blinka en lysdiod med en 16F628?

Kod: Markera allt

;**********************************************************************
;   Enkelt blink-a-led, 16F628A.
;
;**********************************************************************
;    Other files required:
;    16F628A.LNK (lägg till i projektet som "Linker Script" !)
;
;**********************************************************************

  list      p=16f628A
  #include <p16f628A.inc>
	
  __CONFIG   _DATA_CP_OFF & _CP_ON & _LVP_OFF & _BODEN_OFF & _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _MCLRE_ON

RESET_VECTOR    CODE    0x000     ; processor reset vector
  goto    start             ; go to beginning of program


INT_VECTOR      CODE    0x004     ; interrupt vector location
  goto    isr_routine       ; goto main interrupt service routine.
        

;***************************************************************
MAIN    CODE

start

  banksel cmcon
  movlw   h'07'
  movwf   cmcon            ; Stäng av ADC, se databladet om PORTA.

  banksel trisa
  clrf    trisa
  clrf    trisb             ; Alla pinnar = utgångar.

  banksel t1con
  movlw   b'00110001'
  movwf   t1con             ; Se databladet om Timer1.
        
  banksel pie1
  movlw   b'00000001'
  movwf   pie1              ; Enable avbrott från TMR1.

  banksel intcon	
  bsf     intcon, peie     ; Enable "peripheral interrupts".
  bsf     intcon, gie      ; Enable "global interrupts".

loop
  goto loop                 ; Vänta på avbrott (interrupt)...
 


;***************************************************************
ISR_ROUTINE  CODE

isr_routine                ; avbrott/interrupt rutin.

  banksel porta
  comf    porta            ; Blinka med hela PORTA!

  banksel pir1
  bcf     pir1, tmr1if     ; återställ avbrotts flagga.

  retfie

  end

Allt detta för att få en liten led att blinka??
Då känns JAL betydligt mer logiskt... och enklare.. http://www.voti.nl/blink/code/b628-1.jal Rimlig kodlängd för ett "blink a led" program...

Men det är väl bara att man inte ser logiken i det hela än..

Finns det någon "ordbok" över alla förkortningar någonstans??
Samt någon sida (helst på svenska) som förklarar logiken i det hela i detalj?

Postat: 8 maj 2008, 22:42:05
av sodjan
Vadå "allt detta" ??

Det som står mellan "start" och "loop" har igentligen inte så mycket med
blinkandet att göra, det är finns alltid med i någon form.

> Finns det någon "ordbok" över alla förkortningar någonstans??

Vilka "förkortningar" ?

Vad är det i "logiken" som ska förklaras ? Var lite mer
specifik så går det lättare att svara.

Det bör inte finnas något som inte förklaras i databladet
och/eller i MPASM manualen.

Postat: 8 maj 2008, 23:07:57
av dechaine
Okej. Ja i den manualen står det en hel del :oops: Bara läst i User´s Guide till MPLAB än så länge.

Tänkte på de förkortningar som t.ex. banksel, movlw, movwf mm.. men det löste ju sig med MPASM.

Ang. logiken tänkte jag på till exempel detta program http://www.voti.nl/stepbots/index.html
Här kan jag direkt förstå sambandet mellan variablarna och alla "anrop", IF etc. men det beror väl på att jag programmerat lite i windowsmiljö (delphi).

Ja ja.. ska läsa på ordentligt i manualen nu (i morgon)!

Är det mellan "main" och "loop" bara "konfigurering" av picen eller vad är det mer exakt?

Postat: 8 maj 2008, 23:25:36
av sodjan
BANKSEL är ett "assembler direktive", d.v.s något som styr hur MPASM
jobbar och som ibland (men inte alltid) även skapar kod. Alla direktiv
har ett eget kapitel i MPASM manualen. Det är bara att slå upp.

MOVLW, MOVWF o.s.v är "instructions" och finns bl.a i ett eget
kapitel i alla datablad där det berättas i detalj vad de gör.

Koden fram till "loop" körs bara en gång för att initiera propcessorn
för det som den sen ska göra. Allt "blinkande" görs sedan i ISR_ROUTINE.

Notera att i princip allt som står i MPASM/MPLINK manualen även
finns online i hjälpen i MPLAB...

Postat: 9 maj 2008, 08:00:56
av Icecap
dechaine: i alla µC program får man starta med att sätta portpinnar i rätt riktning, slå på/av funktioner, starta hårdvara (UART för seriell kommunikation t.ex.), slå på/av interrupt osv. Är man en seriös programmör förlitar man sig ALDRIG på "default" inställningerna.

Detta betyder att det som i sodjans prog. ligger mellan 'start' och 'loop' är just de inställningar och det prog. är till o med ett bra exempel på hur man använder interrupten.

Att man bytar språk betyder INTE att man kan strunta i dessa inställningar, det betyder bara att man ska göra det samma med en annan syntax.

Exempel där jag blandar ASM & C: (varje C-rad utför samma funktion som de ovanstående ASM-rader, '->' används som indikering av C-rad)

Kod: Markera allt

  banksel cmcon
  movlw   h'07'
  movwf   cmcon            ; Stäng av ADC, se databladet om PORTA.
-> CMCON = 0x07; // Samma fast i C

  banksel trisa
  clrf    trisa
-> TRISA = 0x00;

  clrf    trisb             ; Alla pinnar = utgångar.
-> TRISB = 0x00;

  banksel t1con
  movlw   b'00110001'
  movwf   t1con             ; Se databladet om Timer1.
-> T1CON = 0x31;

  banksel pie1
  movlw   b'00000001'
  movwf   pie1              ; Enable avbrott från TMR1.
-> PIE1 = 0x01;

  banksel intcon	
  bsf     intcon, peie     ; Enable "peripheral interrupts".
-> INTCON_PEIE = 1;

  bsf     intcon, gie      ; Enable "global interrupts".
-> INTCON_GIE = 1;
Obs. att dessa C-rader utlöser samma antal (och oftast lite fler) ASM-kommandon, det är alltså bara ett annat sätt att skriva samma sak.

Postat: 9 maj 2008, 20:02:34
av dechaine
Nu börjar det klarna!
C verkar mycket lättare, så vad är det egentligen som gör att man bör börja med ASM? Är ASM "närmare" maskinkod, så att man kan skriva mer exakt i vissa saker?

Postat: 9 maj 2008, 20:17:49
av sodjan
> C verkar mycket lättare,

Beror på din definition av "lättare".
Om du bara vil korta ner tidehn att skriva kod, så kan det stämma.
Om du även vill förstå vad som händer och ha 100% kontroll
över vad som händer, så är det kanske inte helt rätt.

Notera att C bara är ett verktyg för att skriva assembler kod... :-) :-)