ASM för svårt för mig...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> > "C med Inline Assembler is "the thing"."

> "Har du någon download länk för det?"

Finns ingen.

Inline asm är en del av i princip vilken C kompilator som helst,
det är ingen "produkt" eller "kit" som man laddar ner separat...
Användarvisningsbild
PacMan
Inlägg: 94
Blev medlem: 3 oktober 2005, 16:12:24
Kontakt:

Inlägg av PacMan »

Jag väcker liv i den här tråden för en liknande fråga.
Jag har knåpat lite i MPLAB nu och har lite hum om hur jag lägger det jag vill i ett visst register osv. Dock blir jag inte klok på hur I/O-pinnarna funkar. Jag hajar att jag måste välja kommunikationsriktning i TRISA och sedan styra portarna med PORTA, men jag får inte något av dessa register att "gå med på" mina ändringar. Jag borde la kunna t.ex. kunna sätta TRISA till 00000000 om jag vill? Den verkar inte påverkas tycker jag. Är det nån klassisk fälla jag har hamnat i, eller har ni några tips på vad jag har missat? TRISA verkar vilja vara 3F vad jag än gör med den.

Jag tyckte det var lite tunnt med branch-instruktioner för PIC föresten. Hur brukar man göra om man t.ex. vill hoppa till <label> om W=0?
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

du kanske inte valt rätt BANK ?
Användarvisningsbild
PacMan
Inlägg: 94
Blev medlem: 3 oktober 2005, 16:12:24
Kontakt:

Inlägg av PacMan »

Hmm, det har du nog rätt i faktiskt. Om jag ska använda "Special Function Registers" i t.ex. Bank1, så måste jag alltså ange det i STATUS-registret, stämmer det?

Tycker att kompilatorn borde protestera när jag försöker skriva till ett register i en annan bank än den som är vald, men det kanske inte funkar så...?

Får bli lite mer läsning om detta, men nu är det sovdags.
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Jag har för mig att PORT och TRIS ligger på samma adresser men på olika "minnesbanker", så om du inte ändrat det så hamnar det i PORT. Kompilatorn klagar inte, för det är ingen kompilator, det är en assemblator, den gör som den är tillsagd :) men visst, den kanske kunde ha varnat...
Användarvisningsbild
PacMan
Inlägg: 94
Blev medlem: 3 oktober 2005, 16:12:24
Kontakt:

Inlägg av PacMan »

Nu när jag kollar på det igen så ser jag att ASSEMBLATORN ( :)) faktiskt ger ett meddelande om det, men det blir inget error.

"Register in operand not in bank 0. Ensure that bank bits are correct."


En annan fråga nu när jag ändå är igång:
Kan nån tala om exakt vad denna raden gör?

status_temp RES 1

[/u]
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

För det första...

Det är omöjligt att säga något vettigt om du håller inne med din kod. Du får lätta lite på dimmorna och visa vad du håller på med.

Pacman> Hur brukar man göra om man t.ex. vill hoppa till <label> om W=0?

Har du kollat BTFSC/BTFSS ?

På något sätt måste W ha blivit = h'00', och antagligen sattes W flaggan då, och i så fall (mycket gissningar här, men det blir det utan kod exempel), så blir det något i stil med :

Kod: Markera allt

   movf   reg1, w
   btfsc   status,w
   goto   <label>
   <fortsätt med något annat...>
Angeånde bank-bitarna (RP0/RP1):

Pacman> så måste jag alltså ange det i STATUS-registret, stämmer det?

Du behöver läsa igenom manualen till MPASM (33014h). Kolla speciellt BANKSEL (sidan 60). Och sidan om "Data Memory Organization" i databladet.

Pacman> Tycker att kompilatorn borde protestera när jag försöker skriva till ett register i en annan bank än den som är vald,
strombom> ...men visst, den kanske kunde ha varnat...

Den (MPASM) kan inte veta det, så det går inte...

Pacman> ...faktiskt ger ett meddelande om det, men det blir inget error. "Register in operand not in bank 0. Ensure that bank bits are correct.".

Rätt, det är en *varning*, därför att MPASM inte kan vara säker på att det är ett *fel* . Det är en uppmaning till dig att kolla att RP-bitarna är korrekt satta (enklast är alltså att använda BANKSEL direktivet).

Sen är det en annan sak att man ju kan göra motsatt fel, ha bankbitarna satta till någon annan bank en bank0, och försöka accessa en FSR i bank0, men då får man inngen varning... :-)
Användarvisningsbild
PacMan
Inlägg: 94
Blev medlem: 3 oktober 2005, 16:12:24
Kontakt:

Inlägg av PacMan »

Tack för ditt utförliga svar! :)
Vi kan väl säga att det är nåt som känns lite jobbigt med att slänga upp min allra första PIC-kod här så att alla kan läsa, men du har la rätt antar jag. :roll:

Jepp, btfsc har jag kollat på och ditt lilla kodexempel bekräftade mina "misstankar" så att säga.

Ska föresten läsa på lite om bankerna i helgen, så får vi se om jag fattar nåt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jo, "skip" instruktionerna är lite "bakvända" innan man har vant sig.
Notera också att PIC18 serien har en betydligt bättre uppsättning instruktioner för branch/skip. Mitt lilla kodexempel skulle t.ex se ut så här på en PIC18 :

Kod: Markera allt

   movf   reg1, w
   bz     w_is_zero ; BZ = "Branch if zero"
   <fortsätt med något annat om W != 0>

w_is_zero
   <fortsätt här om W = 0>
Det finns 8 st "Branch if..." instruktioner i PIC18 serien, förrutom de vanliga BTFSC/BTFSS.

"Branch if..." instruktionerna hoppar +/- 127 program words.
"Branch" (utan vilkor) hoppar +/- 1023 program words.
"GOTO" hoppas direkt över hela program minnet.
Skriv svar