PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : adc touch panel



stefan8010
22.10.2011, 10:59
Hi,

ich habe da mal eine Frage.

wenn ich ein Touch Panel folgendermaßen Programmiere funktioniert dies

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Do
Config Portc.0 = Output
Config Portc.2 = Output
Portc.0 = 1
Portc.2 = 0
Ddrc.1 = 0
Ddrc.3 = 0
Waitms 20
Y = Getadc(1)
Y = 1024 - Y
Locate 1 , 1
Lcd "y:" ; Y

Config Portc.1 = Output
Config Portc.3 = Output
Portc.3 = 1
Portc.1 = 0
Ddrc.0 = 0
Ddrc.2 = 0
Waitms 20
X = Getadc(0)
X = 1024 - X
Locate 1 , 9
Lcd "x:" ; X
Loop
End


Auf folgendem Weg funktioniert dies nicht. Wo liegt mein Fehler? Würde mich über Hilfe sehr freuen.

Admux = Bits(refs0)
Adcsra = Bits(aden , Adsc , Adps2 , Adps1)

Do
Adcsra.adsc = 1
Config Porta.0 = Output
Config Porta.2 = Output
Porta.0 = 1
Porta.2 = 0
Admux.mux0 = 1
Admux.mux1 = 1
y = Adc
Waitms 10

Locate 1 , 1
Lcd "y:" ; Readadc

Adcsra.adsc = 1
Config Porta.1 = Output
Config Porta.3 = Output
Porta.3 = 1
Porta.1 = 0
Admux.mux0 = 0
Admux.mux1 = 1
x = Adc
Waitms 10

Locate 2 , 1
Lcd "x:" ; Readadc

Loop
End


Gruß, stafen8010

for_ro
22.10.2011, 12:30
Hallo Stefan,
hast du dir im Simulator mal angesehen, ob bei beiden Versionen die gleichen bits in den relevanten Registern gesetzt werden?

stefan8010
22.10.2011, 14:12
Hallo for_ro,

wenn ich für die Messung des Werts y
Ddrc.1 = 0
Ddrc.3 = 0
zwischen
Porta.2 = 0
Admux.mux0 = 1
einfüge und dies entspechend für die Messung des Werts x ergänze sind die Register Identisch.
Funktionieren tut dies aber auch nicht.

Es funktioniert nur, wenn ich nur den x- Wert oder nur den y- Wert auslese und den jeweiligen anderen Bereich auskommentiere. Messung der x uns y- Werte in einem Programm zusammen funktioniert nicht.

Gruß, stefan8010

for_ro
22.10.2011, 14:45
Hallo Stefan,
ich meinte eigentlich, ob die ADC Register ADMUX und ADCSRAgleich gesetzt sind.
Die Touchpanel werden ja so ausgelesen, dass du 2 Anschlüsse auf Ausgang legst und dann den Wert an den anderen beiden misst. Dann umgekehrt. Dies machst du in der zweiten Variante aber nicht.
Warum mischt du eigentlich die Config Portx und die DDRx Befehle?
Also so (ohne die ADC Sachen überprüft zu haben)


Adcsra.adsc = 1
ddra.0 = 1
ddra.2 = 1
ddra.1 = 0
ddra.3 = 0
Porta.0 = 1
Porta.2 = 0
Admux.mux0 = 1
Admux.mux1 = 1
y = Adc
Waitms 10

Locate 1 , 1
Lcd "y:" ; Readadc

Adcsra.adsc = 1
ddra.1 = 1
ddra.3 = 1
ddra.0 = 0
ddra.2 = 0
Porta.3 = 1
Porta.1 = 0
Admux.mux0 = 0
Admux.mux1 = 1
x = Adc
Waitms 10

Locate 2 , 1
Lcd "x:" ; Readadc

stefan8010
22.10.2011, 16:52
Hallo for_ro,


Warum mischt du eigentlich die Config Portx und die DDRx Befehle?
Das ist eine gute Frage. Anbei noch mal die beiden Programme. Ich habe beide jetzt auf nur DDRx Befehle geändert.
Daneben habe ich mal die entsprechenden Werte des Simulators für ADMUX, ADCSRA, PortA und DDRA geschrieben. Ich kann keinen Unterschied finden.

Programm welches funktioniert

$regfile = "M32def.dat"
$crystal = 7372800
$baud = 9600
$hwstack = 100
$swstack = 100
$framesize = 100

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cursor Off
Cls

Config Adc = Single , Prescaler = Auto , Reference = Avcc ADMUX 40 / ADCSRA 86

Dim X As Word
Dim Y As Word

Start Adc ADCSRA 86

Do
Ddra.0 = 1 DDRA 01 bzw. 0B
Ddra.2 = 1 DDRA 05 bzw. 0F
Ddra.1 = 0 DDRA 05 bzw. 0D
Ddra.3 = 0 DDRA 05 bzw. 05
Porta.0 = 1 PORTA 01 bzw. 09
Porta.2 = 0 PORTA 01 bzw. 09
Waitms 10
Y = Getadc(3) ADMUX 43 / ADCSRA 86
Y = 1024 - Y
Locate 1 , 1
Lcd "y:" ; Y

Ddra.1 = 1 DDRA 07
Ddra.3 = 1 DDRA 0F
Ddra.0 = 0 DDRA 0E
Ddra.2 = 0 DDRA 0A
Porta.3 = 1 PORTA 09
Porta.1 = 0 PORTA 09
Waitms 10
X = Getadc(2) ADMUX 42 / ADCSRA 86
X = 1024 - X
Locate 1 , 9
Lcd "x:" ; X
Loop
End

Programm welches nicht funktioniert

$regfile = "M32def.dat"
$crystal = 7372800
$baud = 9600
$hwstack = 100
$swstack = 100
$framesize = 100

$sim

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cursor Off
Cls

Dim Y As Word
Dim X As Word

Admux = Bits(refs0) ADMUX 40
Adcsra = Bits(aden , Adsc , Adps2 , Adps1) ADCSRA 86

Do
Adcsra.adsc = 1 ADCSRA 86
ddra.0 = 1 DDRA 01 bzw. 0B
ddra.2 = 1 DDRA 05 bzw. 0F
ddra.1 = 0 DDRA 05 bzw. 0D
ddra.3 = 0 DDRA 05 bzw. 05
Porta.0 = 1 PORTA 01 bzw. 09
Porta.2 = 0 PORTA 01 bzw. 09
Admux.mux0 = 1 ADMUX 41 bzw. 43
Admux.mux1 = 1 ADMUX 43
y = Adc
Waitms 10
Locate 1 , 1
Lcd "y:" ; y

Adcsra.adsc = 1 ADCSRA 86
Ddra.1 = 1 DDRA 07
Ddra.3 = 1 DDRA 0F
Ddra.0 = 0 DDRA 0E
Ddra.2 = 0 DDRA 0A
Porta.3 = 1 PORTA 09
Porta.1 = 0 PORTA 09
Admux.mux0 = 0 ADMUX 42
Admux.mux1 = 1 ADMUX 42
X = Adc
Waitms 10
Locate 2 , 1
Lcd "x:" ; X
Loop
End

Gruß, stefan8010

for_ro
24.10.2011, 21:36
Hallo Stefan,
ich habe den ADC noch nicht auf die Register Art benutzt - warum willst du das eigentlich machen - aber die Reihenfolge deiner Befehle kommt mir doch etwas seltsam vor:

Adcsra.adsc = 1 ' ADCSRA 86
Ddra.0 = 1 ' DDRA 01 bzw. 0B
Ddra.2 = 1 ' DDRA 05 bzw. 0F
Ddra.1 = 0 ' DDRA 05 bzw. 0D
Ddra.3 = 0 ' DDRA 05 bzw. 05
Porta.0 = 1 ' PORTA 01 bzw. 09
Porta.2 = 0 ' PORTA 01 bzw. 09
Admux.mux0 = 1 ' ADMUX 41 bzw. 43
Admux.mux1 = 1 ' ADMUX 43
Y = Adc

Ich hätte es eher so gemacht:

Ddra.0 = 1 ' DDRA 01 bzw. 0B
Ddra.2 = 1 ' DDRA 05 bzw. 0F
Ddra.1 = 0 ' DDRA 05 bzw. 0D
Ddra.3 = 0 ' DDRA 05 bzw. 05
Porta.0 = 1 ' PORTA 01 bzw. 09
Porta.2 = 0 ' PORTA 01 bzw. 09
Admux.mux0 = 1 ' ADMUX 41 bzw. 43
Admux.mux1 = 1 ' ADMUX 43
Adcsra.adsc = 1 ' ADCSRA 86
While Adcsra.adsc = 1 'Warteschleife bis Konvertierung fertig ist
Wend
Y = Adc

Ich weiß auch nicht, ob Bascom die Zeile
Y = ADC
richtig umsetzt. Laut Datenblatt:

When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if
the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read
ADCH. Otherwise, ADCL must be read first, then ADCH.

stefan8010
25.10.2011, 17:39
Hallo for_ro,

vielen Dank für deine Hilfe!

So scheint es zu funktionieren, nur erhalte ich irgendwie Werte zwischen ca. 1700 - 9000
Auch wenn ich anstelle ADC folgenden Code verwende:


W1 = Adcl
W2 = Adch * 256
Y = W1 + W2


warum willst du das eigentlich machen
Ich möchte nach auslesen der x,y Werte, mit anschließender zuweisung des jeweiligen betätigten Bereichs/ "Taste", den zugewiesenen Bereichswert über TWI weiterverwenden.

Gruß, stefan8010

for_ro
25.10.2011, 19:43
Und das geht mit

Ich möchte nach auslesen der x,y Werte, mit anschließender zuweisung des jeweiligen betätigten Bereichs/ "Taste", den zugewiesenen Bereichswert über TWI weiterverwenden.
Und das geht mit den Bascom Befehlen nicht?

stefan8010
26.10.2011, 07:47
Hallo for_ro,


Und das geht mit den Bascom Befehlen nicht?
Genau.

Gruß, stefan8010