PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR resettet sich selber... ??



Murus
25.12.2005, 10:33
Hallo zusammen,

Ich hab hier nen Mega8, mit 6MHz von einem Quarz getaktet.
An einer gewissen Stelle des Programmcodes resettet sich die Mühle selber.... Das sollte sie aber nicht.
Hier mal der Code von der Stelle, wo die Sache spinnt:

T = 0

Do

If T = 8 Then
B = A / 4
D = 65534 - B
C = A / 2
E = 65534 - C

Timer1 = D
Z = 1
G = 0
End If

If U = 8 Then
Stop Timer1
Acsr = &B01000000
Cls
Locate 1 , 1
Lcd "Ende"
End If


Locate 2 , 1
Lcd T
Locate 2 , 5
Lcd Z
Locate 2 , 10
Lcd G
Locate 2 , 18
Lcd U

Loop

Sobald T den Wert 8 annimt, geht Z auf 1, das kann ich am LCD sehen. Doch: Dann gehen wieder alle Werte auf 0. Und da T=0 vor dem Do-Loop steht, muss er ja fast einen Reset durchführen.....
Falls T mal nicht den Wert 8 annimnt (zuwenig Signale vom Komparator), dann gehts etwa 1 Sekunde und alle Werte springen auf 0 Zurück.
Bei Bedarf kann ich auch noch den ganzen Code posten.

Was kann das sein? Der Reset-Pin hängt mit 10k an Vcc...
Oder ist das ein Software-Problem?
Soll ich das mit einem zweiten AVR testen?
Hmm, wenn ich mein Programm im Sim laufen lasse, dann springt er korrekt nach dem T=8 in die Komparator-Routine. Bei diesem Return fliegt er wieder voll an den Anfang des Programms.... Reset. Warum?? Wie lässt sich das vermeiden? Auch anch dem Timer-Return vom Interrupt springt er wieder ganz an den Anfang und beginnt von Vorne....
Häää, ich hatte dieses Problem noch nie..

Hmm, nach dem If T=8 stellt er ja den Timer vor. Wenn er dann das nächste mal in den Timer-Interrupt geht, fällt die Sache im Sim zusammen. Er ordnet dann allen Varialben ihre höchst möglichen Werte zu...

Hier die Timer-IRQ:
Zeit:
Timer1 = E

If Z = 0 Then
Return
End If

If G = 0 Then
G = 1
Return
End If

If G = 1 Then
G = 0
End If

Return

Irgendwo hier bricht der Sim und vermutlich auch der AVR zusammen... Nur:Wo?
Herzlichen Gruss
Mario

Vitis
25.12.2005, 13:14
Also nach dem Programmauszug würd ich sagen t wird nie was anderes als 0
wenn ich das richtig lese

Ratber
25.12.2005, 13:28
Was kann das sein? Der Reset-Pin hängt mit 10k an Vcc...

So nebenbei:
Häng da noch nen kleinen Kerko (zb. 50-100nF) nach Masse drann.
Damit ist er besser gegen Spikes geschützt.

PicNick
25.12.2005, 14:02
Für Interrupt-Betrieb braucht man wenigsten 64 Byte HWStack.
Mit den Defaults
HWStack 32
SWStack 32
kann das knapp werden

Murus
25.12.2005, 14:17
Hmm, also ich hab schon viel "interruptintensivere" Programme laufen gehabt.
Mit dem Befehl
$Hwstack 128 und
$swstack 128 gings auch net...

Gibt es da sonst noch irgendwelche Speicher, die man vergrössern kann?
Also ich find das irgendwie strub... Sowas hatte ich noch nie.. und mein Programm ist nicht sehr verrückt....


T nimmt beim Komparatorinerrupt zu (eben: hier nicht der volle Code)
Der Code sollte funktionieren...

Hier ist er, für alle, die auf Nummer sicher gehen wollen:

$regfile = "m8def.dat"
$crystal = 6000000
$hwstack 128
$swstack 128

Config Lcd = 20 * 2
Config Lcdpin = Pin , E = Portb.0 , Rs = Portd.4 , Db7 = Portd.3 , Db6 = Portd.2 , Db5 = Portd.1 , Db4 = Portd.0
Cursor On



Ddrd.7 = 0 ' Komparator-Signaleingang

Dim A As Word
Dim B As Word
Dim D As Word
Dim C As Word
Dim E As Word
Dim T As Byte
Dim G As Byte
Dim Z As Byte
Z = 0
Dim U As Byte
Dim I As Byte
U = 0
G = 0

Dim X(40) As Byte


Acsr = &B01001000
On Aci Flankenwechsel
Enable Interrupts

On Timer1 Zeit
Config Timer1 = Timer , Prescale = 64
Start Timer1
Enable Timer1


T = 0

Do

If T = 8 Then
B = A / 4
D = 65534 - B
C = A / 2
E = 65534 - C

Timer1 = D
Z = 1
G = 0
End If

If U = 8 Then
Stop Timer1
Acsr = &B01000000
Cls
Locate 1 , 1
Lcd "Ende"
End If


Locate 2 , 1
Lcd T
Locate 2 , 5
Lcd Z
Locate 2 , 10
Lcd G
Locate 2 , 18
Lcd U

Loop

Flankenwechsel:
A = Timer1

If Z = 0 Then
Timer1 = 0
Incr T
End If

If Z = 1 Then

If G = 1 Then
Incr U
X(u) = Acsr.5
End If
If G = 0 Then
Return
End If


End If




Return

Zeit:
Timer1 = E

If Z = 0 Then
Return
End If

If G = 0 Then
G = 1
Return
End If

If G = 1 Then
G = 0
End If

Return


End


Nach 8 Komparator-Interrupts wird der Timer voreingestellt.
Das Ganze soll ein Empfänger für Manchester-Codierte Bytes werden, befindet sich noch arg in Entwicklung.

??

Herzliche Grüsse
Mario

Murus
25.12.2005, 15:11
Ah, ich hab weiter detektiert!
Der Komparator-Interrupt, der die Variable T hochzählen lässt, kommt von einer Photodiode.
Wenn ich die Leuchtstofflampe über meinem Pult an/ausschalte, dann schnellt T sofort auf über 50 hoch.....
Dort kamen also auch Störungen rein, die wird geflackert haben.....
Nun denn: Lampe aus:
Wenn ich die Schaltung anschalte, und dann zum ersten mal die Photodiode bestrahle, dann zählt t bis auf 7 hoch. Dann kommt komischerweise ein Reset.
Dann werden automatisch alle Variablen wieder auf 0 gesetzt. Wenn ich jetzt die Photodiode wieder bestrahle, funktioniert alles wunderbar!
Nur: wieso klappt das nicht schon beim ersten Versuch? Den HW/SW-Stack hab ich auf 128...
Was könnte das sein?

Murus
25.12.2005, 16:24
Hmm, hab den Code noch so erweitert, dass er mir das (korrekt) übertragene Byte anzeigt. Dies tut er, aber gleich darauf resettet er, denn es kommt wieder der "Startbildschirm"...

Was ist da los? Ich vermute, es hat mit etwas AVR-technischem zu tun, denn mein Code funktioniert....

Marco78
25.12.2005, 16:43
Ich habe auch ein Testboard auf dem sich viele "Antennen" befinden. Immer wenn ich meine Schreibtischlampe einschalte gibt es aucheinen Reset.
Mag es das sein?

Murus
25.12.2005, 16:46
Es passiert eben nur das erste mal....
Nachher kann ich beliebig oft durchlaufen lassen, er resettet nicht mehr....
Nur nachdem er zum ersten mal T auf 7 gesetzt hat, resettet er...
Und nachdem er das fertige Byte angezeigt hat, resettet er auch...
Am Reset-Pin hängen eben die 10k und ein kleiner Kerko...

Hmm, ab und zu spinnt auch das LCD... das zeigt dann ganz wirre Zeichen, die sich laufend ändern....

Könnte auch mein Netzteil sein (symmetrische Versorgung für OPamps und der 7805) Wenn ich das einschalte, rauscht der Radio ganz leicht....

Oh, wenn ich die Versorgungsspannung (5v) oszilliere, weiss ich , wieso der Radio rauscht....
Da schwingts fröhlich rum.
Ich häng da mal nen dicken Elko dran.
Hmm, am Reset-Pin des AVR hab ich das gleiche fröhliche rumschwingen... Elko hilft net gross

Was kann man da tun?

Murus
25.12.2005, 17:04
Edit: Es ist die Schaltung, die spinnt! Häng ich eine Glühbirne ans Netzteil, rauscht garnix. Sobald die Schaltung Saft bekommt, rauschts im Radio...

Murus
25.12.2005, 21:49
Hab unterdessen noch weiter geforscht. Die Quarze sind es nicht, die Störungen verursachen. Zudem hat der ganze Aufbau mit anderen Programmen funktioniert, es liegt also kaum an der Hardware... Eher an der Software.
Ich probiere nun, das Problem nochmals genau zu schildern:

Am Komparator hängt eine Photodiode, die ein Rechtecksignal gespeist bekommt. Immer, wenn sich eine Flanke tut, dann löst der Komparator einen Interrupt aus. In diesem Interrrupt wird zuerst einmal T erhöht, bis sie den Wert 8 erreicht.
Wenn ich zum Ersten mal nach dem Einschalten das Rechtecksignal laufen lasse, dann zählt er nur bis 7. Dann wird der AVR resettet. Danach, das Signal läuft ja unterdessen weiter, zählt er nochmals T bis 5. Dann resettet er wieder. Wenn ich nun das Rechtecksignal nochmals von Neuem laufen lasse, funktioniert der Code wunderbar. Nachdem das Signal beendet ist, zeigt er für einen kurzen Moment das Übertragene Byte an. Dann resettet er wieder und ich kann das Byte nochmals korrekt übertragen.

Irgendeine AVR-technische Besonderheit macht mir hier doch einen Strich durch die Rechnung... Die HW/SW-Stacks hab ich auf 128. Was kann das sein? Ich hab so ein Verhalten bis jetzt noch nie beobachtet...

Marco78
25.12.2005, 22:15
Evtl sind es ja die offenen IF die den Absturz verursachen.
Es wäre ja auch kein Problem, die Abfragen in den ISR alle auszuführen und nur am Ende ein Return einzufügen.

Was hast du denn schon unternommen, um das ganze zu debuggen?
Mal etwas über RS232 ausgegeben oder ein paar LED's angesteuert?

Murus
25.12.2005, 22:44
Oh, ich habs geschafft... Hab ein Timer1 enable etwas anders plaziert und plötzlich frisst ers.....
Auf jeden Fall funktioniert nun alles so, wies soll....
Komisch... Hab kaum etwas verändert, glaub auch in der If-Abfragerei etwas vereinfacht...
Ich debugge das mit einem LCD, das mir die Variablen anzeigt und mit dem Simulator...
RS232 hab ich Null Ahnung...

Herzlichen Gruss
Mario