Forum: Compiler & IDEs atmega32 2-Tasten 5-Funktionen Absturzproblem


von Andi H. (leguan08)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

habe hier versucht eine Zimmersteuerung mit 2 Tasten und 5 Funktionen 
(Licht und Steckdosen) zu programmieren. Funktioniert soweit auch 
wunderbar, nur bleibt das Ding nach ein bis zwei Tagen einfach hängen 
und nichts geht mehr. Auch der eingebaute Watchdog löst nicht aus. Nach 
einem Reset funktioniert wieder eine Weile alles, bis es wieder 
hängenbleibt. Habe auch den ATmega32 schon getauscht -> gleiches 
verhalten. Ich finde im Code einfach den Fehler nicht, oder bin einfach 
zu blind.

Könnt Ihr bitte mal über den angehängten Code schauen, ich weiß einfach 
nicht mehr weiter, wo sich der Fehler befinden könnte.

Vielen Dank im voraus,

Gruß Andi

von Falk B. (falk)


Lesenswert?

@ Andi H. (leguan08)

>Könnt Ihr bitte mal über den angehängten Code schauen, ich weiß einfach
>nicht mehr weiter, wo sich der Fehler befinden könnte.

Das #define für F_CPU muss vor dem #includ von util/delay kommen, sonst 
spuckt der Compiler einen Fehler aus.

Was soll der Nonsense mit der delay_us() Schleife? Einfach _delay_ms(1) 
tuts locker.

Erst alle Sachen initalisieren, dann erst die Interrupts freigeben.

Was soll das?
1
  unsigned char tcnt1h = TCNT1H;
2
  // ...
3
  TCNT1H = tcnt1h;      // restore for delay() !

Das ist Unsinn. Denn es macht exakt GAR nichts! Siehe Zugriff auf 16 Bit 
Register!

Solche Tricks würde ich mir auch verkneifen.
1
  if( ++prescaler == (unsigned char)DEBOUNCE )

DEBOUNCE ist 256, prescaler ein uint8_t. Das passt irgendwie nicht 
zusammen.

Wo nun das exakte Problem steckt, hab ich leider keine Ahnung.

MFG
Falk

von Peter D. (peda)


Lesenswert?

Falk Brunner wrote:

> Was soll das?
>
>
1
>   unsigned char tcnt1h = TCNT1H;
2
>   // ...
3
>   TCNT1H = tcnt1h;      // restore for delay() !
4
>
>
> Das ist Unsinn. Denn es macht exakt GAR nichts! Siehe Zugriff auf 16 Bit
> Register!

Das ist kein Unsinn, siehe Zugriff auf 16 Bit Register!

Wenn ein Interrupt und das Main auf ein 16Bit Register zugreifen, muß 
der Interrupt das High-Byte sichern oder das Main muß die Interrupts für 
den kompletten Zugriff sperren.
Das Temp-High Register ist nämlich nur einmal da (für TCNT1, ICR1, 
OCR1A, OCR1B).


> DEBOUNCE ist 256, prescaler ein uint8_t. Das passt irgendwie nicht
> zusammen.

Doch, es reichen 8Bit, um /256 zu teilen (256 entspricht dann der 0).


Peter

von Oliver (Gast)


Lesenswert?

Auch wenn Softwerker das gerne verdrängen, Bugs gibt es auch in der 
Hardware.

Ist da alles störungssicher?

Oliver

von UBoot-Stocki (Gast)


Lesenswert?

Hi,

"habe hier versucht eine Zimmersteuerung mit 2 Tasten und 5 Funktionen
(Licht und Steckdosen) zu programmieren."

Wie sieht denn die HW aus? Schaltest Du mit Relais? Hast Du 
Snubber-Glieder verbaut 
(http://de.wikipedia.org/w/index.php?title=Snubber&redirect=no)

Ich hatte mit meiner Bewässerungssteuerung die selben Probleme und 
konnte diese durch Entstörmaßnahmen beheben...

Gruß

Andreas

von Andi H. (leguan08)


Lesenswert?

Bei der Hardware habe ich für die Eingänge Optokoppler (CNY 17) 
verwendet, die sich zwischen den normalen Tastschaltern für das "alte" 
Licht befinden und mit 5V geschaltet werden.

Bei den Ausgängen habe ich als Lastschalter einen ULN2803A verwendet, 
der dann 230V Relais schaltet.

Bis auf extra Schutzdioden an den Relais sind keine speziellen 
RC-Glieder verbaut.

> Ich hatte mit meiner Bewässerungssteuerung die selben Probleme und
> konnte diese durch Entstörmaßnahmen beheben...

was hast du denn speziell eingebaut um die Störungen zu vermeiden ?

Gruß

Andi

von UBoot-Stocki (Gast)


Lesenswert?

Hi,

ich habe die o.g. Snubber-Glieder eingebaut, dann war alles gut !

Gruß

Andreas

von Andi H. (leguan08)


Lesenswert?

UBoot-Stocki wrote:
> Hi,
>
> ich habe die o.g. Snubber-Glieder eingebaut, dann war alles gut !
>
> Gruß
>
> Andreas

Hallo Andreas,

kannst du mir genauer sagen, wie und was du eingebaut hast ?

Gruß,

Andi

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.