Hjälp med ett kodexempel.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DonPulpito
Inlägg: 37
Blev medlem: 11 september 2004, 20:46:24

Hjälp med ett kodexempel.

Inlägg 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.
mullemeck
Inlägg: 1306
Blev medlem: 27 maj 2003, 23:52:06
Ort: Lund
Kontakt:

Inlägg 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.
DonPulpito
Inlägg: 37
Blev medlem: 11 september 2004, 20:46:24

Inlägg 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?
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg 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å.
DonPulpito
Inlägg: 37
Blev medlem: 11 september 2004, 20:46:24

Inlägg av DonPulpito »

Åh.. Det tänkte jag inte på.. :oops:

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 :)
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg 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.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg 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.
DonPulpito
Inlägg: 37
Blev medlem: 11 september 2004, 20:46:24

Inlägg 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.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg 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?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
DonPulpito
Inlägg: 37
Blev medlem: 11 september 2004, 20:46:24

Inlägg 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?
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg 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.
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg 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:
; 
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg 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.
Skriv svar