Autor Tema: Lectura analogica de pulsadores  (Leído 1499 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Lectura analogica de pulsadores
« en: 16 de Marzo de 2018, 18:10:28 »
Hola, tengo el siguiente esquema y necesito leer el valor de los switch's para visualizarlo por puerto serie y así saber el valor de cada uno, pero quiero visualizar dicho valor solamente al pulsar el switch correspondiente, o sea que el USART deje de transmitir cuando no esta pulsado. ¿Necesito hacer uso de la interrupción del modulo USART?
Este es el código que tengo:
Código: C
  1. #include <xc.h>
  2. #include "config_bits.h"
  3.  
  4. void setupClock(void);
  5. void configurarADC(void);
  6. void configurarUSART(void);
  7. void interrupt ADC_int(void);
  8.  
  9. unsigned int lecturaADC;
  10.  
  11. void main(void) {
  12.     setupClock();   // configuramos oscilador interno a 8 MHz
  13.     configurarADC();   // configuramos modulo ADC
  14.     configurarUSART();  // configuramos el modulo USART
  15.     INTCONbits.PEIE = 1;    // activamos interrupcion de perifericos
  16.     PIE1bits.ADIE = 1;  // habilitamos interrupcion de A/D
  17.     INTCONbits.GIE = 1; // activamos interrupcion global
  18.    
  19.     while(1){
  20.         TXSTAbits.TXEN = 1; // habilitamos transmision
  21.         ADCON0bits.ADON = 1;    // habilitamos el modulo ADC
  22.         ADCON0bits.GO_DONE = 1; // iniciamos la conversion
  23.     }
  24. }
  25.  
  26. void setupClock(){
  27.     OSCCONbits.IRCF0 = 1;
  28.     OSCCONbits.IRCF1 = 1;
  29.     OSCCONbits.IRCF2 = 1;
  30.     OSCCONbits.SCS = 0b10;
  31. }
  32.  
  33. void configurarADC(){
  34.     ADCON1bits.PCFG = 0b1110;   // configuramos AN0 como entrada analogica
  35.     ADCON1bits.VCFG = 0b00; // seleccionamos voltajes de referencia (Vdd, Vss)
  36.     ADCON0bits.CHS = 0b0000;    // seleccionamos canal analogico
  37.     ADCON2bits.ACQT = 0b010;    // tiempo de adquisicion (4Tad)
  38.     ADCON2bits.ADCS = 0b001;    // tiempo de conversion (Fosc/8)
  39.     ADCON2bits.ADFM = 0;    // justificacion a la izquierda
  40.     //ADCON0bits.ADON = 1;    // habilitamos el modulo ADC
  41. }
  42.  
  43. void interrupt ADC_int(void){   //rutina de atención a las interrupciones
  44.     if(PIR1bits.ADIF == 1){ // ha ocurrido una interrupcion
  45.         ADCON0bits.ADON = 0;    // desactivamos el ADC
  46.         lecturaADC = ADRESH;     // leemos el valor del ADC
  47.         //lecturaADC = (lecturaADC << 8)+ADRESL;
  48.         while(TXSTAbits.TRMT==0);// mientras el registro TSR esté lleno espera
  49.         TXREG = lecturaADC;//cuando el registro TSR está vacio se envia la conversion
  50.        
  51.         PIR1bits.ADIF = 0;  // limpiamos bandera de interrupcion
  52.     }
  53. }
  54.  
  55. void configurarUSART()
  56. {
  57.     TRISCbits.RC6 = 0;  // configuramos TX como salida
  58.     //TRISCbits.RC7 = 1;  // configuramos RX como entrada
  59.     TXSTAbits.SYNC = 0; // habilitamos modo asincrono
  60.     TXSTAbits.BRGH = 1;
  61.     BAUDCONbits.BRG16 = 0;  // configuramos para alta velocidad
  62.     SPBRG = 51;    // 9600 baud
  63.     RCSTAbits.SPEN = 1;     // habilitamos el puerto serie
  64.     TXSTAbits.TX9 = 0;  // seleccionamos tx a 8 bits
  65.     //TXSTAbits.TXEN = 1; // habilitamos transmision
  66. }


Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Lectura analogica de pulsadores
« Respuesta #1 en: 16 de Marzo de 2018, 23:25:13 »
Citar
¿Necesito hacer uso de la interrupción del modulo USART?

Si es leer el boton y enviar, entonces no. Ni siquiera usaria la interrupcion del ADC.


No deberias poner el ADON en 0, no tiene sentido., tampoco estar habilitando a cada rato TXEN, tampoco tiene sentido. solamente poner a 1 GO_DONE y esperas con un while hasta que GO_DONE sea 0. Y listo, si detectas algo envias. Sino volves a leer.

Si no queres enviar y enviar cuando este presionado, podes enviar apenas se presiona, y luego esperar que se suelte para enviar la informacion que se soltaron todos los botones.

PD: Tal ves quieras cambiar los primeros valores de resistencia, asi aprovechas todo el rango del ADC.
Ejemplo R1 + R2 + R3 = 10K (aprox)
Asi Backwards da 2.5V si son 5V
Luego cuando presionas Forward que te de 4.2V, y left 3.4V suponete, dependera de los valores de las resistencias que puedan usarse.

Ya que como estan los valores de las resistencias tenes 2,5V en el primer boton, y luego en los demas botones el rango sea hace mucho mas pequeño para diferenciar entre uno u otro.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 941
Re:Lectura analogica de pulsadores
« Respuesta #2 en: 17 de Marzo de 2018, 12:55:15 »
Respecto a los valores de las resistencias, como ya te han dicho estás desaprovechando el rango, pues conviene elegir las resistencias de manera que los valores leídos sean en lo posible equiespaciados.

Por ejemplo, si en tu esquema hacés:

R1 = 0   (es decir, vuela)
R2 = 2K7
R3 = 3K9
R4 = 10K
R5 = 27K

Los valores leídos con cada pulsador serán teóricamente: 0.0V , 1.1V , 2.0V , 3.1V y 4.1V

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Lectura analogica de pulsadores
« Respuesta #3 en: 17 de Marzo de 2018, 13:54:05 »
Gracias a los dos por vuestras respuestas, voy a cambiar los valores de las resistencias y cambiar la programación del codigo de lectura de los pulsadores, aunque creo que me conviene usar la interrupcion del ADC porque necesito que el pic haga otras cosas y no este siempre pendiente del del ADC, de nuevo muchas gracias.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.


 

anything