Hallo, ich hab zwar schon ein paar grundlegende Projekte mit einem µC gemacht, bin aber seit längerer Zeit an einem Problem am hängen wo ich absolut nicht mehr weiter komme. Ich hab auch schon länger in den Foren hier rumgestöbert und im Internet nach Lösungen gesucht, aber bisher hat kein Ansatz funktioniert. Da mit das Problem auch relativ speziell aussieht wollte ich mich mal die Profis von hier befragen. Bei dem Projekt (basierend auf einem ATtiny2313) geht es darum, dass sich der µC grundsätzlich im power-down mode befinden soll und durch einen Taster, der über INT0 angeschlossen ist, den µC wecken soll. Dieser soll dann ja nach Zustand 4 Relais in einer gewissen Reihenfolge in bestimmten Zeitabständen schalten. Soweit so gut. Die ersten 7 Durchläufe funktionieren einwandfrei (also 4 Mal "anschalten" und 3 Mal "ausschalten"). Beim 4 Mal Ausschalten tritt dann allerdings ein Reset auf. Die Frage ist nur warum?? Das Programm ist doch 3 Mal korrekt "durchgelaufen". Ich habe im Anhang mal den Schaltplan gepostet und unten den Quellcode des Hauptprogramms. Die Funktionen zum Schalten der Relais habe ich mal weggelassen, da hier außer Pin auf high setzen, 6 Zehntelsekunden warten und Pin wieder auf low setzen nicht passiert. Bei Bedarf kann ich aber auch diesen Code noch posten. Weiß da absolut nicht mehr weiter. Wahrscheinlich ist's nur ein amateurhafter Fehler. Hoffe ihr könnt mir da helfen. Gruß Carlos #include "main.h" uint8_t Zustand; void my_delay_Zehntel_Sekunde (int zs){ int i; for (i=0;i<=zs;i++){ _delay_ms(100); } } int main (void){ MCUCR |= (1<<SM1)|(1<<SM0)|(1<<SE); wdt_disable();Hallo, #include "main.h" #include <avr/wdt.h> uint8_t Zustand; void my_delay_Zehntel_Sekunde (int zs){ int i; for (i=0;i<=zs;i++){ _delay_ms(100); } } int main (void){ MCUCR |= (1<<SM1)|(1<<SM0)|(1<<SE); set_sleep_mode(SLEEP_MODE_PWR_DOWN); DDRD &= ~(1<<2); MCUCR |= (1<<ISC01); MCUCR &= ~(1<<ISC01); GIMSK |= (1<<INT0); sei(); Relais_init(); Zustand = aus; sleep_mode(); while (1>0){ } } SIGNAL (SIG_INTERRUPT0){ GIMSK &= ~(1<<INT0); if (Zustand==aus){ bistabiles_Relais_an(1); bistabiles_Relais_an(2); bistabiles_Relais_an(3); my_delay_Zehntel_Sekunde(80); Relais_anziehen(4); Zustand = an; } else{ Relais_anziehen(4); my_delay_Zehntel_Sekunde(60); bistabiles_Relais_aus(3); bistabiles_Relais_aus(2); bistabiles_Relais_aus(1); Zustand = aus; } GIMSK |= (1<<INT0); sei(); sleep_mode(); }
Hallo, ich würde zum Testen anstatt der Relais mal LEDs oder ähnliches schalten. Um herauszufinden ob es Sw oder Hw ist.
#include "main.h" int main (void){ ...... #include "main.h" } int main (void){ .... } 2x main.h?????????????? 2x int main(void)???????????? überleg mal...
- Das sei() raus aus der ISR - das sleep() raus aus der ISR, rein in die main ins while(1) So wie jetzt haust du dir den Stack voll, weil deine ISR von der ISR von der ISR ... unterbrochen wird.
Hey Leute, danke für die schnelle Antwort. Die Sache lief ja ziemlich optimal. Hab mich lange mit der Sache rumgeärgert und dann hier nach noch nicht mal 20 Minuten eine Lösung bekommen. Das verleitet einen ja dazu sich viel zu schnell an diese Stelle hier zu wenden. Aber das wollen wir ja auch nicht. Vorher kann man sich ruhig mal ein paar Stunden selbst mit so'ner Sache beschäftigen. Aber wenn bei mir dann mal nicht mehr weitergeht, weiß ich wo ich mich dann hinwende. @prinz3nroll3: gute Idee (hatte ich nämlich auch schon ;-) @xxx: da ist wohl was beim Kopieren für's Posten schief gelaufen, das sind noch Fragmente aus längst vergangenen hilflosen Versuchzeiten, ab dem 2. #include "main.h" fängt das Programm erst an. @Maxx: WELTKLASSE !!!! genau das war der Fehler in der Matrix. Jetzt wo ich drauf gestossen werd, leucht's mir auch ein. Keine Ahnung wo ich den Ansatz mit dem sleep() in der ISR her hatte (liegt schon länger zurück). Nochmal vielen Dank an alle!! PROBELM GELÖST !!!! Gruß Carlos
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.