Sida 1 av 2
Hjälp med ett kodexempel.
Postat: 24 december 2005, 00:58:02
av DonPulpito
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.
Postat: 24 december 2005, 01:48:37
av mullemeck
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.
Postat: 24 december 2005, 02:10:03
av DonPulpito
Aha! Då förstår jag lite mer
Jag funderade med på att korta ned pausen och lägga in fler lampor som skall blinka.. och sedan köra delay igen.
Någon som vet något bra ställe som förklarar hur registren fungerar och används på ett utrföligt och lättförståeligt vis?
Postat: 24 december 2005, 02:18:43
av jack
Databladet?

Läser man igenom sakerna några gånger så brukar man till slut förstå. Finns nog säkert fina tabeller över registren också.
Postat: 24 december 2005, 02:32:25
av DonPulpito
Åh.. Det tänkte jag inte på..
Borde man ju gjort efterssom man igår satt och undrade "hyr fan I/O pinnarna är addreserade" och hittade nödvändig information i databladet.
Tack för all hjälp hittils i alla fall

Postat: 24 december 2005, 09:12:42
av Icecap
"branch"-hopp är oftast kortare hopp, "jump" brukar vara längre hopp, detta beror lite på valda processor men ofta kan man branch'a snabbare (färre bytes) än man kan jump'a (fler bytes). Men effekten blir det samma, den hoppar till ett nytt ställe i koden.
Postat: 24 december 2005, 11:03:54
av PaNiC
Jag kan rekommendera boken "Programming and customizing the AVR microcontroller". Väldigt bra att ha när man har kommit en liten bit, men även senare som referens.
Postat: 24 december 2005, 13:12:39
av cykze
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.
Postat: 24 december 2005, 13:21:57
av DonPulpito
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.
Postat: 24 december 2005, 13:54:29
av cykze
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?
Postat: 24 december 2005, 14:44:48
av Icecap
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.
Postat: 24 december 2005, 15:15:47
av DonPulpito
Tack för alla svar! Uppskattar verkligen eran hjälp alltså!
>När det gäller registrena, vad är det du vill åstakomma?
Tja, bra fråga.. Mest av allt undrar jag vad det är för något...
Och hur de fungerar och vad de används till.. Vet ni någon bra källa till detta?
Postat: 24 december 2005, 18:41:36
av cykze
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.
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,
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.
Postat: 24 december 2005, 22:11:32
av Kaggen
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
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:
;
Postat: 25 december 2005, 00:39:52
av PaNiC
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.

Väldigt sant. Så har jag gjort.
Å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.