PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei Script Übersetzung Bootloader (Assembler)



albi1989
07.02.2008, 19:03
Ich versuche grade einen Bootloader selber zu schreiben für den Atmega16 als Hilfe habe ich mir einen BL für den Atmega8 besorgt um mir quasi alles anzugucken und zu lernen wie es geht
http://home.planet.nl/~winko001/ <== da habe ich den her
Folgende Sachen versteh ich net/ net so ganz:



ldi temp1, 0x01 //interruptvektoren-tabelle
out IO_REG(GICR), temp1 // ins boot loader flash verschieben
ldi temp1, 0x02
out IO_REG(GICR), temp1


Hier werden denke ich mal der die Interrupts Init. aber warum 0x01
ich kenn wohl zb. 0b010101000 um ein bitMuster ins Register zu laden
Könnte Hex sein aber warum dann zweimal rein laden???
Ach ja
IO_REG ist:
#define IO_REG(n) _SFR_IO_ADDR(n)

So dann wird in dem Bootlaoder ein Spannungstest durchgeführt
in dem auf den high wert der r1 hinzugefügt wird Carry wert da das mit adc passiert so nun die Frage was ist das für ein Register und was ist da drin ?


batt_loop:
sbic IO_REG(ADCSRA), ADSC
rjmp batt_loop
in temp1, IO_REG(ADCL)
in INT_REG_H, IO_REG(ADCH)
clr INT_REG_L
add INT_REG_L, temp1
adc INT_REG_H, r1
subi INT_REG_L, lo8(BATT_MIN)
sbci INT_REG_H, hi8(BATT_MIN)
brcc batt_ok


So letzte Frage:


ldi ZL, lo8(__vectors)// adresse bootloader-start
ldi ZH, hi8(__vectors)
ijmp // indirect jump zum programmstart



Z= Zeiger für den ijmp aber wo find ichd ie defs. für lo8 hi8 oder __vectors

Danke an all die freundlichen und netten Menschen die mir hoffentlich helfen werden

MFG
Der Albi

albi1989
09.02.2008, 13:53
Schade das noch keiner eine Antwort reingeschrieben hat naja mir sind da dann letztens ein paar Erkenntnisse gekommen also ich geh mal dvon aus das in C der datentyp Char 16bit hat also aus 2 register besteht dann denk ich ist lo8 und hi8 nur einmal die untersten 8 und die obersten 8 bit aus diesen zusammen gefassten. Aber das ist doch immer noch kein typischer asm. befehl ?

Dann bin ich mir auch ziemlich sicher das 0x01 <== das das ein Hex wert ist naja und damit erklärt sich dann meine erste Frage von selbst.
Naja nur ich versteh noch nicht warum er da IO_REG(GICR) hingeschreiben hat reicht nicht eig auch einfach nur GICR ?

dann komtm noche in frage hinzu in den Globalen C variablen hat er da rein geschrieben
volatile unsigned char flash_buffer[SPM_PAGESIZE]
woher komtm der Befehl SPM_PAGESIZE ???


Sooo aber bei den Rest bin ich noch net weiter.

damaltor
09.02.2008, 15:22
char hat 8 bit.

0x01 -> hexwert
1 -> dezimalwert
01 -> oktogonalwert (nur durch die führende null gekennzeichnet!!!)
0b00000001 -> binärwert, aber nicht von allen compilern unterstützt

IO_REG() ist ein fragment aus "früheren" zeiten der compiler. das musst du mittlerweile nicht mehr machen.

SPM sit der programmspeicher. er kann nur in datenblöcken ("pages") beschrieben werden. die größe einer solchen page ist nicht zwingend bei allen prozessoren gleich, aber ihre größe ist in "SPM_PAGESIZE" hinterlegt.
so wird sichergestellt, dass die varibale "char flash_buffer" genau "SPM_PAGESIZE" chars hat und damit die richtige größe hat.
in der variable sind dann also SPM_PAGESIZE * 8 bit gespeichert.

albi1989
14.02.2008, 14:23
Danke hmm wäre da aber nioch die frage wo SPM_PAGESIZE
definiert wurde ?

EDIT: hab es gefundne in der iom16.h ist 128

so dann aber noch ne Frage is es das selbe wenn ich


ldi temp1, (1<<ADCH)
out ADMUX, temp1

oder


ldi temp1, 0x05
out ADMUX, temp1

schreibe[/code]

damaltor
14.02.2008, 19:37
nein.
ich weiss zwar nicht mit welcher zahl ADCH definiert ist, aber es kann nur
0x01
0x02
0x04
0x08
0x10
0x20
0x40
0x80
bedeuten.

albi1989
15.02.2008, 07:54
Aso :D ja ist mir nacher auch aufgefallen ich kam nur durcheinander mit den adressen naja ich schreib auch einfach immer zuschnell rein ohne mir gedanken zu machen aber ich denk ich habs nu

also
ldi r16, 0x05
out ADMUX,r16

bedeuted dann das im ADMUX 00000110 gesetzt werden muss ja

also wo ich aber noch nicht weiter komme:
Der ADC wird nun angeschalted auf Interne Voltage von 2.5 iwas.
über die Kanäle MUX1 und MUX2

aber dann

add INT_REG_L, temp1
adc INT_REG_H, r1
subi INT_REG_L, lo8(BATT_MIN)
sbci INT_REG_H, hi8(BATT_MIN)
brcc batt_ok

INT_REG_L und H sind ADCL und ADCH BATT_MIN ist 770 aber wie genau funzt das also was ist in r1 der Register wurde vorher nicht verwendet ?

damaltor
17.02.2008, 12:29
ich gtippe darauf dass es was mit einem überlauf zu tun hat.. wobei das carry ja schon mitgenommen wurde,,, 0o