Ich habe versucht ein Bascom Programm in assembler zu übersetzen, um es im Anschluss zu optimieren. Funktion: Am Int0 hängt ein Rechteckgenerator. Bei jeder positiven Flanke wird ein Bitmuster am PortB ausgegeben und der nächste Wert aus dem EEPROM gelesen. Nach 240 Werten soll wieder von vorne begonnen werden. Aber das Programm tut irgendwie nicht das was es soll. Wo liegt mein Fehler? .include "m644def.inc" .org 0x000 rjmp main ; Reset Handler .org INT0addr rjmp int0_handler ; IRQ0 Handler main: .cseg ;Stackpointer initialisieren ldi r16, low(RAMEND) out SPL, r16 ldi r16, high(RAMEND) out SPH, r16 ;Port B als Ausgang ldi r16, 0xFF out DDRB, r16 ;Interrupt Int0 auf steigende Flanke lds r16,EICRA sbr r16, 1<<ISC01 | 1<<ISC00 sts EICRA, r16 ;Interrupt Int0 einschalten ldi r16, 0x01 out EIMSK, r16 sei ; Interrupts global einschalten ldi ZL,0x00 ; Z-Zeiger laden. Der Einfachheit direkt adressiert ldi ZH,0x00 rcall EEPROM_read ; Aufruf des Unterprogramms Daten aus EEPROM lesen loop: rjmp loop int0_handler: out PORTB, r16 inc ZL cpi ZL,0xF1 brne weiter ldi ZL,0x00 weiter: rcall EEPROM_read ; Aufruf des Unterprogramms Daten aus EEPROM lesen reti EEPROM_read: sbic EECR,EEPE ; prüfe ob der vorherige EEPROMzugriff beendet ist rjmp EEPROM_read ; nein, nochmal prüfen out EEARH, ZH ; Adresse laden EEAR=EEPROM adress register out EEARL, ZL sbi EECR, EERE ; Lesevorgang aktivieren in r16, EEDR ; Daten aus dem EEprom Daten Register ins CPU Register kopieren ret ; Daten im EEPROM definieren .eseg dta1: .db 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 .db 0 , 1 , 0 , 1 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 3 , 3 , 3 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 .db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 1 , 1 , 1 , 1 , 1
was funktioniert den nicht bzw. in welcher form zeigt sich der fehler? kommt müll raus oder reagiert der AVR gar nicht erst? übrigens ist der erste wert der ausgegeben wird schrott, da dieser nicht aus dem eeprom gelesen wird sondern nach dem ablauf deiner initialisierung in R16 stehengeblieben ist. ich würd das dahingehend ändern, daß die werte zuerst aus dem eeprom gelesen und danach ausgegeben werden.
sehe gerade du lädst R16 noch in der initialisierung mit dem ersten wert. okay, aber ich würds trotzdem ändern. spätestens wenn er AVR irgendwann noch mehr machen soll als EEPROM->PortB gibts probleme damit.
Nur mal kurz ein paar Gedankengänge: 1) Erst die Interrupts enablen und dann danach den Pointer initialisieren? Das sollte in ungedrehter Reihenfolge geschehen! 2) Warum die Tabelle im EEProm speichern? Wird sie während das Programm läuft geändert? Wenn nicht, würde ich die Tabelle im Programmspeicher unterbringen, du sparst dir dann das Unterprogramm für's EEProm lesen und brauchst nur noch ein Befehl (LPM). 3) Du solltest in der Hauptschleife nichts machen und das Lesen und Ausgeben zusammen in den Interrupt legen, in der Initialisierung nur den Z-Pointer auf den ersten Eintrag und dann auf einen Interrupt warten. Gruß, Thomas
1) Stimmt, am besten auch erst nach dem ersten Lesevorgang 2) Ja grundsätzlich sollte das in Zukunft über RS232 nachladbar sein. Ob ich das so lasse, muss ich mir nochmal überlegen. Vielleicht reicht mir auch der Flash-Speicher für die anderen Daten und mach es nicht mehr nachladbar.
hast du die eepromdaten auch in den atmega geladen? afaik macht der das nicht immer automatisch
Ja, EEPROM-Daten habe ich manuell reingeladen und EEPROM File habe ich auch überprüft, ist korrekt.
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.