Forum: Mikrocontroller und Digitale Elektronik Attiny26 Reset vector


von Sascha (Gast)


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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.

von Sascha (Gast)


Lesenswert?

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?

von Stefan E. (sternst)


Lesenswert?

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.

von Sascha (Gast)


Lesenswert?

Ah danke. Ist das erste Mal dass ich den WD überhaupt brauche, daher hab 
ich mich daher noch nicht befasst.

Gruß, Sascha

von Sascha (Gast)


Lesenswert?

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

von Stefan F. (sfrings)


Lesenswert?

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.

von Sascha (Gast)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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.

von Sascha (Gast)


Lesenswert?

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?

von Stefan E. (sternst)


Lesenswert?

Sascha schrieb:
> Aber ich schalte ja mit
> ...
> den Watchdog erstmal aus

Wusste ich nicht, denn davon stand in dem Post nichts.

von Sascha (Gast)


Lesenswert?

Dann hast du den von 16:30 nicht gelesen, da hatte ich noch den 
aktuellen Programmcode bei nopaste hochgeladen.

von Peter D. (peda)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.