Guten Abend Ihr werdet mich jetzt sicher auslachen aber ich komme mit folgendem Code nicht ganz klar. Was ich nicht verstehe sind die Zeilen 7-9! Wann erfolgt ein Sprung? CPI vergleicht zl u. 0x60 und setzt die Flags CPC vergleicht zh u. r0 und bezieht Carry Flag mit ein Sprung wenn Zero-Flag =0 also z.b. x und y sind gleich 01 ldi zl, low(ramend) 02 out spl, zl 03 ldi zh, high(ramend) 04 out sph, zh ;if >= Mega8 05 clr r0 06_ini1: st z, r0 ;clear SRAM 07 cpi zl, 0x60 08 cpc zh, r0 09 brne _ini2 10 ldi zl, 30 ;clear register 11_ini2: sbiw zh:zl, 1 12 brne _ini1 Sorry nochmals --> ich steige dda nicht durch.
Das ist eine Routine um den SRAM zu löschen (initialisieren). Unter anderem initialisiert/löscht die auch die Register r0 bis r29 welche sich im sogenannten Register-File von Adresse 0 bis 31 (inkl. zl und zh) befinden. Durch das Prüfen der Adresse 0x60 wird der I/O-Bereich übersprungen und dann auf Adresse 30 - 1 (nachträgliches sbiw = 29) umgeschaltet. Gruß Andi
Funktion: Gesamtes RAM und Register r0-r29 werden gelöscht, abwärts. Die Zeilen 7-10 sorgen dafür, dass der Bereich 30(dez) bis 0x5F übersprungen wird, denn da ist ja die I/O.
Die Routinen kenne ich aus einem Programm von Peter Danneger. Ist wirklich "genial" kurz und einfach und funktioniert prima. ABER. Richtig sauber ist das ganze nur für AVRs ohne extended IO-Bereich (0x60-0xFF). Der würde bei diesen Typen nicht! vom löschen ausgenommen. Um den IO-Bereich bei solchen AVRs komplett rauß zu halten, müsste der Vergleich (Zeile 7-9) "aufgebohrt" werden. Möglicherweise kann man sich aber auch mit dem Löschen der IO-Register arangieren, da die meisten nach einem RESET eh den Wert 0 haben sollten. Jörg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.