Also nach dem Programmauszug würd ich sagen t wird nie was anderes als 0
wenn ich das richtig lese
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
Also nach dem Programmauszug würd ich sagen t wird nie was anderes als 0
wenn ich das richtig lese
Vor den Erfolg haben die Götter den Schweiß gesetzt
So nebenbei:Was kann das sein? Der Reset-Pin hängt mit 10k an Vcc...
Häng da noch nen kleinen Kerko (zb. 50-100nF) nach Masse drann.
Damit ist er besser gegen Spikes geschützt.
Gruß
Ratber
Für Interrupt-Betrieb braucht man wenigsten 64 Byte HWStack.
Mit den Defaults
HWStack 32
SWStack 32
kann das knapp werden
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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:
Nach 8 Komparator-Interrupts wird der Timer voreingestellt.Code:$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
Das Ganze soll ein Empfänger für Manchester-Codierte Bytes werden, befindet sich noch arg in Entwicklung.
??
Herzliche Grüsse
Mario
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?
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....
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?
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?
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...
Lesezeichen