- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: an Sub übergebene Werte

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.02.2010
    Beiträge
    67
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    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! \/

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.02.2010
    Beiträge
    67
    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

Ähnliche Themen

  1. Werte begrenzen
    Von Martinius11 im Forum Robby RP6
    Antworten: 17
    Letzter Beitrag: 27.06.2010, 18:56
  2. Unregelmäßige werte für PWM
    Von BastelWastel im Forum PIC Controller
    Antworten: 5
    Letzter Beitrag: 21.02.2006, 00:43
  3. A/D Werte ausgeben
    Von toraX im Forum C - Programmierung (GCC u.a.)
    Antworten: 13
    Letzter Beitrag: 17.02.2006, 01:20
  4. Werte senden
    Von Elle im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 31.01.2006, 23:49
  5. CNY Werte
    Von noNeed 4 aNick im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 30.01.2005, 18:09

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test