TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: BINARIO en 13 de Agosto de 2014, 16:27:10

Título: (SOLUCIONADO) Problemilla con puerto E en 18F46K22
Publicado por: BINARIO en 13 de Agosto de 2014, 16:27:10
Estimados,
                nuevamente renegando por aca con los micros, tengo un problemilla concreto en el puerto E, en el mismo tengo mapeados un led para PWONLED y hacer de baliza de mi equipo en modo sleep y dos botones estarian asi dispuestos

RE0 ----- BOTON +
RE1 ----- BOTON -
RE2 ----- LED_ON

El led anda perfecto, pero cuando quiero presionar algun boton no me responde de entrada configure el puerto E, asi:

TRISE = 0x60;  

y luego en el codigo hago esto:

CASE 0:                                                                     //Muestra de temperatura.
          
          lcd_putc("\f");
          delay_ms(10);
          lcd_putc ("TEMPERATURA");
          
          set_adc_channel(2);                                                   //Habilitación canal 2
          delay_us(20);                                                         //por seguridad esperamos 20us antes de leer
          q = read_adc();                                                       //Lectura canal 2
          p = 0.65 * q / 133.0;                                                 //Conversión a tensión
                                                                                //p = ((65/133) * q)  - (5190/19);
                                        
          t = 0.48872 * q - 273.1578947 ;                                       //Conversión a tensión
          lcd_gotoxy (1,2);
          printf(lcd_putc, "AD=%3ld T=%01.2fC", q, t);                          //imprimo numero de muestras y temperatura


          lcd_gotoxy (21,1);
          lcd_putc (" Min:00.0C|Max:00.0C");
          lcd_gotoxy (21,2);
          lcd_putc("<< 00:00  |00:00  >>");
          
           if (bit_test (PORTE, 0) )
           {
            delay_ms(100);                                                       //anti-rebote por software
            if (bit_test (PORTE, 0) )
                        SELECCION = 1;                                          //si presiono "+"
           }  
        
           if (bit_test (PORTE, 1) )
           {
            delay_ms(100);
            if (bit_test (PORTE, 1) )
                        SELECCION = 7;                                          //si presiono "-"
           }
           delay_ms(100);
    BREAK;


Con esto yo implemento un menu tipo scroll que corre a derecha o a izquierda dentro de un SWITCH que evalua la variable seleccion y entra en cada menu dependiendo del valor que tenga SELECCION, pero por algun motivo, al presionar los botones no se actualiza la variable, sigo renegando si consigo hacerlo andar subo la respuesta, instale hace poco el CCS 5.025 y me estoy familiarizando con estos micros, antes usaba un 18F452 y funcionaba todo correcto, tengo la impresion que me esta faltando algun tipo de configuracion en este maldito puerto jeje  :-/
Título: Re: Problemilla con puerto E en 18F46K22
Publicado por: thegame en 13 de Agosto de 2014, 16:48:14
Segun veo en el datasheet del PIC en cuestion, en esos pines tienes canales analogicos, porque no pruebas a desactivar las funciones de pin analogicos, y los pones como pines digitales. El ccs ya incorpora funciones para eso, checa la ayuda del compilador.

En conjunto, te recomiendo usar la funcion input_state(PIN_Ex), en ves de bit_test(port,bit), donde "x" es el bit que deseas testear.

Saludos.
Título: Re: Problemilla con puerto E en 18F46K22
Publicado por: BINARIO en 13 de Agosto de 2014, 22:25:16
Es verdad compañero es la configuracion de set_adc_ports eso fallaba gracias  :-/ :-/ :-/ :-/
Título: Re: Problemilla con puerto E en 18F46K22
Publicado por: BINARIO en 19 de Agosto de 2014, 13:09:40
lo que no estoy pudiendo conseguir ahora, es la tabla de configuracion del adcport en ccs de este micro que soporta hasta 25 puertos AD. voy a investigar en el archivo .h del micro.
Título: Re: Problemilla con puerto E en 18F46K22
Publicado por: BINARIO en 19 de Agosto de 2014, 13:46:43
OK YA ESTA SOLUCIONADO!!!

setup_adc_ports(sAN0|sAN1|sAN2|sAN3|sAN4);   
setup_adc( ADC_CLOCK_INTERNAL );

Lo encontre en el archivo header del pic, pero como sabia como implementarlo lo google, y para decirle al micro que puertos seran analogicos debemos colocar sANx (donde x es el puerto en cuestion) y separamos con una barra |.


 :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/