PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : display aktualisieren



Che Guevara
31.08.2008, 01:48
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:



$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

Dirk
31.08.2008, 12:38
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

Che Guevara
31.08.2008, 12:51
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

Dirk
31.08.2008, 13:38
... 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

Che Guevara
31.08.2008, 13:53
das ist mein neuer code (also mit do-loop):



$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

Dirk
31.08.2008, 14:09
...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

Che Guevara
31.08.2008, 23:31
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

Dirk
01.09.2008, 03:11
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

Che Guevara
02.09.2008, 19:58
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