Analoges Touch- Panel an NXT:
Touch Panel (EA Touch 102-1) sendet Werte an einen Mikrokontroller. Danach werden Analogwerte über ein PCF8591 an den NXT gesendet. Die Kommunikation zwischen NXT (Master) und PCF8591 (Slave) erfolgt über I2C.
![]() |
![]() |
|
|
Schaltplan
![]() |
![]() |
|
| Schaltplan | Touch Panel EA Touch 102-1 | |
Bascom Quellcode für ATmega32
'********************************************************************
'Touch Panel Koordinaten auslesen; ATmega32-Board
'Daten werden über D/A- Wandler (R;2R) und PCF8591 an NXT gesendet
'2011-10
'www.freggelweb.de
'********************************************************************
$regfile = "M32def.dat"
$crystal = 7372800
$baud = 9600
$hwstack = 100
$swstack = 100
$framesize = 100
Config Portb = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc
'Touch Koordinaten
Dim X As Word
Dim Y As Word
'Welcher Bereich wurde betätigt
Dim Keypressed As Byte
Dim Row As Byte
Dim Keyarray(3) As Byte
Dim Col As Byte
Dim Key As Byte
Dim Keyzaehler As Byte
Start Adc
Do
Ddra.0 = 1 'Top
Ddra.2 = 1 'Bottom
Ddra.1 = 0 'Right = Eingang
Ddra.3 = 0 'Left = Eingang
Porta.0 = 1 'Top = High
Porta.2 = 0 'Bottom= Low
'Waitms 10
Y = Getadc(3)
Y = 1024 - Y
Ddra.1 = 1 'Right
Ddra.3 = 1 'Left
Ddra.0 = 0 'Top = Eingang
Ddra.2 = 0 'Bottom = Eingang
Porta.3 = 1 'Left = High
Porta.1 = 0 'Right = Low
'Waitms 10
X = Getadc(2)
X = 1024 - X
'---- Welcher Bereich ----
'Row|Col |
' | 10 20 30 40 |
' ---------------------
' 1 | | | | |
' ---------------------
' 2 | | | | |
' ---------------------
' 3 | | | | |
'------------------------
Select Case X ' X- Bereich
Case 150 To 220 : Col = 10
Case 221 To 420 : Col = 20
Case 421 To 640 : Col = 30
Case 641 To 850 : Col = 40
Case Else Col = 0
End Select
Select Case Y 'Y- Bereich
Case 250 To 360 : Row = 1
Case 361 To 540 : Row = 2
Case 541 To 730 : Row = 3
Case Else Row = 0
End Select
Key = Col + Row
If Key > 0 Then
Keyarray(keyzaehler) = Key
Incr Keyzaehler
If Keyzaehler > 3 Then Keyzaehler = 1
If Keyarray(1) = Keyarray(2) Then
If Keyarray(2) = Keyarray(3) Then
Keypressed = Key
End If
End If
End If
'---- für PCF8591 ----
Select Case Keypressed
Case 21 :
'vor Dez.127
Portb = &B01111111
Case 32 :
'rechts Dez.63
Portb = &B00111111
Case 23 :
'zurück Dez.31
Portb = &B00011111
Case 12 :
'links Dez.15
Portb = &B00001111
Case 41 :
'hoch Dez.7
Portb = &B00000111
Case 43 :
'runter Dez.3
Portb = &B00000011
Case Else
Portb = &B00000000
End Select
Loop
End
Programmierung mit LabVIEW:
Bsp:
Im Frontpanel wird angezeigt, welcher Bereich/ welche "Taste" vom Touch- Panel betätigt wurde
Adresse von PCF8591
| PCF8591 | ||||||||
| fester Bereich | variabler Bereich | variable "schreiben/lesen" |
||||||
| 1 | 0 | 0 | 1 | A2 | A1 | A0 | R/W | |
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Bit |
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | Dezimal |
| immer Dez.144 |
Ax an Masse -> Binär 0 Ax an VDD -> Binär 1 |
0 | ||||||
| Bsp.: A0-A2 an Masse | ||||||||
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Binär |
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | Dezimal |
| Adresse = 128 + 16 = 144 | ||||||||
Reg von PCF8591
| PCF8591 | ||||||||
| 0 | Freigabe Analogausgang |
Modus Analogeingänge |
0 | Auto- increment |
A/D Kanal Nummer |
|||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Bit |
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | Dezimalwert |
| Bsp.: Modus Analogeingänge: vier einfache Eingänge -> 00 Autoincrement: nein -> 0 Freigabe Analogausgang: nein -> 0 aus Datenblatt |
||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -> Reg = 0 |
VI für Direkt- Modus
| Frontpanel |
![]() |
| Blockdiagramm |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Ich kann keinerlei Haftung für die Schaltungen übernehmen und auch keine Funktionsfähigkeit garantieren. Der Nachbau und Einsatz der hier veröffentlichten Schaltungen erfolgt auf eigene Gefahr. Ich übernehme keinerlei Garantie. Die VDE-Vorschriften sind zu beachten.













