Forum: Mikrocontroller und Digitale Elektronik UVR1611 DL-Auswertung | Atmega8 resettet bei INT0 | C


von Jochen R. (josch90)


Angehängte Dateien:

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

von Jochen R. (josch90)


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

von holger (Gast)


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.

von Jochen R. (josch90)


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

von holger (Gast)


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.

von Jochen R. (josch90)


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....

von holger (Gast)


Lesenswert?

>Habe jetzt alle variablen volatile gemacht... Allerdings immer noch
>InitOK am laufenden band....

Watchdog abgeschaltet? Ansonsten könnte Stacküberlauf
und/oder zu wenig RAM in Frage kommen.

von Jochen R. (josch90)


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

von holger (Gast)


Lesenswert?

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

Der hat auch nur 1kB RAM. Wird nichts bringen.

von Jochen R. (josch90)


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?

von holger (Gast)


Lesenswert?

Schmeiß doch mal ein paar von deinen puts("blabla") raus.
Und ändere die Puffer für den UART auf 8 statt 32 Byte.
Vieleicht bringt das ja schon was.

von Jochen R. (josch90)


Lesenswert?

Bringt immer noch nix, habe alle puts rausgemacht und den puffer auf 8 
bit verkleinert. Meine "debug-LEDs" an portc flackern aber immer noch 
munter vor sich hin

von Jochen R. (josch90)


Lesenswert?

Hat sonst niemand mehr eine idee?

von Daniel (Gast)


Lesenswert?

Versuchs doch mal mit INT1

von Daniel (Gast)


Lesenswert?

oder prüf einfach mal ob der Interrupt überhaupt geht mit ner anderen 
routine.

Wenn das schon nich geht liegt dein fehler wohl nich an der routine

von Werner B. (werner-b)


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".

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.