- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 7 von 7

Thema: Hilfe bei Script Übersetzung Bootloader (Assembler)

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36

    Hilfe bei Script Übersetzung Bootloader (Assembler)

    Anzeige

    Praxistest und DIY Projekte
    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:

    Code:
    	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 ?
    Code:
    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:
    Code:
                    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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36

    Schade das sich noch keiner gemeldet hat

    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.

  3. #3
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    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.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    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
    Code:
    ldi 	temp1,  (1<<ADCH)
    	out   ADMUX, temp1
    oder
    Code:
    ldi 	temp1, 0x05
    	out   ADMUX, temp1
    schreibe[/code]

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    nein.
    ich weiss zwar nicht mit welcher zahl ADCH definiert ist, aber es kann nur
    0x01
    0x02
    0x04
    0x08
    0x10
    0x20
    0x40
    0x80
    bedeuten.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    Aso 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 ?

  7. #7
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    ich gtippe darauf dass es was mit einem überlauf zu tun hat.. wobei das carry ja schon mitgenommen wurde,,, 0o
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress