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
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
>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.
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
>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.
>>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....
>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.
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
>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.
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?
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.
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
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.