mikrocontroller.net

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


Autor: Jochen R. (josch90)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jochen R. (josch90)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jochen R. (josch90)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jochen R. (josch90)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jochen R. (josch90)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jochen R. (josch90)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jochen R. (josch90)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jochen R. (josch90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sonst niemand mehr eine idee?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs doch mal mit INT1

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.