ATTINY 817 Sleep Mode

OP #4951504
Lesenswert?

Hallo zusammen,

ich versuche mich gerade an einem der neuen ATTINY´s, dem 817.
Leider bekomme den Prozessor nicht mehr aus den Sleep-Mode im PowerDown 
aufgeweckt.

Mal zu meiner HW:
- Taster mit PCINT an PC3
- LED an PC0 (wird geflipt bei PCINT
- LED an PC2 (wird jede sec. geflipt im main)

Mein Code läuft solange ich den Sleep Mode nicht aktiviere.
Leider erweckt mein PCINT an PC3 die CPU nicht aus dem Schlaf.
Da das ganze Coding auf den neuen Tiny´s etwas anders läuft als auf 
meinen bisher gewohnten, habe ich bestimmt etwas übersehen.

Für eure Hilfe bedanke ich mich schon mal.
Hier mein Code:
1
#define F_CPU 3333333UL
2

3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6

7
int main(void)
8
{
9
  PORTC.DIR |= (PIN0_bm);
10
  PORTC.DIR |= (PIN2_bm);
11
  PORTC.PIN3CTRL = 1 << PORT_PULLUPEN_bp | PORT_ISC_FALLING_gc;
12
  SLPCTRL.CTRLA = 1 << SLPCTRL_SEN_bp | SLPCTRL_SMODE_PDOWN_gc; 
13
    
14
  sei();
15
  
16
  //Enter Sleep mode
17
  asm("sleep");
18
  
19
    while (1) 
20
    {
21
    PORTC.OUTTGL = PIN2_bm;
22
    _delay_ms(1000);
23
    }
24
}
25

26
//PORTC INT
27
ISR(PORTC_PORT_vect)
28
{
29
  cli();
30
  PORTC.INTFLAGS = 0xFF;
31
  
32
  PORTC.OUTTGL = PIN0_bm;
33
  sei();
34
  
35
}
#4951663
Lesenswert?

Hi

cli() und sei() sollten in der ISR nicht nur unnötig sein, sondern auch 
gefährlich.
Der ATtiny schaltet beim Sprung in die ISR das I-Flag eh ab, wodurch 
keine weiteren Interrupts auslösen.
Durch Dein sei() am Ende der ISR wird danach (wohl noch vor Ende der 
Funktion) ein eventuell anstehender neuer Interrupt ausgelöst - mit 
'etwas Glück' verheddert sich Dein Code bis zum Stack-Überlauf.

Am Ende der ISR wird das I-Flag automatisch wieder aktiviert (in 
Assembler durch den Befehl reti, statt ret in der 'normalen' Funktion)

MfG
#4951862
Lesenswert?

Stefan G. schrieb:
> Kann man das eventuell über das Event-System umrouten?

Nein. Die synchronen, mit CPU-Clock getakteten Eingänge kann man nicht 
auf asynchron umschalten. Wenn Du die anderen Eingänge benutzen willst, 
mußt Du den Sleep-Mode z.B. auf Idle umstellen, dann läuft die CPU-Clock 
weiter. Er verbraucht dann natürlich auch mehr Strom als im Power-Down.

Patrick J. schrieb:
> Der ATtiny schaltet beim Sprung in die ISR das I-Flag eh ab, wodurch
> keine weiteren Interrupts auslösen.

Nein. Die neuen Tinies tun das nicht. Die haben einen xmega-ähnlichen 
Kern, mit einen xmega-ähnlichen Interruptcontroller.

Seite 108:

Interrupt generation must be globally enabled by writing a '1' to the 
Global Interrupt Enable bit (I) in the CPU Status register (CPU.SREG). 
This bit is not cleared when an interrupt is acknowledged.

Und da sie zwei Interruptprioritäten haben, sollte man das globale 
Interruptflag natürlich nur verändern, wenn man genau weiß, was man tut. 
Der Interruptcontroller sperrt Interrupts gleicher Priorität 
hardwaremäßig.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren