www.mikrocontroller.net

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


Autor: Tom O. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom O. (Gast)
Datum:
Angehängte Dateien:

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

Autor: ral123 (Gast)
Datum:

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

Autor: Tom O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ral123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Tom O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
  // Pin Configuratios ################
  PORTB |= (1 << BUTTON_a); // define pullup on PB3
  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!

Autor: ral123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ral123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, pullup am reset. Den mach ich gleich mal ran.

// Pin Configuratios ################
   
  PORTB = (1 << BUTTON_a); //define pullup BUTTON_a
  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.

Autor: ral123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRB = (1 <<  white_LED) | (1 << ir_LED) | (1<<PB2);

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

Autor: ral123 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Nö, das erledigt die io.h.


Peter

Autor: ral123 (Gast)
Datum:

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

Autor: Tom O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ral123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom O.2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ral123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast den Pullup für den Reset drin? Läuft's?

Autor: Tom O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: ral123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
10k. Aber 4k7 passt schon. Na dann viel Spaß...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.