Autor Tema: Problema con programa que usa interrupciones por TMR0...  (Leído 1691 veces)

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

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Problema con programa que usa interrupciones por TMR0...
« en: 31 de Octubre de 2004, 07:46:00 »
Hola

Me estreno en este foro, pues he empezado recientemente con CCS. Va el siguiente programa:

Codigo:

#include <16f88.h>
#fuses HS,NOWDT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_B0,rcv=PIN_B1)
set_tris_b(0x00);
set_tris_a(0x00);
setup_adc_ports(NO_ANALOGS);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TMR0);
setup_timer_0(RTCC_DIV_256,RTCC_INTERNAL);

int8 x;

void main() {
   do {
      if (x==1)
         output_high(PIN_B4);
      else
         output_low(PIN_B4);            
     
   } while (1);
}

#INT_TIMER0
tmr_handler() {
   x^=1;
}



Se supone, que PORTB.4 debe de parpadear a una frecuencia alta. Lo simulo por proteus, pero nada...
Talvez sea un programa sin fundamento, pero esque por ahora soy un paquete en esto del CCS...

salu2

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
RE: Problema con programa que usa interrupciones por TMR0...
« Respuesta #1 en: 31 de Octubre de 2004, 09:13:00 »
uuu, casi no lo revise, pero empeza con la estructura de prog...
siempre empieza en el main, y alli dentro la primera zona se usa para inicializar tooooodo lo q quiereas y luego un loop infinito donde  se hace el trabajo rutinario..

las rutinas de int. gralmente se ponen antes q el main, esto es mas q nada para ayuda al compilador y no tener q repetir los header de cada rutina en la cabecera ( eso tiene un nombre q ahora no me sale...)
la interrupcion q se habilita ultimo es siempre la global....

una cosa mas, cada vez q compiles con CCS (al principio al menos) si conoces asm fijate en el listing de asembler maso q te genero, pq si esta mal ( como sucedio con tu inicializacion) no te dice nada y no te lo compila tampoco...

el orden es, inicializo timer primero
despues habilito la int del timer y luego la global...



#include <16f88.h>
#fuses HS,NOWDT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_B0,rcv=PIN_B1)


int8 x;

void main() {
set_tris_b(0x00);
set_tris_a(0x00);
setup_adc_ports(NO_ANALOGS);
setup_timer_0(RTCC_DIV_256,RTCC_INTERNAL);
enable_interrupts(INT_TMR0);
enable_interrupts(GLOBAL);

   do {
      if (x==1)
         output_high(PIN_B4);
      else
         output_low(PIN_B4);            
     
   } while (1);
}

#INT_TIMER0
tmr_handler() {
   x^=1;
}



no la probe, pero es mas probable q asi funcione....
suerte...

Desconectado neocommandos

  • PIC10
  • *
  • Mensajes: 25
RE: Problema con programa que usa interrupciones por TMR0...
« Respuesta #2 en: 31 de Octubre de 2004, 09:51:00 »
Yo haria lo siguiente:


#include <16f88a.h>
#fuses HS,NOWDT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_B0,rcv=PIN_B1)



int8 x=1;


void main() {

set_tris_b(0x00);
set_tris_a(0x00);
setup_adc_ports(NO_ANALOGS);

enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);

set_timer0(0);
setup_counters (RTCC_INTERNAL, RTCC_DIV_256);



   do {
      if (x==1)
         output_high(PIN_B4);
      else
         output_low(PIN_B4);            
     
   } while (1);
}

#INT_TIMER0
tmr_handler() {
   x = ~x;
set_timer0(0);
}


Basicamente es lo que ya te ha respondido wqtrp, solo que hay pequeños cambios, como el inicializar la variable x, para que luego no haya problemas en las sentencias de control del main, o recarga el timer en la funcion de interrupcion,...
Echale un vistazo y ya nos cuentas.

Salu2 Giño

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: Problema con programa que usa interrupciones por TMR0...
« Respuesta #3 en: 31 de Octubre de 2004, 12:59:00 »
Hola

El programa seguia sin funcionar, pero cambié el pin B4 por el pin B3 y funcionaba! Alguien sabe, por que en proteus, el 16F88 tiene el pin B4 siempre flotando???


 

anything