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.
Sorry, den ASCII Schaltplan hat es wohl ein bisschen zerschreddert. Hier nochmal ein Screenshot vom Schaltplan.
Der ATTiny13 lässt sich aus dem PowerDown-Modus nur mit einem Level-Interrupt an INT0 wecken. Mit PIN-Change geht das nicht.
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.
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).
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!
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.
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.
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.
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); |
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
|
ral123 schrieb: > Hab grad gesehen das dir dies noch fehlt: > #define PB5 5 Nö, das erledigt die io.h. Peter
Sorry, steht natürlich in der iotn13.h drin ;-) sonst käme ja auch ein Fehler beim Compilieren...
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?
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.
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
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.