Forum: Mikrocontroller und Digitale Elektronik Attiny 13 mit Pin Chnage aufwecken. Problem


von Tom O. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich poste hier zu ersten mal ins Forum, habe aber schon viele hilfreiche 
Tipps bei euch gefunden, mit denen ich meistens alle Probleme lösen 
konnte. Vielen Dank an alle fleißigen Forumschreiber dafür!
Nur leider komme meinem akutuellen Problem nicht auf die Schliche:
Habe einen Tiny13, der eine weiße LED konstant per PWM auf und ab faded. 
Das Faden geschieht in der COMPB-Timer-ISR.
Nach 3 sekunden versetze ich den controller in den Power_Down-Modus. 
(soll später anders realisiert werden. Ist momentan nur zu Testzwecken 
so).
Bis hierhin scheint auch alles zu funktionieren.
Per Pin-Change-Interrupt durch den Taster will ich ihn dann wieder 
aufwecken, was manchmal funktioniert und manchmal in einem Reset 
resultiert! Ich bemerke das daran, dass die LED blinkt und somit die 
LED_flash() funktion aufgerufen wurde.
Kann es sein, dass der Controller durch Schalterprellen mit interrupts 
überladen wird und sich dann irgendwie resettet beim aufwachen? Oder hab 
ich einfach was total dämliches übersehen?

Zur Hardware:
An den Controller sind im Wesentlichen eine weiße LED angeschlossen und 
ein Taster, der standardmäßig geschlossen ist (siehe ASCII Zeichnung am 
Anfang des C-Codes). Die andere Hardware, die im Schaltplan zu sehen ist 
(DIP-resistor array und infrared-led), wird momentan nicht verwendet.
Noch was, falls sich jemand wundert: Der Clock Prescaler und die PWM 
Geschwindigkeit sind so gewählt, weil ich später mit der PWM auch noch 
ein Infrarot Signal erzugen will.

von Tom O. (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, den ASCII Schaltplan hat es wohl ein bisschen zerschreddert.
Hier nochmal ein Screenshot vom Schaltplan.

von ral123 (Gast)


Lesenswert?

Der ATTiny13 lässt sich aus dem PowerDown-Modus nur mit einem 
Level-Interrupt an INT0 wecken. Mit PIN-Change geht das nicht.

von Tom O. (Gast)


Lesenswert?

Laut Datenblatt ist das nicht der Fall:

Pin change Interrupts on PCINT5...0 are detected asynchronously. This 
implies that these interrupts cam be used for waking the part also from 
sleep modes othen than idle mode.

Das aufwecken scheint ja auch zu funktionieren. Aber es gibt oft einen 
reset.

von ral123 (Gast)


Lesenswert?

Ja, du hast recht. Betrifft nur INT0, dort geht's nur mit 
Level-Interrupt.

Zwei Sachen würde ich auf jeden Fall machen. Zum Einen ALLE Pins 
definieren (Direction und Level). Die nicht benötigten Pins als Ausgang.
Zum Anderen den Tastereingang entprellen (zum Test einfach mal ein 
Delay).

von Tom O. (Gast)


Lesenswert?

ral123 schrieb:
> Zum Einen ALLE Pins
> definieren (Direction und Level). Die nicht benötigten Pins als Ausgang.

Das scheint was bewirkt zu haben! Jetzt wird er gerade immer korrekt 
aufgeweckt.
1
  // Pin Configuratios ################
2
  PORTB |= (1 << BUTTON_a); // define pullup on PB3
3
  DDRB = (1 <<  white_LED) | (1 << ir_LED) | (1<<PB4) | (1<<PB0) | (1<<PB2);   // set Pin 0  (IR-LED), Pin 1 (LED) and all unused pins as Output



Folgendes ist allerdings noch seltsam: Wenn ich den alten code (also 
ohne die nicht verwendeten Pins zu definieren) wieder benutze geht es 
trotzdem noch! Das versteh ich nicht. Kann es sein, dass im DDRB 
Register die Werte auch nachdem ich den Chip neu programmiere erhalten 
bleiben?

Vielen Dank schon mal!

von ral123 (Gast)


Lesenswert?

Die PIN-Config stimmt aber noch nicht ganz.

DDRB = (1 <<  white_LED) | (1 << ir_LED) | (1<<PB2) | (0<<BUTTON_a) | 
(1<<PB4);

Der Button-Pin sollte als Eingang definiert sein. Den Pullup hast du ja 
richtig zugeschalten.
PB0 hast du doppelt definiert. Den PB5-Reset halte ich immer per Pullup 
hardwaremäßig auf VCC.

von ral123 (Gast)


Lesenswert?

Zu PB4 --> Du schreibst du verwendest den DIP momentan nicht. Wenn PB4 
hardwareseitig offen ist dann als Ausgang definieren. Sollte die 
Beschaltung vorhanden sein, dann als Eingang.

von Tom O. (Gast)


Lesenswert?

Ah, pullup am reset. Den mach ich gleich mal ran.
1
// Pin Configuratios ################
2
   
3
  PORTB = (1 << BUTTON_a); //define pullup BUTTON_a
4
  DDRB = (1 <<  white_LED) | (1 << ir_LED) | (1 << PB2);   // set Pin 0  (IR-LED), Pin 1 (LED) and all unused pins as Output

Der DIP hängt dran. Ich hab zur übersicht den Codeteil rausgenommen, der 
den Analogwert, der sich durch das Widerstandsnetzwerk ergibt, einliest. 
So wie es jetzt ist müsste er über den 470Ohm an masse liegen, da alle 
DIPs offen sind. Somit ist der Pegel definiert. Hab ihn jetzt auch als 
Eingang definiert.
Komischerweise tritt jetzt das Problem wieder auf. Wohl doch zu früh 
gefreut.

von ral123 (Gast)


Lesenswert?

1
DDRB = (1 <<  white_LED) | (1 << ir_LED) | (1<<PB2);

Warum definierst du den Button_a und PB4 nicht?
1
DDRB = (1 <<  white_LED) | (1 << ir_LED) | (1<<PB2) | (0<<BUTTON_a) |
2
(0<<PB4);

von ral123 (Gast)


Lesenswert?

Hab grad gesehen das dir dies noch fehlt:
1
#define PB5     5
2
#define PB4     4
3
#define PB3     3
4
#define PB2     2
5
#define PB1     1
6
#define PB0     0

von Peter D. (peda)


Lesenswert?

ral123 schrieb:
> Hab grad gesehen das dir dies noch fehlt:
> #define PB5     5

Nö, das erledigt die io.h.


Peter

von ral123 (Gast)


Lesenswert?

Sorry, steht natürlich in der iotn13.h drin ;-) sonst käme ja auch ein 
Fehler beim Compilieren...

von Tom O. (Gast)


Lesenswert?

Das versteh ich nicht. Was bedeutet denn (0 << PB4)?

Mit der Zeile:

DDRB = (1 <<  white_LED) | (1 << ir_LED) | (1 << PB2);

definiere ich ja auch automatisch alle Pin Richtungen. Das entspricht:

DDRB = 0x07;

ist ja nur eine andere Schriebweise. Und damit ist doch alles definiert, 
oder?

von ral123 (Gast)


Lesenswert?

Ja das stimmt. Ich finde es so übersichtlicher und man vergisst so 
weniger.

Deine Kommentarzeile stimmt aber nicht dazu:

// set Pin 0  (IR-LED), Pin 1 (LED) and all unused pins as Output

Die anderen Pins werden als Eingänge (0) definiert.

von Tom O. (Gast)


Lesenswert?

ral123 schrieb:
> Deine Kommentarzeile stimmt aber nicht dazu:
>
> // set Pin 0  (IR-LED), Pin 1 (LED) and all unused pins as Output

Ok. Stimmt.

// define pin 0 (IR-LED), Pin 1 (LED) and PB2 (unused) as outputs, all 
other pins are inputs

von Tom O.2 (Gast)


Lesenswert?

ral123 schrieb:
> Deine Kommentarzeile stimmt aber nicht dazu:
>
> // set Pin 0  (IR-LED), Pin 1 (LED) and all unused pins as Output

Ok. Stimmt.

// define pin 0 (IR-LED), Pin 1 (LED) and PB2 (unused) as outputs, all 
other pins are inputs

von ral123 (Gast)


Lesenswert?

Hast den Pullup für den Reset drin? Läuft's?

von Tom O. (Gast)


Lesenswert?

Scheint was gebracht zu haben! Was nimmst du normalerweise für einem 
Wert? Hatte einen 4.7 KOhm rumfliegen und hab den drangemacht (Reset --> 
Vcc). Ein größerer würde ja wahrscheinlich auch reichen.

Vielen Dank schon mal, ral123!

von ral123 (Gast)


Lesenswert?

10k. Aber 4k7 passt schon. Na dann viel Spaß...

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.