Hallo Stefan,
hast du dir im Simulator mal angesehen, ob bei beiden Versionen die gleichen bits in den relevanten Registern gesetzt werden?
Hi,
ich habe da mal eine Frage.
wenn ich ein Touch Panel folgendermaßen Programmiere funktioniert dies
Auf folgendem Weg funktioniert dies nicht. Wo liegt mein Fehler? Würde mich über Hilfe sehr freuen.Code: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
Gruß, stafen8010Code: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
Geändert von stefan8010 (22.10.2011 um 11:45 Uhr)
Hallo Stefan,
hast du dir im Simulator mal angesehen, ob bei beiden Versionen die gleichen bits in den relevanten Registern gesetzt werden?
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
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)
Code: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
Hallo for_ro,
Das ist eine gute Frage. Anbei noch mal die beiden Programme. Ich habe beide jetzt auf nur DDRx Befehle geändert.Warum mischt du eigentlich die Config Portx und die DDRx Befehle?
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
Programm welches nicht funktioniertCode:$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
Gruß, stefan8010Code:$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
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:
Ich hätte es eher so gemacht:Code: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 weiß auch nicht, ob Bascom die ZeileCode: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
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.
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:
Code:W1 = Adcl W2 = Adch * 256 Y = W1 + W2Ich möchte nach auslesen der x,y Werte, mit anschließender zuweisung des jeweiligen betätigten Bereichs/ "Taste", den zugewiesenen Bereichswert über TWI weiterverwenden.warum willst du das eigentlich machen
Gruß, stefan8010
Und das geht mit Und das geht mit den Bascom Befehlen nicht?
Hallo for_ro,
Genau.Und das geht mit den Bascom Befehlen nicht?
Gruß, stefan8010
Lesezeichen