Autor Tema: conteo  (Leído 1444 veces)

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

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
conteo
« en: 20 de Agosto de 2012, 20:08:38 »
Este programita realiza el conteo de una interrupcion por rb0. Este conteo se inicia desde 1 y se quiere que empieze desde cero. Es decir en un display se tendrìa que mostrar el cero cuando no hubo ninguna interrupciony  contarlas en caso de haberlas pero desde cero.

#include <18f4520.h>  //PIC utilizado         
#fuses XT,NOWDT,NOPROTECT,PUT  //Configuramos los fuses
#use delay (clock=4000000)     //Oscilador a 4Mhz
#use fast_io(b)   //Optimizamos E/S del PORTB
#byte trisb = 0x86
#byte portb = 0x06
#include <lcd.c>
#byte option_reg = 0x81
long pulsos=0;
float energia;
#int_ext         //atención por cambio en rb0
ext_isr(){       //funciòn interrupción
pulsos++;
}   

//------Programa principal-----
void main(){

lcd_init();
set_tris_b(0x01);
port_b_pullups(true);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
enable_interrupts(global);

while (1)
{
//muestro por LCD el conteo
}
}
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado Nubbeo

  • PIC10
  • *
  • Mensajes: 12
Re: conteo
« Respuesta #1 en: 20 de Agosto de 2012, 20:44:08 »
Creo que el problema esta en lo siguiente:

En el reset el PIC esta configurado para que la interrupción en RB0 (INT0) funcione por flanco ascendente.
Al conectar los pullups en port_b_pullups(true) se te setea INT0IF (esto se hace aunque no esten habilitadas las interrupciones).

De la página 94 del manual de PIC18F4520:
Interrupt flag bits are set when an interrupt condition occurs, regardless of the state of its corresponding
enable bit or the global enable bit. User software should ensure the appropriate interrupt flag bits are clear
prior to enabling an interrupt. This feature allows for software polling.

Al habilitar las interrupciones, como tenes INT0IF en 1, te entra en la interrupción.

Se arregla con esta forma de habilitar las interrupciones:
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
clear_interrupt(int_ext);          //Borra INT0IF
enable_interrupts(global);

Espero que te sirva de ayuda.
Saludos

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re: conteo
« Respuesta #2 en: 20 de Agosto de 2012, 23:22:55 »
Muchas gracias nubbeo.
Si quieres trascender..., enseña humildemente  lo que sabes.