In einer ISR sollten keine LCD Ausgaben getätigt werden. Die Ausführzeit des Sub LCDPUTist evtl. länger als der Abstand zwischen 2 IRQ.
In einer ISR sollten keine LCD Ausgaben getätigt werden. Die Ausführzeit des Sub LCDPUTist evtl. länger als der Abstand zwischen 2 IRQ.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Hallo peterfido,
die Antwort triffts leider nicht.
Die Sub Lcd_put ist sehr sehr kurz - daran liegt es ganz sicher nicht. Es wird ja lediglich an den Pins des LCD gewackelt, so dass pro ms ein Byte im 4-bit-Mode ans LCD übertragen wird.
Weiterhin tritt der Fehler sogar auf, wenn in der Sub gar nichts mehr steht.
Weiterhin wurde festgestellt:
- spring ich in die leere Sub Lcd_put und übergebe einen Byte-Wert für _x, ist es genau dieser Byte-Wert der im Fehlerfall an Stelle _w1 in der Sub Analog auftaucht.
- veränder ich den bei Lcd_put übergebenen Byte-Wert für _x in der Lcd_put-Sub, so taucht der veränderte Byte-Wert für _w1 in der Sub Analog auf
- sogar im Bascom-Simulator ließ sich der Fehler produzieren - allerdings scheint es hier unmöglich die Register zu beobachten, weil während einiger hundert Durchläufe der Hauptschleife nur ab und an der Fehler auftaucht.
Da ich das Testprogramm allerdings auf Arbeit vergessen habe, kann ich leider erst am Montag weiterforschen
mfG
BoGe-Ro
Welche Bascom Version hast Du? Ich habe gestern einen Fehler im Code gesucht, den es gar nicht gab. Der Code lief schon einige Zeit zuverlässig und wurde mit einer älteren Bascom Version kompiliert. Gestern habe ich an anderer Stelle etwas geändert und anschließend kam nur Mist bei raus. Nach dem Update auf 2.0.7.0 war der Fehler wieder weg. So tippe ich auf ein Problem der 2.0.6.x
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Hallo,
also ich nutze die Version 1.11.9.3
Mir steht aktuell auch nur diese Version zur Verfügung.
Nachfolgend der aktuelle Testcode - welcher noch immer den Fehler mitbringt.
Sogar im Bascom-Simulator taucht die "55" aus der Sub Lcd_put in der Sub Analog auf.
Also die Variablen _w1, _w2 und _w3 haben manchmal den Wert 55 obwohl sie mit _w1=10 , _w2=20 und_w3=30 übergeben werden.
Code:$regfile = "M32def.dat" $crystal = 12288000 $hwstack = 128 $swstack = 96 $framesize = 64 $baud = 57600 '$sim '### LCD ####################################################################### Dim Lcd_cnt As Byte Declare Sub Lcd_put(byval _x As Byte , Byval _reg As Byte) '############################################################################### '### Timer0-Systemtakt ######################################################### On Oc0 Isr_timer0 Tccr0 = &B1000_1011 'ctc-mode, prescaler=64 Ocr0 = 191 '95=500µs / 191=1ms Timsk.ocie0 = 1 '### DA-Wandler ################################################################ Declare Sub Analog(byval _w1 As Byte , Byval _w2 As Byte , Byval _w3 As Byte ) Dim W1_alt As Byte , W2_alt As Byte , W3_alt As Byte Enable Interrupts Do Call Analog(10 , 20 , 30 ) Loop End '### ISR's ##################################################################### Isr_timer0: Incr Lcd_cnt 'nächstes Zeichen im Display-Puffer If Lcd_cnt <= 80 Then Call Lcd_put(5 , 1) 'Zeichen ausgeben If Lcd_cnt = 81 Then Call Lcd_put(2 , 0) 'Cursor at home (2ms) If Lcd_cnt = 250 Then Lcd_cnt = 0 Return '### Sub's ##################################################################### '### DA-Wandler ################################################################ Sub Analog(_w1 , _w2 , _w3 ) If _w1 <> W1_alt Or _w2 <> W2_alt Or _w3 <> W3_alt Then ' If _w1 <> W1_alt Then Sreg.7 = 0 Print _w1 ; Chr(9) ; W1_alt ; Chr(9) ; _w2 ; Chr(9) ; W2_alt ; Chr(9) ; _w3 ; Chr(9) ; W3_alt Sreg.7 = 1 W1_alt = _w1 W2_alt = _w2 W3_alt = _w3 End If End Sub '### LCD ####################################################################### ' Sub Lcd_put(_x , _reg ) _x = 55 End Sub
Da scheint der Softwarestack oder Framestack aus dem Takt zu kommen. Am besten Du postest direkt im mcselc Forum mit Deinem Beispiel Code. Mark Albert bereinigt solche Sachen immer recht schnell, wenn er sie denn kennt. Da eine Sub mit Parameter aufrufen immer eine Menge Stackschieberei nutzt, rufen die meisten Programmierer aus einer ISR keine SUB mit Parameter auf. Ich persönlich nutze so gut wie keine Subs, sondern verwende globale Variablen und springe per Gosub dahin und mit return zurück. Läuft wesentlich schneller, braucht aber mehr RAM als mehrere Subs mit lokalen Variablen. Aber auch da kann man sich helfen und Variablen einfach nur für solche Zwecke verwenden. Aber dann nicht aus einer ISR heraus...
PS: Ein Update auf die 2.0.7.0 lohnt sich in jedem Fall. Oft wird Code kürzer, sodass gefühlt mehr Programm in den MC passt.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Hallo,
für mich hat sich herausgestellt, dass es offenbar bei Funktions- und Subaufrufen aus einer ISR heraus zu Differenzen zwischen übergebenen und ankommenden Werten kommt.
Bei Arbeit mit globalen Variablen und Verzweigung mit Gosub - Return traten derartige Fehler nicht auf
Danke
BoGe-Ro
Lesezeichen