- LiFePO4 Speicher Test         
Ergebnis 1 bis 9 von 9

Thema: display aktualisieren

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578

    display aktualisieren

    Anzeige

    Praxistest und DIY Projekte
    hallo leute,

    ich habe mal wider ein problem.
    ich habe folgenden code, welcher auch einwandfrei funzt, bis auf eine sache:
    wenn ich auf taste 1 zum beispiele drücke, zeigt mir das prog die batteriespannung an.
    allerdings wird dieser wert (also die anzeige) nicht aktualisiert, wenn ich am labornetzgerät die spannung verstelle!
    hier nun der code:

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 9600
    $hwstack = 32
    $swstack = 32
    $framesize = 64
    
    Declare Function Tastenabfrage() As Byte
    Declare Sub Batteriespannung()
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcdbus = 4
    Config Adc = Single , Prescaler = Auto
    Config Pina.7 = Input
    Porta.7 = 1
    
    Config Timer1 = Timer , Prescale = 1024
    Enable Timer1
    Enable Interrupts
    Timer1 = 49910
    On Timer1 Isr_von_timer1
    
    Config Timer0 = Counter , Edge = Falling
    Enable Timer0
    Timer0 = 255
    On Timer0 Isr_von_timer0
    
    Dim A As Integer
    Dim Taste As Byte
    Dim Volt As Single
    Dim Secu As Single
    Dim Minu As Single
    Dim Hour As Single
    Dim X As Single
    Dim Tasten_flag As Byte
    Dim F As Single
    Dim T As Single
    Dim Freq As Single
    Dim N As Long
    Dim W As Word
    Dim J As Word
    Dim Y As Word
    
    Const Ref = 5 / 1023
    
    A = 1
    X = 1
    Secu = 00
    Minu = 00
    Hour = 00
    T = 0
    Tasten_flag = 0
    F = 0
    
    Cls
    Locate 1 , 4
    Lcd "Daten-Terminal "
    Locate 2 , 1
    Lcd "Hier koennen Sie"
    Locate 3 , 1
    Lcd "ermittelte Daten"
    Locate 4 , 1
    Lcd "Speichern!!! "
    
    
    Do
    
    Taste = Tastenabfrage()
       If Taste <> 0 Then
    
          Select Case Taste
             Case 1
                Cls
                N = 0
                Y = 1
                Tasten_flag = 0
                For N = 1 To 100000000
                Initlcd
                Start Adc
                W = Getadc(6)
                Volt = W * Ref
                Volt = Volt * 5.2941
                Cls
                Locate 1 , 1
                Lcd "Die aktuelle "
                Locate 2 , 1
                Lcd "Spannung  betraegt: "
                Locate 3 , 1
                Lcd Volt ; " Volt "
                W = Getadc(7)
                If W < 500 Then
                Select Case W
                Case 400 To 450
                J = 1
                Case 330 To 380
                J = 2
                Case 260 To 305
                J = 3
                Case 180 To 220
                J = 4
                Case 90 To 130
                J = 5
                End Select
                End If
                If J <> Y Then
                Tasten_flag = 1
                Exit For
                End If
                If Tasten_flag = 1 Then
                Exit For
                End If
                Next N
             Case 2
                Cls
                N = 0
                Y = 2
                Tasten_flag = 0
                Writeeeprom Secu , 1
                Writeeeprom Minu , 10
                Writeeeprom Volt , 20
                Cls
                Locate 1 , 1
                Lcd "Speichern von: "
                Locate 2 , 1
                Lcd "Frequenz, Laufzeit "
                Locate 3 , 1
                Lcd "und Batteriespannung"
                Locate 4 , 1
                Lcd "Daten jetzt abrufbar"
             Case 3
                Cls
                N = 0
                Y = 3
                Tasten_flag = 0
                For N = 1 To 100000000
                Initlcd
                Freq = F / T
                Locate 1 , 1
                Lcd "Sekunden = " ; T
                Locate 2 , 1
                Lcd "Signale = " ; F
                Locate 3 , 1
                Lcd "==> Frequenz:"
                Locate 4 , 1
                Lcd Freq ; "Hz"
                Start Adc
                W = Getadc(7)
                If W < 500 Then
                Select Case W
                Case 400 To 450
                J = 1
                Case 330 To 380
                J = 2
                Case 260 To 305
                J = 3
                Case 180 To 220
                J = 4
                Case 90 To 130
                J = 5
                End Select
                End If
                If J <> Y Then
                Tasten_flag = 1
                Exit For
                End If
                If Tasten_flag = 1 Then
                Exit For
                End If
                Next N
             Case 4
                N = 0
                Y = 4
                Tasten_flag = 0
                For N = 1 To 100000000
                Cls
                Initlcd
                If Secu = 60 Then
                Secu = 00
                Minu = Minu + 1
                Elseif Minu = 60 Then
                Minu = 00
                Hour = Hour + 1
                End If
                Locate 2 , 1
                Lcd "Zeit = "
                Locate 2 , 8
                Lcd Hour ; Minu ; Secu ;
                Start Adc
                W = Getadc(7)
                If W < 500 Then
                Select Case W
                Case 400 To 450
                J = 1
                Case 330 To 380
                J = 2
                Case 260 To 305
                J = 3
                Case 180 To 220
                J = 4
                Case 90 To 130
                J = 5
                End Select
                End If
                If J <> Y Then
                Tasten_flag = 1
                Exit For
                End If
                If Tasten_flag = 1 Then
                Exit For
                End If
                Next N
             Case 5
                Cls
                N = 0
                Y = 5
                Tasten_flag = 0
                For N = 1 To 100000000
                Initlcd
                Readeeprom Secu , 1
                Readeeprom Volt , 20
                Locate 1 , 1
                Lcd Freq ; " Hz "
                Locate 2 , 1
                Lcd Secu ; " Sekunde(n) "
                Locate 3 , 1
                Lcd Minu ; " Minute(n) "
                Locate 4 , 1
                Lcd Volt ; " Volt "
                Start Adc
                W = Getadc(7)
                If W < 500 Then
                Select Case W
                Case 400 To 450
                J = 1
                Case 330 To 380
                J = 2
                Case 260 To 305
                J = 3
                Case 180 To 220
                J = 4
                Case 90 To 130
                J = 5
                End Select
                End If
                If J <> Y Then
                Tasten_flag = 1
                Exit For
                End If
                If Tasten_flag = 1 Then
                Exit For
                End If
                Next N
    
          End Select
       End If
    
    Loop
    
    Isr_von_timer1:
    Timer1 = 49910
    Incr Secu
    Incr T
    Return
    
    Isr_von_timer0:
    Timer0 = 255
    Incr F
    Return
    
    Function Tastenabfrage() As Byte
    Local Ws As Word
    
       Tastenabfrage = 0
       Start Adc
       Ws = Getadc(7)
       If Ws < 500 Then
          Select Case Ws
             Case 400 To 450
                Tastenabfrage = 1
             Case 330 To 380
                Tastenabfrage = 2
             Case 260 To 305
                Tastenabfrage = 3
             Case 180 To 220
                Tastenabfrage = 4
             Case 90 To 130
                Tastenabfrage = 5
          End Select
    
       End If
    
    
    End Function
    
    Sub Batteriespannung()
    
    End Sub
    habt ihr eine idee, wie ich das display aktualisieren kann, ohne

    wiat 1
    cls

    ????

    danke für eure bemühungen.
    gruß
    chris

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo chris,

    wenn ich das richtig sehe, möchtest du in der Batteriespannungsmessung, die man mit Taste 1 ausgewählt hat, solange bleiben, bis eine andere Taste gedrückt wurde.

    Die Schleife N, die mit 100 Millionen Durchläufen so klingt, als wenn das sehr lange klappt, ist dadurch aber unberechenbar. Sehr schnell ist die zuende und dein Programm ist (ohne dass du das merkst) wieder in der Tastaturabfrage, in der sich gar nichts tut (insb. keine Batteriespannungsmessung).

    Es müßte besser werden, wenn du die N-Schliefe durch eine WHILE-WEND oder DO-LOOP Konstruktion ersetzt. Die Bedingung hinter WHILE müßte dann sein, dass dein Tasten_flag 0 ist (bei DO-LOOP müßte hinter LOOP UNTIL Tasten_flag = 1 stehen).

    Gruß Dirk

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    hallo dirk,

    danke für deine antwort.

    das mit do_loop hatte ich schon, nur irgendwie schaffe ich es nicht (es ist zwar dann richtig durchgelaufen und man konnte auch immer die schleife verlassen, allerdings wurde der display nie aktualisiert!!

    im prinzip geht es mir darum, eine aktion (z.b. batteriespannungsmessung) solang wie ich will durchlaufen zu lassen, dann mit einem tastendruck zu einer anderen aktion zu springen. allerdings soll sich jede aktion immer (also nach ein paar ms) aktualisieren (z.b. die uhr), damit ich nicht immer erneut auf die taste drücken muss um zu aktualiseren.
    kannst du /könnt ihr mir da weiterhelfen??
    währe nett

    gruß
    chris

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    ... das mit do_loop hatte ich schon, nur irgendwie schaffe ich es nicht (es ist zwar dann richtig durchgelaufen und man konnte auch immer die schleife verlassen, allerdings wurde der display nie aktualisiert!!
    Müßte aber gehen. Stell deinen Code mit der DO-LOOP Schleife hier noch einmal ein.

    Ich habe gerade nebenbei noch gesehen, das da ein Initlcd in der N-Schleife ist.
    Das muss da raus und nur einmalig an den Programmanfang.

    Gruß Dirk

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    das ist mein neuer code (also mit do-loop):

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 32
    $framesize = 64
    
    Declare Function Tastenabfrage() As Byte
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcdbus = 4
    Config Adc = Single , Prescaler = Auto
    Config Pina.7 = Input
    Porta.7 = 1
    
    Config Portc.7 = Output
    Portc.7 = 1
    
    Config Timer1 = Timer , Prescale = 1024
    Enable Timer1
    Enable Interrupts
    Timer1 = 49910
    On Timer1 Isr_von_timer1
    
    Config Timer0 = Counter , Edge = Falling
    Enable Timer0
    Timer0 = 255
    On Timer0 Isr_von_timer0
    
    Dim A As Integer
    Dim Taste As Byte
    Dim Volt As Single
    Dim Secu As Single
    Dim Minu As Single
    Dim Hour As Single
    Dim X As Single
    Dim Tasten_flag As Byte
    Dim F As Single
    Dim T As Single
    Dim Freq As Single
    Dim W As Word
    Dim J As Word
    Dim Y As Word
    Dim S As Single
    Dim Ws As Word
    
    Const Ref = 5 / 1023
    
    Initlcd
    
    A = 1
    X = 1
    Secu = 00
    Minu = 00
    Hour = 00
    T = 0
    Tasten_flag = 0
    F = 0
    
    Cursor Off
    
    Cls
    Locate 1 , 4
    Lcd "Daten-Terminal "
    Locate 2 , 1
    Lcd "Hier koennen Sie"
    Locate 3 , 1
    Lcd "ermittelte Daten"
    Locate 4 , 1
    Lcd "Speichern!!! "
    
    
    Do
    
    Taste = Tastenabfrage()
       If Taste <> 0 Then
    
          Select Case Taste
             Case 1
                Waitms 50
                Cls
                Y = 1
                Tasten_flag = 0
                Do
                Cursor Off
                Start Adc
                W = Getadc(6)
                Volt = W * Ref
                Volt = Volt * 5.2941
                Locate 1 , 1
                Lcd "Die aktuelle "
                Locate 2 , 1
                Lcd "Spannung  betraegt: "
                Locate 3 , 1
                Lcd Volt ; " Volt "
                W = Getadc(7)
                If W < 500 Then
                Select Case W
                Case 400 To 450
                J = 1
                Case 330 To 380
                J = 2
                Case 260 To 305
                J = 3
                Case 180 To 220
                J = 4
                Case 90 To 130
                J = 5
                End Select
                End If
                If J <> Y Then
                Tasten_flag = 1
                Exit For
                End If
                Loop Until Tasten_flag = 1
             Case 2
                Waitms 50
                Cursor Off
                Cls
                Y = 2
                Tasten_flag = 0
                Writeeeprom Secu , 1
                Writeeeprom Minu , 10
                Writeeeprom Volt , 20
                Writeeeprom Freq , 30
                Cls
                Locate 1 , 1
                Lcd "Speichern von: "
                Locate 2 , 1
                Lcd "Frequenz, Laufzeit "
                Locate 3 , 1
                Lcd "und Batteriespannung"
                Locate 4 , 1
                Lcd "Daten jetzt abrufbar"
             Case 3
                Waitms 50
                Cursor Off
                Cls
                Y = 3
                Tasten_flag = 0
                Do
                Cursor Off
                Freq = F / T
                Locate 1 , 1
                Lcd "Sekunden = " ; T
                Locate 2 , 1
                Lcd "Signale = " ; F
                Locate 3 , 1
                Lcd "==> Frequenz:"
                Locate 4 , 1
                Lcd Freq ; "Hz"
                Start Adc
                W = Getadc(7)
                If W < 500 Then
                Select Case W
                Case 400 To 450
                J = 1
                Case 330 To 380
                J = 2
                Case 260 To 305
                J = 3
                Case 180 To 220
                J = 4
                Case 90 To 130
                J = 5
                End Select
                End If
                If J <> Y Then
                Tasten_flag = 1
                Exit For
                End If
                Loop Until Tasten_flag = 1
             Case 4
                Cls
                Y = 4
                Tasten_flag = 0
                Do
                Cursor Off
                S = Secu
                If Secu = 60 Then
                Secu = 00
                Minu = Minu + 1
                Elseif Minu = 60 Then
                Minu = 00
                Hour = Hour + 1
                End If
                Locate 2 , 1
                Lcd "Zeit = "
                Locate 2 , 8
                Lcd Hour ; Minu ; Secu ;
                Start Adc
                W = Getadc(7)
                If W < 500 Then
                Select Case W
                Case 400 To 450
                J = 1
                Case 330 To 380
                J = 2
                Case 260 To 305
                J = 3
                Case 180 To 220
                J = 4
                Case 90 To 130
                J = 5
                End Select
                End If
                If J <> Y Then
                Tasten_flag = 1
                Exit For
                End If
                Loop Until Tasten_flag = 1
             Case 5
                Waitms 50
                Cls
                Y = 5
                Tasten_flag = 0
                Do
                Cursor Off
                Readeeprom Secu , 1
                Readeeprom Minu , 10
                Readeeprom Volt , 20
                Readeeprom Freq , 30
                Locate 1 , 1
                Lcd Freq ; " Hz "
                Locate 2 , 1
                Lcd Secu ; " Sekunde(n) "
                Locate 3 , 1
                Lcd Minu ; " Minute(n) "
                Locate 4 , 1
                Lcd Volt ; " Volt "
                Start Adc
                W = Getadc(7)
                If W < 500 Then
                Select Case W
                Case 400 To 450
                J = 1
                Case 330 To 380
                J = 2
                Case 260 To 305
                J = 3
                Case 180 To 220
                J = 4
                Case 90 To 130
                J = 5
                End Select
                End If
                If J <> Y Then
                Tasten_flag = 1
                Exit For
                End If
                Loop Until Tasten_flag = 1
    
          End Select
       End If
    
    Loop
    
    Isr_von_timer1:
    Timer1 = 49910
    Incr Secu
    Incr T
    Toggle Portc.7
    Return
    
    Isr_von_timer0:
    Timer0 = 255
    Incr F
    Return
    
    Function Tastenabfrage() As Byte
    
    
       Tastenabfrage = 0
       Start Adc
       Ws = Getadc(7)
       If Ws < 500 Then
          Select Case Ws
             Case 400 To 450
                Tastenabfrage = 1
             Case 330 To 380
                Tastenabfrage = 2
             Case 260 To 305
                Tastenabfrage = 3
             Case 180 To 220
                Tastenabfrage = 4
             Case 90 To 130
                Tastenabfrage = 5
          End Select
    
       End If
    
    
    End Function
    
    End
    wenn ich jetzt auf taste 5 drücke, dann zeigt er mir überall 0,0 an ,außer bei secunden. außerdem muss ich, wenn ich eine taste drücke mind. 200ms oder so drauf drücken, anstonsten kommt wieder die anzeige:

    daten-terminal
    hier koennen sie
    ermittelte daten
    speichern!!!

    woran liegt das??
    gruß
    chris

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    ...das ist mein neuer code (also mit do-loop):
    Sieht doch gut aus.

    Dass das mit dem Speichern/Lesen im EEPROM nicht funktioniert, liegt aber nicht am DO-LOOP, sondern an deiner Verwendung von Readeeprom. Ich würde die neuere Syntax mit ...
    Dim Variable As Eram Byte
    ... nehmen. Damit kann man auch in Schleifen lesen und schreiben.

    Kleiner Hinweis noch: Ich wäre mit dem allzu häufigen Schreiben/Lesen des EEPROMs vorsichtig. Die Lebensdauer ist begrenzt. Eigentlich speichert man da nur etwas rein, bevor der uC abgeschaltet wird und liest das wieder ein, wenn er neu gestartet wird;- oder man schreibt da wichtige einmalige Programmeinstellungen rein, die dauerhaft so bleiben und wenig geändert werden (z.B. Eichwerte, Benutzereinstellungen ...).

    Gruß Dirk

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    warum funktioniert den das mit dem readeeprom nicht??
    mit dim variable as eram byte kenn ich mit nicht aus, vielleicht hast ein beispiel für mich?!?!

    gruß
    chris

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo chris,

    wenn du die Variablen so definiert hast ...
    Dim Normalevariable As Byte
    Dim Eramvariable As Eram Byte
    ... kannst du sie wie eine ganz normale Variable benutzen, also schreiben mit ...
    Eramvariable = 10
    ... oder lesen aus dem EEPROM mit ...
    Normalevariable = Eramvariable

    Ein Beispiel steht in der Bascom-Hilfe unter Readeeprom, dort auch der Hinweis, dass der Befehl Readeeprom nur wegen der Kompatibilität zum Bascom-8051 vorhanden ist.

    Gruß Dirk

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    hallo dirk,

    danke für deine antwort, allerdings würde ich das ganze trotzdem gerne mit readeeprom machen, da das für mich besser geeignet ist

    kannst du mir bitte sagen, warum das so nicht funktioniert, wie ich es oben in dem beispiel verwendet habe!??!?

    gruß
    chris

Berechtigungen

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

LiTime Speicher und Akkus