TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: juanez en 16 de Septiembre de 2008, 15:12:29
-
Hola, estoy probando un glcd-touchscreen, en concreto este :
http://www.circuit-ed.com/128x64-GLCD-BlWh-w-Touchscreen-P146C8.aspx
El glcd, funciona perfectamente, pero el problema lo tengo con el touchscreen.
Es un touchscreen resistivo, este tiene 4 lineas X+,x-,Y+,y- que van conectadas directamente a las lineas RA0,RA1,RA2,RA3 de un pic 18F4553.
El problema es que no encuentro ninguna libreria para el ccs, y no consigo hacer funcionar el touchscreen correctamente.
En la siguiente pagina de jvm, se puede ver el glcd touchscreen funcionando:
http://www.jvmbots.com/viewtopic.php?t=684&postdays=0&postorder=asc&start=15
El problema es que esta echo en mikrobasik y yo quiero hacerlo con ccs.
El codigo en mikrobasik que se encarga de leer el touchscreen es este:
-------------------------------------------------------------------------------------
LeeTouch:
ADCON1 = 6
TRISA.0=0 ' PORTA.0 es Salida
TRISA.2=0 ' PORTA.2 es Salida
PORTA.0=1 ' Establecemos PORTA.0 a 1
PORTA.2=0 ' Borramos PORTA.2
TRISA.1=1 ' PORTA.1 es Entrada
TRISA.3=1 ' PORTA.3 es Entrada (ADC3)
ADCON1 = 0 ' Configuracion analogica de PORTA
Delay_ms(20) ' Tiempo de estabilizacion de puerto
Y = Adc_Read(3) ' Leer el adc(3) correspondiente al valor de Y
ADCON1 = 6
TRISA.1=0 ' PORTA.1 es Salida
TRISA.3=0 ' PORTA.3 es Salida
PORTA.1=0 ' Borramos PORTA.1
PORTA.3=1 ' Establecemos PORTA.3 a 1
TRISA.0=1 ' PORTA.0 es Entrada
TRISA.2=1 ' PORTA.2 es Entrada (ADC2)
ADCON1 = 0 ' Configuracion analogica de PORTA
Delay_ms(20) ' Tiempo de estabilizacion de puerto
X = Adc_Read(2) ' Leer el adc(2) correspondiente al valor de X
-----------------------------------------------------------------------------------------------
EL problema es que en ccs me da error al poner el adcon1.
¿Alguien tienen alguna libreria para el touchscreen?
Saludos
-
Hola.
La mejor manera de relacionar esa libreria con el CCS es haciendo el direccionamiento de los registros. Esto se hace con las directivas de compilacion #byte y #bit. De esta manera se asigna el label ADCONx al registro ADCONx y puedes usarla tal cual como esta.
Saludos
-
Já adaptei um exemplo em um projeto que fiz.
Em CCS o codigo adcon1seria como você colocar desta forma setup_adc_ports( A0 A1);Esta em MIKROC porem é facilmente adaptavel.
// * Project Name:
// TouchPanel (Demo for working with TouchPanel Controller)
// * Target Platform:
// PIC
// * Copyright:
// (c) mikroElektronika, 2007.
// * Revision History:
// 20071225:
// - Initial release.
// * Description:
// this code in intended to work with TouchPanel and GLCD
// Target devices are PIC16 and PIC18 family MCU's, any speed.
// * Test configuration:
// MCU: PIC18F4520
// Dev.Board: EasyPic5
// Oscillator: HS, 8.000MHz
// Ext. Modules: TouchPanel, GLCD
// SW: mikroC v8.0
// * NOTES:
// - Turn off PORTA LEDs, 7Seg Display Switches, ADC jumpers and PORTA pull-up/down resistors.
// - Turn on GLCD backlight and TouchPanel Contoller switches on EasyPIC5 board.
char write_erase, pen_size;
unsigned int x_coord, y_coord;
long x_coord128, y_coord64; // scaled x-y position
int cal_x_min, cal_y_min, cal_x_max, cal_y_max; // calibration constants
char write_msg[] = "WRITE"; // GLCD menu messages
char clear_msg[] = "CLEAR";
char erase_msg[] = "ERASE";
const unsigned int ADC_THRESHOLD = 900; // Threshold value for press detecting
// returns 1 if TouchPanel is pressed, 0 otherwise
char PressDetect() {
unsigned adc_rd;
char result;
// PRESS detecting
PORTC.F0 = 0; // DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
PORTC.F1 = 0; // DRIVEB = 0 (BOTTOM drive off)
Delay_us(3500);
adc_rd = ADC_read(1); // Read RA1 (READ-Y)
result = (adc_rd > ADC_THRESHOLD); // if logical one is detectet
//debouncing, repeat detecting after 2ms
Delay_ms(2);
adc_rd = ADC_read(1);
result = result & (adc_rd > ADC_THRESHOLD);
return result;
}
unsigned int GetX() {
unsigned int result;
//reading X
PORTC.F0 = 1; // DRIVEA = 1 (LEFT drive on, RIGHT drive on, TOP drive off)
PORTC.F1 = 0; // DRIVEB = 0 (BOTTOM drive off)
Delay_ms(5);
result = ADC_read(0); // reading X value from RA0 (BOTTOM)
return result;
}
unsigned int GetY() {
unsigned int result;
//reading Y
PORTC.F0 = 0; // DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
PORTC.F1 = 1; // DRIVEB = 1 (BOTTOM drive on)
Delay_ms(5);
result = ADC_read(1); // reading Y value from RA1 (from LEFT)
return result;
}
void Calibrate() {
Glcd_Dot(0,63,1);
Glcd_Write_Text("TOUCH BOTTOM LEFT",10,3,1);
while (!PressDetect());
// get calibration constants (reading and compensating TouchPanel nonlinearity)
cal_x_min = GetX() - 10;
cal_y_min = GetY() - 10;
Delay_ms(1000);
Glcd_Fill(0);
Glcd_Dot(127,0,1);
Glcd_Write_Text("TOUCH UPPER RIGHT",10,4,1);
while (!PressDetect()) ;
// get calibration constants (reading and compensating TouchPanel nonlinearity)
cal_x_max = GetX() + 5;
cal_y_max = GetY() + 5;
Delay_ms(1000);
}
void main() {
ADCON1 = 0x0F;
PORTA = 0x00;
TRISA = 0x03; // RA0 i RA1 are analog inputs
PORTC = 0 ;
TRISC = 0 ; // PORTC is output
Glcd_Init(&PORTB, 0, 1, 2, 3, 5, 4, &PORTD); // Glcd_Init_EP5, see Autocomplete
Glcd_Fill(0);
Glcd_Set_Font(FontSystem5x8, 5, 8, 32);
Glcd_Write_Text("CALIBRATION", 24, 3, 1);
Delay_ms(1500);
Glcd_Fill(0);
Calibrate();
Glcd_Fill(0);
Glcd_Write_Text("WRITE ON SCREEN", 24, 4, 1) ;
Delay_ms(1000);
Glcd_Fill(0);
Glcd_Fill(0);
Glcd_V_Line(0,7,0,1);
Glcd_Write_Text(clear_msg,1,0,0);
Glcd_V_Line(0,7,97,1);
Glcd_Write_Text(erase_msg,98,0,0);
//Pen Menu:
Glcd_Rectangle(41,0,52,9,1);
Glcd_Box(45,3,48,6,1);
Glcd_Rectangle(63,0,70,7,1);
Glcd_Box(66,3,67,4,1);
Glcd_Rectangle(80,0,86,6,1);
Glcd_Dot(83,3,1);
write_erase = 1;
pen_size = 1;
while (1) {
if (PressDetect()) {
// after a PRESS is detected read X-Y and convert it to 128x64 space
x_coord = GetX() - cal_x_min;
y_coord = GetY() - cal_y_min;
x_coord128 = (x_coord * 128l) / (cal_x_max - cal_x_min);
y_coord64 = (64 -(y_coord *64) / (cal_y_max - cal_y_min));
if ((x_coord128 < 0) || (x_coord128 > 127))
continue;
if ((y_coord64 < 0) || (y_coord64 > 63))
continue;
//if clear is pressed
if ((x_coord128 < 31) && (y_coord64 < 8)) {
Glcd_Fill(0);
//Pen Menu:
Glcd_Rectangle(41,0,52,9,1);
Glcd_Box(45,3,48,6,1);
Glcd_Rectangle(63,0,70,7,1);
Glcd_Box(66,3,67,4,1);
Glcd_Rectangle(80,0,86,6,1);
Glcd_Dot(83,3,1);
Glcd_V_Line(0,7,0,1);
Glcd_Write_Text(clear_msg,1,0,0);
Glcd_V_Line(0,7,97,1);
if (write_erase)
Glcd_Write_Text(erase_msg,98,0,0);
else
Glcd_Write_Text(write_msg,98,0,0);
}
//if write/erase is pressed
if ((x_coord128 > 96) && (y_coord64 < 8)) {
if (write_erase) {
write_erase = 0;
Glcd_Write_Text(write_msg,98,0,0);
Delay_ms(500);
}
else {
write_erase = 1;
Glcd_Write_Text(erase_msg,98,0,0);
Delay_ms(500);
}
}
//if pen size is selected
if ((x_coord128 >= 41) && (x_coord128 <= 52) && (y_coord64 <= 9))
pen_size = 3;
if ((x_coord128 >= 63) && (x_coord128 <= 70) && (y_coord64 <= 7))
pen_size = 2;
if ((x_coord128 >= 80) && (x_coord128 <= 86) && (y_coord64 <= 6))
pen_size = 1;
if (y_coord64 < 11)
continue;
switch (pen_size) {
case 1 : Glcd_Dot(x_coord128, y_coord64, write_erase); break;
case 2 : Glcd_Box(x_coord128, y_coord64, x_coord128 + 1, y_coord64 + 1, write_erase); break;
case 3 : Glcd_Box(x_coord128-1, y_coord64-1, x_coord128 + 2, y_coord64 + 2, write_erase); break;
}
}
}
}
Abraços
Ivan
-
Hola
Em CCS o codigo adcon1seria como você colocar desta forma setup_adc_ports( A0 A1);
El ADCON1 es un registro del PIC, mientras que el setup_adc_ports(); es una funcion que modifica tanto al ADCON1 como al ADCON0, tienen cierta relacion, pero no es lo mismo.
Para trabajar con los nombres de los registros, tan solo basta colocar lo siguiente (por ejemplo para el PORTA) :
#BYTE PORTA=0xF80
La direccion del registro correspondiente esta en el datasheet.
Si se quiere seleccionar un bit del registro:
#BIT A0=PORTA.0
Con esto ya podemos asignar los valores al registro como estan en la libreria que mencionas.
Saludos
-
GOOGLE idiomas
Estoy de acuerdo en parte con usted MLO_, sé que ADCON1 es un registro de la PIC, y también sé que setup_adc_ports () es una función, sólo tratando de explicar a juanez que ambos tienen el mismo efecto, la diferencia en este compilador, y cómo tratar a sus periféricos, como el MIKROC no disponen de esta función setup_adc_ports ().
Por lo tanto, si usted nota, que tiene funciones para leer el ADC "ADC_read (1)," pero ese es el caso de un directo sus registros, como se indica en el código
void main () (
ADCON1 = 0x0F;
PORT = 0x00;
TRISA = 0x03, / / RA0 i RA1 son entradas analógicas
Y también que esta equivocado, ya que debe ser
ADCON1 = 0x0D; porque utiliza A0 y A1.
Me gustaría pedir disculpas, yo preferiría no escribir mucho, ya que no hay confusión en la lengua.
Por último, no he querido decir a juanez a copiar y pegar, y sí, había una idea de cómo se puede hacer.
Abraços
Ivan
Concordo em parte com você MLO_, eu sei que ADCON1 é um registro do PIC, e tambem sei que setup_adc_ports(); é uma função, estava apenas tentando explicar ao juanez que ambos tem o mesmo efeito, a diferença esta no compilador, e na forma de tratar seu periféricos, pois o MIKROC não tem esta funcão setup_adc_ports(); .
Tanto que se você reparar, ele tem funções para leitura do ADC "ADC_read(1)", porem tem que se tratar de forma direta seus registros, como mostra o codigo void main() {
ADCON1 = 0x0F;
PORTA = 0x00;
TRISA = 0x03; // RA0 i RA1 are analog inputs
, e que tambem esta errado, pois deveria ser ADCON1 = 0x0D;, pois ele usa A0 e A1.
Gostaria de pedir desculpas, prefiro não escrever muito, para não haver confusão nos idiomas.
Para finalizar, não quis dizer ao juanez para copiar e colar, e sim, que ele tivesse uma ideia de como pode fazer.
Abraços
Ivan
-
Hola mira por aki : http://www.todopic.com.ar/foros/index.php?topic=20029.0
yo he probado el ejemplo de duende_azul y me funciona, esta en ccs.
Un saludo