Forum: Mikrocontroller und Digitale Elektronik ATTINY 817 Sleep Mode


von Stefan G. (lightning86)


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
}

von P. M. (mikro23)


Lesenswert?

Seite 20

2. All pins can be used for external interrupt, where pins Px2 and Px6 
of each port have full asynchronous detection.

Die anderen Pins funktionieren nur, wenn die CPU-Clock läuft, also nicht 
bei Power-Down.

von Stefan G. (lightning86)


Lesenswert?

Na so ein Scheibenkleister... nur gut das man das auf der Seite 92 nicht 
rein schreibt :)

Da meine Leiterplatte schon fertig ist werde ich das Morgen mal mit 
Lackdraht umbasteln und berichte dann.

Nachtrag:
Kann man das eventuell über das Event-System umrouten?

Danke schon mal ;)

: Bearbeitet durch User
von Patrick J. (ho-bit-hun-ter)


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

von P. M. (mikro23)


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.

: Bearbeitet durch User
von Stefan G. (lightning86)


Lesenswert?

So ich habe meinen Taster mit einem Lackdraht auf PinA2 verlegt und es 
Funktioniert perfekt!

Danke für die schnelle Hilfe

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.