Gast
#1757641
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();
}
