UVR1611 DL-Auswertung | Atmega8 resettet bei INT0 | C

OP #1505097
Lesenswert?

Hallo zusammen,

im Anhang befindet sich der Quellcode zur Auswertung einer 
Solarsteuerung (UVR1611). Den eigendlichen Code habe ich von Harald 
Peters (Beitrag "UVR 1611 (TA), Auswertung DL, Mega88, WinAVR"). Diesen Code habe 
ich nun auf einen Atmega8 umgeschrieben und die UART-Routinen von Peter 
Fleury eingefügt. Eigendlich soll der Controller nur die Daten auslesen 
und wieder per UART ausgeben. Zur Zeit benutze ich den Uart aber 
lediglich zum debuggen(leider erfolglos...)

Zum Problem:
Der Controller läuft wenn die DL nicht angeschlossen ist ganz normal in 
der Hauptschleife (im Terminal sehe ich immer wieder Hauptschleife). 
Sobald ich allerdings die Datenleitung der Solarregelung anschließe 
resettet sich der Controller ständig (Dauernde Meldung: Init OK).

Wenn ich den Code im Studio simuliere springt der Simulator nach
*PORTD |=  (1<<PD2);* wieder auf seinen Reset-wert.

Kann mir vielleicht jemand von euch erklären was in diesem Code falsch 
läuft? Ich bin mir ja schon fast sicher dass es sich wieder um einen 
klitzekleinen Fehler handelt, den ich einfach immer übersehe....

Ich hoffe ich habe das Problem verständlich genug beschrieben.

Gruß

Jochen
Angehängte Dateien:
OP #1505214
Lesenswert?

Das Problem beim Simulieren hat sich geklärt, der Code wurde zwar für 
den Mega 8 Compiliert, aber in den Simulationseinstellungen war immer 
noch Mega88 eingestellt.

Das der Controller jedoch bei jedem Interrupt resettet ist mir immer 
noch ein Rätsel... Hat sich den Code schonmal jemand angesehen und kann 
was dazu sagen?

Vielen Dank

Gruß

Jochen
Gast #1505219
Lesenswert?

>Wenn ich den Code im Studio simuliere springt der Simulator nach
>*PORTD |=  (1<<PD2);* wieder auf seinen Reset-wert.
>Sobald ich allerdings die Datenleitung der Solarregelung anschließe
>resettet sich der Controller ständig (Dauernde Meldung: Init OK).

Passt nicht zusammen. Das Init OK steht hinter der Zeile
mit PORTD|=...

>Hat sich den Code schonmal jemand angesehen und kann
>was dazu sagen?

Da fehlen jede Menge volatile.
OP #1505247
Lesenswert?

Hallo Holger,
vielen Dank schonmal, dass du dir die Mühe gemacht hast einen Blick in 
meinen Code zu werfen.

> Passt nicht zusammen. Das Init OK steht hinter der Zeile
> mit PORTD|=...

Das hat mich ja anfangs ja auch zimlich verwundert, aber ich habe ja im 
2. Beitrag geschrieben dass ich das Problem mit dem Simulator beheben 
konnte.

Was meinst du mit "da fehlen volatile"? Bin in C noch nicht so versiert, 
und alle Programme die ich bisher geschrieben habe kamen ohne volatile 
aus.
Gehe ich richtig der Annhame dass ich ein Volatile verwenden sollte, 
wenn dieser Wert nicht nur im HP sondern auch in den Interrupts 
verändert werden soll? Zur sicherheit könnte ich doch dann alle 
Variablen volatile machen, richig?

Gruß

Jochen
Gast #1505253
Lesenswert?

>Gehe ich richtig der Annhame dass ich ein Volatile verwenden sollte,
>wenn dieser Wert nicht nur im HP sondern auch in den Interrupts
>verändert werden soll?

Ja.

>Zur sicherheit könnte ich doch dann alle
>Variablen volatile machen, richig?

Nein.
OP #1505303
Lesenswert?

>>Zur sicherheit könnte ich doch dann alle
>>Variablen volatile machen, richig?
>
> Nein.

Und was wäre so falsch daran? Ich meine dem Hauptprogramm kann es doch 
egal sein ob jetzt ein Interrupt die Daten zwischendurch verändert oder 
nicht...

Habe jetzt alle variablen volatile gemacht... Allerdings immer noch 
InitOK am laufenden band....
OP #1505333
Lesenswert?

Watchdog ist aus, wdt_enable ist auskommentiert, da ich dies auch schon 
vermutet hatte, WTDON ist in den fuses auch deaktiviert. Wie kann ich 
einen Stackoverflow oder zu wenig Ram feststellen. Würde der Simulator 
sowas nicht feststellen?

Kann natürlich höchstens mal versuchen dass ganze für einen Mega 16 zu 
compilieren und schauen, ob es auf dem geht
OP #1505348
Lesenswert?

Also dass es nichts kann ich nach meinem Hardwaretest bestätigen...

Harald Peters hatte den Code für einen mega88 geschrieben, welcher auch 
nur 1k ram hat...

Meine theorie wäre dass der controller den INT0 nicht so richtig 
verkraftet, da das Programm ja in der Hauptschleife weiterläuft, sobald 
ich das signal vom interrupteingang wegnehme. Aber die interruptvectoren 
sind doch so richtig, oder?
#1508225
Lesenswert?

> Hat sich den Code schonmal jemand angesehen...
Nö!

> Das der Controller jedoch bei jedem Interrupt resettet ist mir immer
> noch ein Rätsel...

Falscher Vekor? INT0_vect bzw. SIG_INTERRUPT0 (alt)

Sieh dir mal das erzeugte ".lss" File an ob in den __vectors (ganz am 
Anfang), nach dem Reset-Vektor, der "__vector_1" steht und nicht 
"__bad_interrupt".

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren