Hjälp med ett kodexempel.
-
- Inlägg: 37
- Blev medlem: 11 september 2004, 20:46:24
Hjälp med ett kodexempel.
Jag håller på att lära mig koda assembler och hittade sidan AVRbeginners.net genom $tiffs guide..
Hurosmhelst så har jag problem med ett kodexempel de tilandahåller.
http://www.avrbeginners.net/getting_sta ... r_2_2.html
Dels så undrar jag vad branch komanndona gör.. fattar inte rikigt det. Förgrenar sig? hur?
Sedan så förstår jag övurhuvudtaget inte delay_loop:en varför gör man en loop som tar 0,5 sek att exekrevera? Jo jag fattar för att man inte vill att lysdioden skall blinka så så snabbt som mikrocontrollern bara klarar av, men hur blir det om jag vill ha 2 eller fler lampor som blinkar samtidigt? Då är ju alla resurser upptagna i 0,5 sekunder och sen igen i 0,5 sekunder.. osv..
Hoppas ni förstod. har kliat mig i huvudet bra länge.
Hurosmhelst så har jag problem med ett kodexempel de tilandahåller.
http://www.avrbeginners.net/getting_sta ... r_2_2.html
Dels så undrar jag vad branch komanndona gör.. fattar inte rikigt det. Förgrenar sig? hur?
Sedan så förstår jag övurhuvudtaget inte delay_loop:en varför gör man en loop som tar 0,5 sek att exekrevera? Jo jag fattar för att man inte vill att lysdioden skall blinka så så snabbt som mikrocontrollern bara klarar av, men hur blir det om jag vill ha 2 eller fler lampor som blinkar samtidigt? Då är ju alla resurser upptagna i 0,5 sekunder och sen igen i 0,5 sekunder.. osv..
Hoppas ni förstod. har kliat mig i huvudet bra länge.
Branch kommandot hoppar till en Label i koden om vissa kriterier uppfylls, t.ex brne är ju branch if not equal.
är inte helt haj i avr-asm så kan inte exakt säga vilka variabler den kolla på i koden.
Delay-loopen gör somsagt en pause i koden och uppehåller avr:en
vill man att flera lampor ska blinka samtidigt så är det ju bara att tända de innan man hoppar in i delay-loopen.
vill man att de ska tändas under tiden som delay-loopen går får man typ göra den bara hälften så lång och först köra den en gång och sen tända nästa och köra den igen.
hoppas detta hjälpte lite.
är inte helt haj i avr-asm så kan inte exakt säga vilka variabler den kolla på i koden.
Delay-loopen gör somsagt en pause i koden och uppehåller avr:en
vill man att flera lampor ska blinka samtidigt så är det ju bara att tända de innan man hoppar in i delay-loopen.
vill man att de ska tändas under tiden som delay-loopen går får man typ göra den bara hälften så lång och först köra den en gång och sen tända nästa och köra den igen.
hoppas detta hjälpte lite.
-
- Inlägg: 37
- Blev medlem: 11 september 2004, 20:46:24
-
- Inlägg: 37
- Blev medlem: 11 september 2004, 20:46:24
Kul att se att du satsar på att lära dig AVR från grunden. AVR Instruction Set är svår att klara sig utan när man kodar Asm.
Sen om man ska ha långa delays så bör du kolla på timers istället. Fast var beredd på att det kommer uppstå många frågetecken, för timers är lite krångliga att sätta sig in i. Särskilt eftersom timers går att ställa in på så många olika sätt.
Sen om man ska ha långa delays så bör du kolla på timers istället. Fast var beredd på att det kommer uppstå många frågetecken, för timers är lite krångliga att sätta sig in i. Särskilt eftersom timers går att ställa in på så många olika sätt.
-
- Inlägg: 37
- Blev medlem: 11 september 2004, 20:46:24
Aha.. Så Branch skall jag använda när jag inte behåver hoppa så långt och jump när det längre emellan? Kollade in instructionset, alla branch kommandona tog ju en klockcykel eller vad det var.
Ang. att jag lär mig från grunden såg jag för mycket krångel i att hålla på med C då jag läste att man behövde hålla koll på makefiles och sådant själv om man använder CCG.. Och de andra andra två alternativen de tog upp på avrfreaks.net var svindyra. Och den ena saknade utvecklingsmiljö.
Verkade helt enkelt smidigast att bara börja med assembler, trots att man hört så mycket om att det skall vara omöjligt.
ang. Registren, kollade som sagt i databladet till ATMEGA8515(L), jag förstod ingenting. Men det såg ut som någon sorts minne iomed alla adresser? hex siffrona då.. krypiskt.
Ang. att jag lär mig från grunden såg jag för mycket krångel i att hålla på med C då jag läste att man behövde hålla koll på makefiles och sådant själv om man använder CCG.. Och de andra andra två alternativen de tog upp på avrfreaks.net var svindyra. Och den ena saknade utvecklingsmiljö.
Verkade helt enkelt smidigast att bara börja med assembler, trots att man hört så mycket om att det skall vara omöjligt.
ang. Registren, kollade som sagt i databladet till ATMEGA8515(L), jag förstod ingenting. Men det såg ut som någon sorts minne iomed alla adresser? hex siffrona då.. krypiskt.
Branch gör någon slags jämförelse. Om jämförelsen är sann hoppar den dit du har angett. Det tar totalt 2 cykler. Om jämförelsen däremot är falsk hoppar den inte, utan går till nästa asm-instruktion i filen. Det tar då bara 1 cykel. Behöver du göra längre hopp får du lösa det med en Branch- eller Skip-instruktion tillsammans med RJMP eller JMP, eller någon CALL-instruktion beroende på vad du vill göra.
Kör du Windows? Prova att lägga in den senaste versionen av WinAVR (innehåller avr-gcc-kompilatorn). Jag tror inte att man behöver hålla på med Makefile:s med det längre.
Det är inte fel att börja med Asm. Då lär du dig verkligen hur allting fungerar. Sen när du behärskar AVR:en så kan du skippa Asm:en helt njuta av det smidiga språket C.
När det gäller registrena, vad är det du vill åstakomma?
Kör du Windows? Prova att lägga in den senaste versionen av WinAVR (innehåller avr-gcc-kompilatorn). Jag tror inte att man behöver hålla på med Makefile:s med det längre.
Det är inte fel att börja med Asm. Då lär du dig verkligen hur allting fungerar. Sen när du behärskar AVR:en så kan du skippa Asm:en helt njuta av det smidiga språket C.

När det gäller registrena, vad är det du vill åstakomma?
Att branch gör jämförelser och hoppar beroende på denna jämförelse är inte den fulla sanning, branch är ett relativt hopp (hoppa x steg fram/tillbaka) och finns som conditional branch och unconditional branch, alltså obetingat och betingat hopp.
Bäst kan det förstås såhär: (pseudokod)
OM X >= Y branch till STÖRREÄNELLERLIKAMED ; hoppa om sant
; Gör en grej här om X < Y, alltså är förra statement inte sant
branch AVSLUTAVALET ; hoppa till det LABEL
STÖRREÄNELLERLIKAMED: ; <- är ett LABEL
; gör något annat här
AVSLUTAVALET: ; <- Är ett LABEL
; Här kör vi vidare som om inget hade hänt
Alltså kan branch vara ytterst effektivt till kortare hopp men det är inte alltid betingad, alltså testar ett villkor.
Bäst kan det förstås såhär: (pseudokod)
OM X >= Y branch till STÖRREÄNELLERLIKAMED ; hoppa om sant
; Gör en grej här om X < Y, alltså är förra statement inte sant
branch AVSLUTAVALET ; hoppa till det LABEL
STÖRREÄNELLERLIKAMED: ; <- är ett LABEL
; gör något annat här
AVSLUTAVALET: ; <- Är ett LABEL
; Här kör vi vidare som om inget hade hänt
Alltså kan branch vara ytterst effektivt till kortare hopp men det är inte alltid betingad, alltså testar ett villkor.
-
- Inlägg: 37
- Blev medlem: 11 september 2004, 20:46:24
I AVR-asm använder man bara branch när man vill jämföra och hoppa (conditional branch?). Vill man hoppa använder man RJMP (relativt) eller JMP (hela minnet). Typ så här om man ska översätta din kod,Icecap skrev:Att branch gör jämförelser och hoppar beroende på denna jämförelse är inte den fulla sanning, branch är ett relativt hopp (hoppa x steg fram/tillbaka) och finns som conditional branch och unconditional branch, alltså obetingat och betingat hopp.
Bäst kan det förstås såhär: (pseudokod)
OM X >= Y branch till STÖRREÄNELLERLIKAMED ; hoppa om sant
; Gör en grej här om X < Y, alltså är förra statement inte sant
branch AVSLUTAVALET ; hoppa till det LABEL
STÖRREÄNELLERLIKAMED: ; <- är ett LABEL
; gör något annat här
AVSLUTAVALET: ; <- Är ett LABEL
; Här kör vi vidare som om inget hade hänt
Alltså kan branch vara ytterst effektivt till kortare hopp men det är inte alltid betingad, alltså testar ett villkor.
cp r11, r12 ;Jämför registret r11 med r12
brge STÖRREÄNELLERLIKAMED ;Hoppar till STÖRREÄNELLERLIKAMED om jämförelsen indikerar att r11 >= r12
rjmp AVSLUTAVALET ;Hoppar till AVSLUTAVALET
STÖRREÄNELLERLIKAMED: ;label
; gör något annat här
AVSLUTAVALET: ;label
; Här kör vi vidare som om inget hade hänt
Rätta mig gärna någon om jag har fel. Är inte så haj på Asm.
DonPulpito: Register används till _allt_! Om man vill ändra statusen på en i/o-pinne så gör man det genom att ändra rätt bit i rätt register. Vill man ställa in hur UART:en ska fungera gör man det i några andra register. Allt AVR:en kan göra styrs genom register. De första registrena man brukar vilja kolla på är DDRn, PORTn och PINn (där n är någon port, t ex B). Dessa används till att ändra i/o-pinnarna och läsa från dessa.
Branches fungerar lite olika beroende på proccessor. PIC 16F628 t.ex. kan bara "brancha" över 1 instruktion frammåt. Där måste man ha ett jmp kommando om det krävs mer än en instruktion för villkoret. AVR (enligt föregående länk/datablad) kan brancha 64 instruktioner frammåt och 63 bakåt.
Där kan du alltså slänga in 63 instruktionsord efter branch-kommandot
Där kan du alltså slänga in 63 instruktionsord efter branch-kommandot
Kod: Markera allt
cp r11,r12
brge STÖRREELLERLIKAMED
MINDREÄN:
; Kod som inte får vara mer än 62 instruktionsord
; kan köras direkt efter brge kommandot
STÖRREELLERLIKAMED:
;
Väldigt sant. Så har jag gjort.cykze skrev:Det är inte fel att börja med Asm. Då lär du dig verkligen hur allting fungerar. Sen när du behärskar AVR:en så kan du skippa Asm:en helt njuta av det smidiga språket C.
Återigen, trådskaparen, "Programming and customizing the AVR microcontroller" av Dhananjay V. Gadre. Den innehåller register, hur man använder olika saker t.ex. timers och interrupts bland annat. Det medföljer även en skiva med kodexempel i både C och ASM.
Jag låter som en jävla reklamfilm, men den boken är faktiskt bra.