Start
Experimente
Grundlagen
Produkte
- eDIP240-7 -- Demo -- Bascom 1 -- Bascom 2 -- Bascom 3 -- Bascom 4
Neues
Impressum
|
eDIP 240-7 Bascom: Berührungsdauer auswerten
Verstellen eines analogen Ausgangswerts
Im den meisten Fällen wird man jeweils eine
Berührung der Touch-Fläche einem Ereignis zuordnen. Es kann
jedoch auch sinnvoll sein, die Dauer eines Tastendrucks auszuwerten.
Hier soll eine PWM-Ausgangsspannung über zwei Tasten eingestellt
werden. Solange jemand auf eine Taste drückt, wird der
Ausgangswert kontinuierlich erhöht bzw. verkleinert. Ein
längerer Tastendruck führt zusätzlich zu einer
Vergrößerung der Änderungsgeschwindigkeit. So kann der
gesamte PWM-Bereich zwischen 0 und 1023 bequem eingestellt
werden. Auf dem Display erscheint neben dem PWM-Ausgabewert auch
ein Analogwert vom Eingang ADC0.
Die Ansteuerung verwendet die
bereits vorhandenen Display-Subs. Neu hinzugekommen ist eine erweiterte
Abfrage mit der Sub Read_edip_repeating. Bei jedem Aufruf wird
der gleiche Tastencode zurückgeliefert, solange die Taste noch
gedrückt ist. Erst beim Loslassen einer Taste ändert sich der
Code auf den Wert Null. Die Tastencodes müssen hierbei so
festgelegt werden, dass der Tastencode über 100 und der Endecode
über 200 liegt.
Bei einem längeren Tastendruck wird
die Änderungsgeschwindigkeit des Ausgabewerts kontinuierlich
gesteigert. Dazu wird die Wartezeit bis zur nächsten Anzeige und
Abfrage von anfangs 200 ms allmählich bis auf 30 ms reduziert.
Außerdem ändert sich nach einiger Zeit die Schrittweite von
anfangs 1 auf 5 und schließlich auf 10. So kann man sowohl
eine Feineinstellung durchführen als auch in überschaubarer
Zeit den gesamten Bereich zwischen 0 und 1023 durchfahren.
|
'-------------------------------------------------------------- ' eDIP240-7 ' ATMEGA644P, 11,0592 MHz ' I2C-Display ' Edip3.bas '--------------------------------------------------------------
$regfile = "m644Pdef.dat" $crystal = 11059200 $hwstack = 64 $swstack = 64 $framesize = 64
Dim Dat As Byte Dim Sbuf As Byte Dim Rbuf As Byte Dim Bcc As Byte Dim Touchcode As Byte Dim Endcode As Byte Dim C As String * 1 Dim N As Integer Dim Buffer As String * 24 Dim Time_repeat As Integer
Dim Count As Integer Dim U As Integer
Declare Sub Write_edip Declare Sub Read_edip Declare Sub Read_edip_repeating Declare Sub Buffer_edip
Portb = 255 'Pullups
Config Sda = Portb.2 Config Scl = Portb.3
Const Slave = &HDC 'I2C write DC Const Slaverd = &HDD 'I2C read DD
I2cinit
Config Adc = Single , Prescaler = 32 , Reference = Off ' Pre 8...32 Start Adc Config Timer1 = Pwm , Prescale = 8 , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down Start Timer1
Buffer = Chr(27) + "DL" + Chr(13) 'clear Write_edip Buffer = Chr(27) + "ZF" + Chr(2) + Chr(13) '2 = FONT6x8 Write_edip
'Touch button at 10,10;60,30, Touchcode 121, Endcode = 250 Buffer = Chr(27) + "AT" + Chr(10) + Chr(10) + Chr(60) + Chr(30) + Chr(121) + Chr(250) + "+" + Chr(13) Write_edip 'Touch button at 70,10;120,30, Touchcode 122, Endcode = 250 Buffer = Chr(27) + "AT" + Chr(70) + Chr(10) + Chr(120) + Chr(30) + Chr(122) + Chr(250) + "-" + Chr(13) Write_edip
Time_repeat = 200 Do If Touchcode = 0 Then Read_edip Else Read_edip_repeating If Touchcode = 121 Then '+ Endwert If Time_repeat > 90 Then Count = Count + 1 If Time_repeat < 91 Then Count = Count + 5 If Time_repeat < 11 Then Count = Count + 10 If Count > 1023 Then Count = 1023 End If If Touchcode = 122 Then '+ Endwert If Time_repeat > 90 Then Count = Count - 1 If Time_repeat < 91 Then Count = Count - 5 If Time_repeat < 11 Then Count = Count - 10 If Count < 0 Then Count = 0 End If
If Touchcode > 100 Then Time_repeat = Time_repeat - 2 If Time_repeat < 30 Then Time_repeat = 30 If Touchcode = 0 Then Time_repeat = 200 Waitms Time_repeat
Pwm1a = Count Buffer = Chr(27) + "ZL" + Chr(10) + Chr(60) + "PWM1A = " + Str(count) + " " + Chr(13) Write_edip U = Getadc(0) Buffer = Chr(27) + "ZL" + Chr(10) + Chr(80) + "ADC(0) = " + Str(u) + " " + Chr(13) Write_edip
Loop
'***************************** eDIP240-7 ************************
…
Sub Read_edip_repeating ' last touchcode relaining Endcode = 0 Buffer_edip If Sbuf > 0 Then I2cstart I2cwbyte Slave Dat = 18 'DC2 I2cwbyte D N = 1 '1 Byte Bcc = 18 + N I2cwbyte N C = "S" Dat = Asc(c) Bcc = Bcc + Dat I2cwbyte Dat '"I" I2cwbyte Bcc I2cstop I2cstart I2cwbyte Slaverd I2crbyte Dat , Ack '06=ACK I2crbyte Dat , Ack '17=DC1 I2crbyte Dat , Ack '4... I2crbyte Dat , Ack 'bufferdata I2crbyte Dat , Ack 'bufferdata I2crbyte Dat , Ack 'bufferdata I2crbyte Dat , Ack 'bufferdata If Dat > 100 Then Touchcode = Dat 'Touchcode > 100 If Dat > 200 Then Endcode = Dat 'Tastencode > 200 = Endcode If Endcode > 200 Then Touchcode = 0 I2crbyte Dat , Nack 'BCC I2cstop End If End Sub
End
|