- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 9 von 9

Thema: "komplexes" Programm läuft nicht

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    42
    Beiträge
    318

    "komplexes" Programm läuft nicht

    Anzeige

    E-Bike
    Hi,

    wenn ich folgendes Programm brenne, dann läuft das Programm nicht.

    Code:
    '### Controller Definition ###
    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 4800
    $hwstack = 32
    $swstack = 8
    $framesize = 24
    
    '### Dim Variablen ###
    Dim Ein As Bit                                              ' Startvariable
    Dim I As Byte
    Dim B As Byte                                               'Nachfolgende Dims sind für Temperatur
    Dim W As Word
    Dim Dg As Integer
    Dim Min1 As Integer
    Dim Min2 As Integer
    Dim Max1 As Integer
    Dim Max2 As Integer
    Dim Dsid1(8) As Byte
    Dim Sc(9) As Byte
    Dim Temp_$ As String * 6
    Dim Temp_$2 As String * 10
    Dim Tempsend As String * 10
    Dim Temp1mal As Bit
    Dim Ttlwert As Bit                                          ' TTL Variable 1 Bit
    Dim Zaehlerirq0 As Long
    Dim Impulseprosekunde As Long                               ' Variable für Drehzahl
    Dim Zeitwert As Long
    Dim Drehzahl As Long
    Dim Drehzahlanzeige As Long
    Dim Drehzahlsend As String * 3
    Dim Drehzahlformat As String * 4
    Dim Drehzahlformat1 As String * 4
    Dim Backlight As Byte
    Dim Zeitmessung As Word                                     ' Ab hier Variablen für abstand
    Dim Entfernung As Word
    Dim Text As String * 10
    Dim Entfernungneu As Word
    Dim Entfernungsend As String * 3
    
    '### Declare Subs ###
    Declare Sub Init
    Declare Sub Convallt
    Declare Sub Tempmodul
    Declare Function Decigrades(byval Sc(9) As Byte ) As Integer
    Declare Sub Fullstand
    
    '### Grafikroutine ###
    $lib "glcdks108.lib"
    Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 1 , Ce2 = 0 , Cd = 2 , Rd = 3 , Reset = 4 , Enable = 5
    Cls
    
    '### Portkonfiguration ###
    Config Portb.0 = Output
    Config Pinb.2 = Input
    Config Portb.3 = Input
    Config Portb.4 = Output
    Ledpower Alias Portb.0
    Resetbutton Alias Pinb.3
    Lcdpower Alias Portb.4
    Config 1wire = Portd.6
    
    Ledpower = 1
    'Ocr2 = 255
    
    
    '### Interrupts ###
    Config Int2 = Falling
    Config Int0 = Change
    Config Int1 = Rising
    Enable Interrupts
    Enable Int2
    On Int2 Powerbutton
    'Enable Int0
    On Int0 Ttl
    'Enable Int1
    On Int1 Irq0
    
    '### Timer ###
    Config Timer0 = Timer , Prescale = 1024
    Config Timer1 = Timer , Prescale = 256
    Config Timer2 = Pwm , Compare Pwm = Clear Up , Pwm = On , Prescale = 8
    
    On Timer1 Timer_irq
    Const Timervorgabe = 3036
    
    '### Boot ###
    Ein = 0
    Temp1mal = 0
    Zeitwert = 0
    Drehzahl = 0
    Drehzahlanzeige = 0
    Zaehlerirq0 = 0
    Impulseprosekunde = 0
    
    
    
    'Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2                         ' Display ausschalten
    
    '### Start ###
    Starting:
    If Ein = 1 Then Goto Systemstart
    Goto Starting
    
    '### Main ###
    Main:
    Debounce Resetbutton , 0 , Resetmachen , Sub
    If Ein = 0 Then Goto Systemend
    Wait 1
    Call Tempmodul
    Wait 1
    Call Fullstand
    Goto Main
    
    '### Powerbutton Int2 ###
    Powerbutton:
    Toggle Ledpower
    
    Return
    
    '### Include Dateien ###
    $include "system.bas"
    $include "kay.font"
    
    Lcdmain:
    $bgf "lcdmain.bgf"
    
    Lcdsplash:
    $bgf "splash.bgf"
    
    Lcdreset:
    $bgf "reset.bgf"
    
    Ende:
    $bgf "end.bgf"
    hier die dazugehörige System.bas :

    Code:
    '### Systemstart ###
    Systemstart:
    
       Ledpower = 1
       Waitms 500
       Ledpower = 0
       Waitms 500
       Ledpower = 1
       Waitms 500
       Ledpower = 0
       Waitms 500
       Ledpower = 1
       Waitms 500
       Ledpower = 0
       Waitms 500
       Ledpower = 1
    
       Drehzahlanzeige = 0
       Lcdpower = 1
       Portd.7 = 1
    
    
       Waitms 100
       Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2                      ' Display einschalten
       Cls
       Showpic 0 , 0 , Lcdsplash
       For Backlight = 0 To 255
          Ocr2 = Backlight
          Waitms 25
       Next Backlight
       Showpic 0 , 0 , Lcdmain
       Setfont Kay
       Lcdat 2 , 11 , "'C"
       Lcdat 2 , 41 , "mm"
       Lcdat 2 , 72 , "Upm"
       Lcdat 2 , 102 , "0/1"
    
       'Lcdat 3 , 38 , "100"
       Lcdat 3 , 73 , "  0"
       'Lcdat 3 , 106 , "1"
    
       Enable Timer1
    
    
       Enable Int0
       Enable Int1
    
       Dsid1(1) = 1wsearchfirst()
    
       If Pind.2 = 1 Then
          Lcdat 3 , 106 , "1"
          Ttlwert = 1
       Else
       If Pind.2 = 0 Then
          Lcdat 3 , 106 , "0"
          Ttlwert = 0
       End If
       End If
    
       Goto Main
    
    '### Systemend ###
    Systemend:
    
       Disable Int0
       Disable Int1
       Disable Timer1
    
    
       Ein = 0
       Temp1mal = 0
       Zeitwert = 0
       Drehzahl = 0
       Drehzahlanzeige = 0
       Zaehlerirq0 = 0
       Impulseprosekunde = 0
    
    
       Ledpower = 0
       Waitms 500
       Ledpower = 1
       Waitms 500
       Ledpower = 0
       Waitms 500
       Ledpower = 1
       Waitms 500
       Ledpower = 0
       Waitms 500
       Ledpower = 1
       Waitms 500
       Ledpower = 0
    
       Showpic 0 , 0 , Ende
    
       For Backlight = 255 To 0 Step -1
          Ocr2 = Backlight
          Waitms 15
       Next Backlight
       Cls
       Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2                      ' Display ausschalten
       Waitms 100
       Lcdpower = 0
       Portd.7 = 0
    
    Goto 0
    
    '--- Temperaturmodul --
    Sub Tempmodul
    
    Call Convallt                                               ' "Convert ALL T on the 1w-bus"
      Waitus 200 : Waitus 200 : Waitus 200 : Waitus 200         'if you use 2-wire, could be reduced to 200us
    
      1wverify Dsid1(1)                                         'Issues the "Match ROM "
      'Locate 1 , 1
      'If Err = 1 Then
      '  Lcdat 3 , 4 , "Err     "                                'Err = 1 if something is wrong
      'Elseif Err = 0 Then                                       'lcd " Sensor found"
        1wwrite &HBE
        Sc(1) = 1wread(9)                                       'read bytes into array
        If Sc(9) = Crc8(sc(1) , 8) Then
           Dg = Decigrades(sc(9))
    
             Temp_$ = Str(dg)
             Temp_$ = Format(temp_$ , "+#0.0")
             Tempsend = Str(dg)
             Tempsend = Format(tempsend , "+#00.0")
             Temp_$2 = Temp_$ + " "
    
             If Temp1mal = 0 Then
             Lcdat 3 , 4 , "Check"
             Temp1mal = 1
             Else
             If Temp1mal = 1 Then
             Lcdat 3 , 4 , Temp_$2
             End If
             End If
    
      End If
    
    
      Waitms 500
    
    End Sub
    
    '--- Temperatur konvertieren ---
    Sub Convallt
       1wreset                                                  ' reset the bus
       1wwrite &HCC                                             ' skip rom
       1wwrite &H44                                             ' Convert T
    
    End Sub
    
    '--- Funktion zum auslesen des Temperatursensors ---
    Function Decigrades(byval Sc(9) As Byte)
    Dim Tmp As Byte , T As Integer , T1 As Integer
    
       Tmp = Sc(1) And 1                                        ' 0.1C precision
          If Tmp = 1 Then Decr Sc(1)
          T = Makeint(sc(1) , Sc(2))
          'Print Hex(t)
          'Print T
    
          T = T * 50                                            'here we calculate the 1/10 precision like
          T = T - 25                                            'DS18S20 data sheet
          T1 = Sc(8) - Sc(7)
          T1 = T1 * 100
          T1 = T1 / Sc(8)
          T = T + T1
          Decigrades = T / 10
    
    
    End Function
    
    '--- TTL abfragen ---
    Ttl:
    
       If Pind.2 = 1 Then
          Lcdat 3 , 106 , "1"
          Ttlwert = 1
       Else
       If Pind.2 = 0 Then
          Lcdat 3 , 106 , "0"
          Ttlwert = 0
       End If
       End If
    
    Return
    
    '--- Irq für drehzahlsensor ---
    Irq0:
    Incr Zaehlerirq0
    Incr Drehzahl
    Return
    
    '--- Timer irq für Drehzahlsensor ---
    Timer_irq:
    Timer1 = Timervorgabe
    Impulseprosekunde = Zaehlerirq0
    Zaehlerirq0 = 0
    Incr Zeitwert
    
    
       Drehzahlformat = Str(drehzahlanzeige)
       Drehzahlsend = Format(drehzahlformat , "000")
    
    
       'Lcdat 3 , 38 , Zeitwert
    
       If Zeitwert = 10 Then Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert
       If Zeitwert = 20 Then Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert
       If Zeitwert = 30 Then Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert
       If Zeitwert = 40 Then Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert
       If Zeitwert = 50 Then Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert
    
       If Zeitwert = 60 Then
    
       Drehzahlanzeige = Drehzahl
       Drehzahlformat = Str(drehzahlanzeige)
       Drehzahlsend = Format(drehzahlformat , "000")
    
       Print Tempsend ; ";" ; Entfernungsend ; ";" ; Drehzahlsend ; ";" ; Ttlwert
    
    
    
      If Drehzahlanzeige < 9 Then
         Drehzahlformat = "  " + Drehzahlformat
        Lcdat 3 , 73 , Drehzahlformat
      End If
    
      If Drehzahlanzeige > 9 And Drehzahlanzeige < 99 Then
         Drehzahlformat = " " + Drehzahlformat
       Lcdat 3 , 73 , Drehzahlformat
      End If
    
      If Drehzahlanzeige > 99 Then
         Lcdat 3 , 73 , Drehzahlformat
      End If
    
      'Lcdat 3 , 72 , Drehzahlformat
    
    
       Zeitwert = 0
       Drehzahl = 0
    
    End If
    Return
    
    '--- Resetmachen ---
    Resetmachen:
    Disable Timer1
    Disable Int0
    Disable Int1
    
    Cls
    Showpic 0 , 0 , Lcdreset
    Setfont Kay
    Wait 1
    Lcdat 4 , 15 , "TemperatUr"
    Waitms 500
    Lcdat 4 , 80 , "OK"
    Wait 1
    Lcdat 5 , 15 , "Fullstand"
    Waitms 500
    Lcdat 5 , 80 , "OK"
    Wait 1
    Lcdat 6 , 15 , "Drehzahl"
    Waitms 500
    Lcdat 6 , 80 , "OK"
    Wait 1
    Lcdat 7 , 15 , "TTL"
    Waitms 500
    Lcdat 7 , 80 , "OK"
    Wait 2
    
    Zeitwert = 0
    Drehzahl = 0
    Drehzahlanzeige = 0
    Zaehlerirq0 = 0
    Impulseprosekunde = 0
    
    
    Cls
    Showpic 0 , 0 , Lcdmain
    
    Lcdat 2 , 11 , "'C"
       Lcdat 2 , 41 , "mm"
       Lcdat 2 , 72 , "Upm"
       Lcdat 2 , 102 , "0/1"
       Lcdat 3 , 73 , "  0"
       'Lcdat 3 , 37 , "0"
    
    If Pind.2 = 1 Then
          Lcdat 3 , 106 , "1"
          Ttlwert = 1
       Else
       If Pind.2 = 0 Then
          Lcdat 3 , 106 , "0"
          Ttlwert = 0
       End If
       End If
    Enable Timer1
    Enable Int0
    Enable Int1
    
    
    Return
    
    '--- Sub für Füllstand ---
    Sub Fullstand
    
    Portd.5 = 0
    Pulseout Portd , 5 , 40
    Pulsein Zeitmessung , Pind , 5 , 1
    Zeitmessung = Zeitmessung * 10
    Entfernung = Zeitmessung / 5.8
    Entfernungneu = 181 - Entfernung
    
    If Entfernungneu > 3000 Then
       Entfernungneu = 0
    End If
    
    Text = Str(entfernungneu)
    Entfernungsend = Format(text , "000")
    
    If Entfernungneu < 9 Then
       Text = "  " + Text
       Lcdat 3 , 37 , Text
    End If
    
    If Entfernungneu > 9 And Entfernungneu < 99 Then
       Text = " " + Text + " "
       Lcdat 3 , 37 , Text
    End If
    
    If Entfernungneu > 99 Then
       Lcdat 3 , 37 , Text
    End If
    
    
    End Sub
    Brenne ich aber ein kleines Programm, wie z.B. das hier dann läuft das kleine programm.

    Code:
    '### Controller Definition ###
    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 4800
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    Config Int2 = Falling
    On Int2 Blinken
    Enable Int2
    Enable Interrupts
    
    '--- Ports ---
    Config Portb.0 = Output
    
    
    Do
    nop
    Loop
    
    
    Blinken:
    Toggle Portb.0
    Return
    Im großen Programm warte ich, bis Int2 auf 0 geht und dann kommt der Systemstart. Vor 2 Wochen hat noch alles geklappt und nun garnichts mehr. Ich bin am verzweifeln.

    Sitze daran schon mehr als 6 Stunden und find den Fehler nicht. Wo liegt denn mein Fehler ? Wäre nett, wenn mir jemand helfen könnte. Danke

    mfg Kay

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Korrigier mich, falls ich nicht alles gesehen habe.
    Ich denke das Programm läuft so:

    Die Variable Ein ist immer 0, also kommt er nie über die Befehle

    Code:
    Starting:
    If Ein = 1 Then Goto Systemstart
    Goto Starting
    Höchstens durch einen Interrupt.
    Von den externen ist nur INT2 enabled. Der springt nach

    Code:
    Powerbutton:
       Toggle Ledpower
    Return
    INT1 und INT0 würden nur enabled, falls er nach main: kommen könnte, ich sehe aber nicht wie.
    Die Timer sind nicht enabled, also tragen sie auch nicht zum Programm bei.
    Wenn dein Programm mal läuft, musst du bestimmt die Stacks vergrößern.

    Gruß

    Rolf

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    42
    Beiträge
    318
    Hallo Rolf,

    also an Int2 hängt ein Taster. Zum testen lasse ich den Int2 nach Powerbutton springen. Da soll er die Led Toggeln. Das macht er aber nicht. Drücke ich den Taster, passiert nichts. Ich habe nachgemessen und der Int2 geht auf 0 wenn ich drücke.

    mfg Kay

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    An PinB.2 hast du den pull-up nicht aktiv. Hast du extern einen dran?

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    42
    Beiträge
    318
    ja hängt an 5V. Was mich nur wundert ist folgendes:

    lass ich den code im simulator laufen, bleibt der simulator bei Config lcd ... stehen. Ach ich dreh noch durch

    mfg Kay

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Für den Simulator gibst du besser

    $sim ein.

    Nachher aber dran denken, zu löschen.

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    42
    Beiträge
    318
    danke für den Tip. mit $sim gehts im simulator. aber es geht leider net in der "wirklichkeit"

    mfg Kay

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Ich habe mir den Code jetzt nicht angesehen. Wenn vor 2 Wochen genau der selbe Code lief, dann ist evtl. etwas mit dem AVR. Hast Du auf einem Anderen getestet? Hast Du evtl den Watchdog mal genutzt, sodass er noch enabled ist?
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Deine Werte für Stack und Frame sind auch n bissl knapp
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Berechtigungen

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

12V Akku bauen