Hallo, hab ein kleines Problem, hab nen ATMega16L Batteriebetrieben.. Jetzt fahr ich ihn in den Powerdown Modus, klappt ohne Probleme Int2 hab ich zum Aufwecken, daran hängt der Alarm Ausgang von ner RTC. Kommt ein Alarm, dann wacht er auch auf aber führt mir nicht die Funktionen aus die danach kommen .. so wie´s aussieht macht er einen Reset. Interrupt Flags sind richtig eingestellt, Interrupt Routine hat nur ein RETI. Powerdown Modus Im AVR Simulator hauts auch nicht hin, da springt er nach dem Sleep irgendwo ins Programm, hab nicht nachvollziehen können wohin .. Geht der Simulator eigentlich richtig ???? Grüße, Chris
> Interrupt Routine hat nur ein RETI.
???
Und was soll er dann ausführen? Die ISR sollte doch schon Code
enthalten, oder nicht?
@Jupp: Erst nachdenken, dann schreiben... Natürlich sollte die MCU nach dem IRQ und dem Powerup im Programm da weitermachen, wo sie in den Powerdown geschickt wurde.
Also .. nochmal alles getestet .. im Powerdown springt er nach dem Sleep irgendwo ins programm im Simulator.. und im Prozessor macht er einen Reset .. MAlmStart: cli rcall alarmstellen clr temp1 out TCCR0, Temp1 ldi temp1,0b00001000 out PortB,temp1 ldi temp1, (1<<SM1)|(1<<SE) out MCUCR, temp1 sei sleep ; Geh schlafen nop nop nop ldi temp1,200 STS LCD_Bright,temp1 out OCR0,temp1 ldi Temp1, (1<<com01 | 1<<WGM00 |1<<WGM01 | 1<<CS00) out TCCR0, Temp1 rcall LCD_Clear ldi menu,2 stoppi: rjmp Stoppi Ich sehe eigentlich keinen Fehler .. Hab das ganze mal im Powersave modus probiert, da funktionierts ohne Probleme .. Ich verstehs langsam nicht mehr .. P.S. ist jemanden eigentlich schon mal aufgefallen das die Interrupt Tabelle im Datasheet falsch ist ??? Grüße, Chris
> P.S. ist jemanden eigentlich schon mal aufgefallen das die Interrupt > Tabelle im Datasheet falsch ist ??? Nö, bis jetzt nicht. Was ist denn Deiner Meinung nach falsch? Würde mich schon brennend interessieren, weil ich oft mit dem ATMega16 arbeite. Und zwar bisher ohne Probleme in Sachen Interrupt-Vektor-Tabelle...
> Interrupt Routine hat nur ein RETI. Fiel mir grad noch so auf: Da Du nicht den kompletten Code gepostet hast, kann ich das jetzt nur vermuten, aber bei den AVRs mit mehr als 8 KB Flash (also auch beim ATMega16) sind die Interrupt-Vektoren 2 Wörter lang. Wenn Du da nur jeweils ein reti reinschreibst, dann sind Probleme vorprogrammiert, weil reti nur ein Wort lang ist. Wenn schon, dann an jede Vektoradresse
1 | nop |
2 | reti |
sonst gehts mit großer Wahrscheinlichkeit schief...
johnny.m wrote: >> Interrupt Routine hat nur ein RETI. > Fiel mir grad noch so auf: Da Du nicht den kompletten Code gepostet > hast, kann ich das jetzt nur vermuten, aber bei den AVRs mit mehr als 8 > KB Flash (also auch beim ATMega16) sind die Interrupt-Vektoren 2 Wörter > lang. Wenn Du da nur jeweils ein reti reinschreibst, dann sind Probleme > vorprogrammiert, weil reti nur ein Wort lang ist. Wenn schon, dann an > jede Vektoradresse >
1 | > nop |
2 | > reti |
3 | > |
> sonst gehts mit großer Wahrscheinlichkeit schief...
Also zu Interrupt Problem ..
wenn ich meine Interrupt Tabelle so schreibe dann springt er bei mir
falsch ..
siehe 5. Zeile .. wäre laut Datasheet IRQ2 ..
.CSEG
.org $0000
rjmp init ;Reset Handler
reti ;rjmp EXT_INT0 ; IRQ0 Handler
reti ;rjmp EXT_INT1 ; IRQ1 Handler
reti ;rjmp TIM2_COMP ; Timer2 Compare
reti ;rjmp TIM2_OVF ;Timer2 Overflow Handler
reti ;rjmp TIM1_CAPT ; Timer1 Capture
reti ;rjmp TIM1_COMPA ; Timer1 CompareA
reti ;rjmp TIM1_COMPB ; Timer1 CompareB
jmp TIM2_OVF ;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti ;rjmp TIM0_OVF ; Timer0 Overflow
reti ;rjmp SPI_STC ; SPI Transfer
reti ;rjmp USART_RXC ; USART RX Complete
reti ;rjmp USART_UDRE ; UDR Empty
reti ;rjmp USART_TXC ; USART TX Complete
reti ;rjmp ADC ; ADC Conversion Complete
reti ;rjmp EE_RDY ; EEPROM Ready Handler
reti ;rjmp ANA_COMP ; Analog Comparator
reti ;rjmp TWSI ; Two-wire Serial
reti ;rjmp EXT_INT2 ; IRQ2
reti ;rjmp TIM0_COMP ; Timer0 Compare
reti ;rjmp SPM_RDY ; Store Program
aber ich glaub ich weiss wo jetzt mein Fehler ist ..
2 Wörter ..
muss ich dann so schreiben ?
.CSEG
.org $0000
nop
rjmp init ;Reset Handler
nop
reti ;rjmp EXT_INT0 ; IRQ0 Handler
nop
reti ;rjmp EXT_INT1 ; IRQ1 Handler
nop
reti
...
muss ich gleich mal probieren ..
Grüße, Chris
Danke Jonny !!! Suuuper .. es funktioniert .. :-) Ich dacht mir schon das da irgendwas mit dem Stack nicht funktioniert .. Kommt davon wenn man nur immer mit den kleinen AVR´s programmiert und dann auf nen größeren umsteigt .. aber gut zu wissen .. Vielen dank nochmals .. Grüße, Chris
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.