UVR1611 DL-Auswertung | Atmega8 resettet bei INT0 | C

OP #1505097
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
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
>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
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
>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
>>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....
Gast #1505318
>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.
OP #1505333
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
Gast #1505341
>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.
OP #1505348
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?
Gast #1505360
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.
#1508225
> 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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.