TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Bakemono en 13 de Febrero de 2019, 11:49:18

Título: Interrupciones con mikroC por RB0
Publicado por: Bakemono en 13 de Febrero de 2019, 11:49:18
Hola, me presento a toda la comunidad. Mi nick es Bakemono y soy un hobbista autodidacta. No sé si estoy posteando en el lugar correcto, si no es así pido disculpas. Estoy empezando a programar micros y tengo un problema al hacer uso de la interrupción por RB0/INT. Uso mikroC para todos mis programas. Los simulo en Proteus. El PIC utilizado es un 16F887. El problema es que no encuentro el error en mi programa. No se activa la interrupción por más que insisto. El ciclo while de tres leds intermitentes va bien, pero el cuarto led y la interrupción que deberían congelar ese ciclo while no se ejecutan. ¿Podríais ayudarme a identificar el error, por favor? Aquí el programa :

// PIC 16F887 - INTERRUPCIÓN POR RBO/INT. CUANDO RB0 ESTÉ A 1, SE CONGELA EL CICLO WHILE Y SUS TRES LEDS Y SE ENCIENDE EL DE INTERRUPCIÓN HASTA SU PUESTA A CERO.

void interrupt () {               // Rutina de interrupción por el pin 0 del PORTB.
 if (INTF_bit==1) {             // Si se detecta cambio de 0 a 1 en RB0...
    PORTB.B4=1;                 // ... encender LED de aviso de interrupción iniciada.
    INTF_bit=0;                  // Puesta manual a cero de la bandera de interrupción de RBO/INT.
    }
}

void main () {
TRISB=0b00000001;         // Todo el PUERTO B como salida excepto RB0.
GIE_bit=1;                       // Se habilita la interrupción global.
INTE_bit=1;                     // Se habilita el bit de interrupción externa en RB0.

PORTB=0;                       // Inicio del PORTB a cero.

while (1){

PORTB.B4=0;                     // Apagamos el LED de interrupción cuando ésta cesa.

PORTB.B1=1;                     // LED1 de PORTB.RB1 se enciende durante un segundo...
delay_ms(1000);
PORTB.B1=0;                     // ... y se apaga transcurrido ese tiempo.

PORTB.B2=1;                     // Mismo ciclo para el LED2 de RB2 y LED3 de RB3 en un buble infinito.
delay_ms(1000);
PORTB.B2=0;

PORTB.B3=1;
delay_ms(1000);
PORTB.B3=0;
}
}

Desde ya gracias por la ayuda.
Título: Re:Interrupciones con mikroC por RB0
Publicado por: Bakemono en 14 de Febrero de 2019, 12:59:53
¿Nadie puede echarme una mano?
Título: Re:Interrupciones con mikroC por RB0
Publicado por: KILLERJC en 14 de Febrero de 2019, 13:33:56
Inicialmente todos los pines estan como entradas y analogicos... Es tu deber ponerlos como digitales con los registros ANSEL y ANSELH..

Lo demas me parece todo bien. Aunque no programo con mikroC, la mayoria usa aca CCS o XC8
Título: Re:Interrupciones con mikroC por RB0
Publicado por: Bakemono en 14 de Febrero de 2019, 13:58:24
Parece mentira lo que es dejarte un registro... Para volverse loco.

Muuuuuuuuuuchas gracias KILLERJC!!!!!
Título: Re:Interrupciones con mikroC por RB0
Publicado por: KILLERJC en 14 de Febrero de 2019, 16:49:41
Cuando tengas un problema con un pin.. Busca todas las funciones que tiene ese pin (al comienzo del datasheet estan) y verifica que ninguna de estas funcionalidades sean las que molesten.
Título: Re:Interrupciones con mikroC por RB0
Publicado por: Bakemono en 15 de Febrero de 2019, 06:19:33
Tomo nota de tu consejo. Me he dado cuenta de que según el modelo y antigüedad del PIC los registros varían. Por ejemplo en el PIC12F629 no existe TRISx ni PORTx sino GPIOx y TRISIOx. Tampoco usa los registros ANSEL, ANSELH o ADCON. Su hermano, el 12F675 sí que los usa. Otros como el 18F2550 o los de última generación como el 16F(L)18877 no usan PORTx como registro de salida de pins, si no que usan LATx. Es un poco lioso al principio por que veía programas con instrucciones que no tenían nada que ver de un modelo a otro de PIC, como la comparativa de antes. Eso sin contar que cada compilador tiene instrucciones y funciones específicas que otros no. Seguimos aprendiendo. De nuevo gracias.
Título: Re:Interrupciones con mikroC por RB0
Publicado por: KILLERJC en 15 de Febrero de 2019, 07:39:25
PIC16 y PIC18 son arquitecturas muy diferentes, las memorias RAM estan organizadas de forma diferente especialmente.

Por lo tanto lo correcto es comparar PIC16 con PIC16...
Hay PICs con ADC y otros no lo tienen (generalmente los mas viejitos) , los PIC16 fueron evolucionando poco a poco, como vos decis hay micros que los registros de analogico/digital se acomodaban con el ADCONx, lueg pasaron a los ANSEL. Y finalmente los puertos el tener solo PORTx puede llegar a causar problema ya que el micro lee el puerto cambia el estado y graba el puerto nuevamente (ante un cambio del puerto) esto hace que si cambias muy rapidamente el puerto, y un pin tiene una carga grande capacitiva, al leer por segunda ves el pin que deberia estar en 1, no llego y leyo un 0, entonces cuando escribe el puerto lo hace mal..

Es ahi donde los PIC18 implementaba los LATx y PORTx, donde LAT es el registro de salida.. es decir el que maneja el driver... mientras que PORTx lees el pin directo... De esa forma por mas que tarde en cambiar una salida, al leer el micro lee el LATx el cual no es afectado por eso. Por eso mismo se dice que usas LATx para escribir y PORTx para leer.

Citar
. Eso sin contar que cada compilador tiene instrucciones y funciones específicas que otros no.

Personalmente me gusta XC8 por que no uso ninguna funcion especifica (a puro registros), si debo hacerlo la hago yo a la funcion. Lo mismo podes hacer con mikroC, pero tambien tenes funciones que te facilitan la vida... CCS es mas complicado de hacer, ya que ellos ya te proveen unas series de funciones que necesitas usar y te olvidas de tocar registros... O lidias con registros, o lidias con aprenderte las funciones...

Eso si... implementar un codigo UART por ejemplo en XC8 sin nada es mucho mas complicado que poner una sola linea en CCS y ya tenes configurado tu UART de forma mucho mas simple