Hallo, ich habe gerade den Watchdog aktiviert und dabei den Fehler gemacht dass nach 270ms ein Timeout kommt. Nach dieser Anweisung kommt delay_ms(300), der uC hat sich also beim Booten immer wieder resettet. Jetzt hatte ich aber schon vor längerem eine blinkende LED für den Reset-Fall eingeplant. Bei "ISR (RESET_vect)" kam die Meldung mit "mispelled signal handler". Also bin ich beim suchen darauf gestoßen: /* Interrupt vectors */ /* Interrupt vector 0 is the reset vector. */ /* External Interrupt 0 */ #define INT0_vect _VECTOR(1) #define SIG_INTERRUPT0 _VECTOR(1) Verstehe ich das richtig dass der INT0 der Reset-Vektor für den Watchdog ist? Oder wäre der nicht definierte "_VECTOR(0)" der Reset-Vektor? Soll ich alternativ einfach an den Anfang der main den Code für das blinkende Lämpchen setzen? Denn folgendes: ISR(INT0_vect) //INT0 soll der RESET vector sein?! { //Lampe blinken lassen: DDRA |= (1<<DDA2); PORTA |= (1<<PA2); _delay_ms(200); PORTA &= ~(1<<PA2); //wieder aus _delay_ms(200); DDRA &= ~(1<<DDA2); //Wieder als Eingang falls man das Ding noch braucht } klappt nicht. Gruß, Sascha
Der Reset-Vektor liegt an der Speicherstelle '0', das ist damit gemeint. INT0 ist ein anderer Vektor, den du mittels eines Pins auslösen kannst. Der Reset-Vektor ist dort im Header nicht definiert. Das liegt einfach daran, dass der Startup-Code ihn automatisch auf den Anfang der main()-Funktion leitet. Du brauchst also garkeinen Interrupthandler zu schreiben.
Dass es immer Speicherstelle 0 ist, weiss ich schon. JMP 0 würde dann den "Reset" auslösen. Rein Interessehalber: Wenn die main-Methode im Prinzip der Resethandler ist, wie erkenne ich dann einen Watchdogreset? Wird da ein Flag gesetzt das ich wieder zurücksetzen muss?
Sascha schrieb: > Rein Interessehalber: Wenn die main-Methode im Prinzip der Resethandler > ist, wie erkenne ich dann einen Watchdogreset? Wird da ein Flag gesetzt > das ich wieder zurücksetzen muss? Datenblatt Seite 36.
Ah danke. Ist das erste Mal dass ich den WD überhaupt brauche, daher hab ich mich daher noch nicht befasst. Gruß, Sascha
Nur zur Sicherheit, das ist der Anfang meiner Main-Methode: int main() { //Wenn Watchdog-Reset Bit gesetzt ist, Lampe blinken lassen: if (MCUSR & 0x08) { //Lampe blinken lassen: DDRA |= (1<<DDA2); PORTA |= (1<<PA2); _delay_ms(200); PORTA &= ~(1<<PA2); //wieder aus _delay_ms(200); DDRA &= ~(1<<DDA2); //Wieder als Eingang falls man das Ding noch braucht //WDFlag zurücksetzen: MCUSR &= ~(1<<WDRF); } Irgendwelche erkennbaren Fehler? Gruß, Sascha
Naja, da fehlt der Code, der den Watchdog einschaltet. Und jetzt kommts: Wenn der Watchdog auslöst, bleibt er weiterhin eingeschaltet! Dass heisst, deine Routine, die die Lampe blinken lässt, würde wiederum durch den Watchdog unterbrochen werden. Darum schalte als allererstes zu Programmbeginn den Watchdog ab, lasse dann die Lampe blinken und schalte dann den Watchdog wieder ein. JMP 0 ist übrigens nicht mit einem RESET identisch, denn ein JMP Befehl setzt die Hardware (z.B. die Timer und die I/O Schnittstellen) nicht zurück. Ein Reset tut das aber. Nur der Watchdog selbst wird durch den Watchdog-Reset nicht zurück gesetzt, was ein kleiner Fallstrick ist.
Der Teil der den Watchdog einschaltet kommt ein Stück weiter unten wo auch die Timer initialisiert werden. Timeout etwa 0,53s laut Prescaler-Tabelle im Datenblatt. Mal der gesamte Code: http://nopaste.info/c7f8eee1bf.html Eben hab ich nochmal die Schaltung ausprobiert, ich bekomme eine PWM mit dem richtigen Duty Cycle. Mit ungefähr 2Hz (500ms, Nachtigall ick hör dir trapsen) schaltet sich dieses Signal aber ab. Da ich einen invertierenden Gatetreiber für einen Sperrwandler habe, fließt daraufhin ein zu hoher Strom und das Schaltnetzteil juckelt bei etwa 700mA und blinkender Betriebs-LED herum (Strombegrenzung). Ich habe jetzt mal bei den etwas längeren _delay_ms(200) noch strategische asm volatile("wdr"); eingestreut. Gruß, Sascha
Aktuelle Version mit WD-Abschaltung etc: http://nopaste.info/06a0c0a104.html Werde ich im Laufe des Tages dann mal ausprobieren. Vielen Dank schonmal für alle Tips die ich bekommen habe.
Sascha schrieb: > Der Teil der den Watchdog einschaltet kommt ein Stück weiter unten wo > auch die Timer initialisiert werden. Timeout etwa 0,53s laut > Prescaler-Tabelle im Datenblatt. > ... > Ich habe jetzt mal bei den etwas längeren _delay_ms(200) noch > strategische asm volatile("wdr"); eingestreut. Das wird nicht funktionieren. Denn da der Default-Inhalt der WDP-Bits 0 ist, läuft der Watchdog nach einem Reset nicht etwa mit der ursprünglich eingestellten Zeit, sondern mit der kürzest möglichen.
Ja das habe ich schon vermutet da ja die Hardware durch den Reset auf den 0-Zustand zurückgesetzt wird. Also 17ms WD-Timeout. Aber ich schalte ja mit asm volatile("wdr"); //Zuerst Watchdog abschalten: WDTCR |= (1<<WDE) | (1<<WDCE); WDTCR &= ~(1<<WDE);//Watchdog disable-Prozedur, Datenblatt S. 78 (WDE-Bit-Referenz) den Watchdog erstmal aus, initialisiere dann alles andere (Timer, ADC usw) und schalte dann den WD erst ganz unten vor der while-Endlosschleife wieder an. Dort steht dann: //Watchdog: WDTCR |= (1<<WDE) | (1<<WDP2)| (0<<WDP1)| (1<<WDP0); //Watchdog enable, ca 0,53s bis Timeout Warum funktioniert das so nicht?
Sascha schrieb: > Aber ich schalte ja mit > ... > den Watchdog erstmal aus Wusste ich nicht, denn davon stand in dem Post nichts.
Dann hast du den von 16:30 nicht gelesen, da hatte ich noch den aktuellen Programmcode bei nopaste hochgeladen.
Sascha schrieb: > Da ich einen invertierenden Gatetreiber für einen Sperrwandler habe, > fließt daraufhin ein zu hoher Strom Deshalb sieht man ja auch einen Pullup bzw. Pulldown vor, der den FET abschaltet, solange der MC in Reset ist. Ansonsten wird z.B. bei einem ISP-Download der FET in den analogen Arbeitspunkt gehen oder schwingen und dann den Hitzetod sterben. Floatende Gates sind nicht so der Brüller für Power-FETs. Peter
Ein floating gate ist nie toll aber auf den Pulldown bin ich bisher noch nicht gekommen, warum auch immer. Macht in diesem Fall aber keinen Unterschied da der Timer-Ausgang ja nicht hochohmig ist sondern entweder high oder low. Ich muss also im Programm festlegen dass der Duty-Cycle bestimmte Extremwerte nicht annehmen darf (momentan wird der DC erhöht wenn die Spannung zu niedrig ist und umgekehrt, ohne Begrenzung). Ausserdem habe ich die Frequenz auf 120khz erhöht, der Kern scheint schon teilweise in Sättigung gegangen zu sein. Jetzt kann ich auch 3A vom Netzteil ziehen ohne dass es sich abschaltet, vorher war bei knapp über 1A Schluss weil der Strom scheinbar zu schnell angestiegen ist (Kurzschlussschutz oder sowas). Habe eben ausprobiert, die Schaltung resettet sich offensichtlich nicht mehr selbst weil der WD dauernd in den Overflow kommt. Das klappt also schon mal. Jetzt noch Feintuning in Bezug auf den Vergleich Ist/Soll Wert und die stabile Ausgangsspannung sollte da sein. Gruß, Sascha
Sascha schrieb: > Macht in diesem Fall aber keinen Unterschied da der Timer-Ausgang ja > nicht hochohmig ist sondern entweder high oder low. Nö. Die Pinkapazität mag ne Weile auf dem letzten Pegel geladen bleiben. Aber der Pin ist nach dem Watchdogreset floatend (hochohmig), wie alle anderen Pins auch. Peter
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.