Wakeup ATMega16L

OP #513628
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
OP #514500
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
Gast #514513
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...
Gast #514517
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...
OP #515187
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
OP #515193
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.