Forum: Mikrocontroller und Digitale Elektronik Wakeup ATMega16L


von Chris W. (chriswie)


Lesenswert?

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

von Jupp (Gast)


Lesenswert?

> Interrupt Routine hat nur ein RETI.

???

Und was soll er dann ausführen? Die ISR sollte doch schon Code 
enthalten, oder nicht?

von Sepp (Gast)


Lesenswert?

@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.

von Chris W. (chriswie)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

> 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...

von johnny.m (Gast)


Lesenswert?

> 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...

von Chris W. (chriswie)


Lesenswert?

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

von Chris W. (chriswie)


Lesenswert?

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
Noch kein Account? Hier anmelden.