Attiny 13 mit Pin Chnage aufwecken. Problem

Gast #2093702
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.
Angehängte Dateien:
Gast #2093771
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.
Gast #2093788
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).
Gast #2093810
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!
Gast #2093837
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.
Gast #2093844
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.
Gast #2093874
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.
Gast #2093891
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);
Gast #2093927
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?
Gast #2093939
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.
Gast #2093963
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
Gast #2093965
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
Gast #2094003
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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 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.