TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: cristhian roca camarena en 05 de Marzo de 2019, 14:30:14
-
buenas que tal como están compañeros.
Tengo un pequeño problema, lo que pasa es que tengo 5 sensores que necesito enviarlos con serial rs232, estoy utilizando el ccs y estoy utilizando la funcion de interrupcion #int_tbe para enviar la data de los sensores. El problema consiste que a la hora enviar la data me sale todo cero y yo creo que el problema es porque también estoy utilizando el timer1 y parece como si las interrupcion se ocurrieran al mismo tiempo y nose como solucionar este problema. NECESITO DE SU AYUDA POR FAVOR, ADJUNTO CÓDIGO DE LO QUE ESTABA HACIENDO. GRACIAS
#include <16f877a.h>
#include <stdio.h>
#use delay(clock=10M)
#fuses hs,nowdt
#include <MCP3204_modificado.C>
#include <lcd.c>
#include "dht22_mejorado.h"
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=N)
#PRIORITY TBE, TIMER1,RB
int32 valor1,valor2,peso,tot_pulsos=0;
int32 pulsos=0;
float voltaje2,pt100,humedad,temperatura;
int cont_t=0;
short envia_p=0;
#INT_EXT // directiva de interrupcion por cambio de estado en RB0
void interrupcion_RB0()
{
pulsos++;
}
#INT_TIMER1 //ocurre interrupcion cada 100ms
void interrupcion_timer1()
{
cont_t++;
if(cont_t==10){
envia_p=1;
tot_pulsos=pulsos;
pulsos=0;
cont_t=0;
}
set_timer1(34286);
}
#INT_TBE
void TBE_isr(void) {
lcd_gotoxy(1,1);
lcd_putc("\f");
printf(lcd_putc,"pulsos= %Lu\r\r",tot_pulsos);
printf("pulsos= %Lu\r ",tot_pulsos);
printf("peso= %Lu\r\r",peso);
printf("pt100= %3.1f\r\r",pt100);
printf("humedad= %f\r",humedad);
printf("temperatura= %f\r\r",temperatura);
delay_ms(100);
}
void config_interrupcion()
{
enable_interrupts(INT_EXT); //habilito interrupcion RB0
ext_int_edge(H_TO_L); //configuro interrupcion por flanco de bajada
disable_interrupts(int_rb);
enable_interrupts(INT_TIMER1); //habilito interrupcion por desborde de timer1
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(34286);
disable_interrupts(int_timer1);
enable_interrupts(INT_TBE);
enable_interrupts(GLOBAL); // habilito interrupcion global
}
void inicializacion(){
adc_init();
lcd_init();
dht_init ();
}
void main(){
set_tris_c(1);
inicializacion();
config_interrupcion();
while(TRUE){
valor1=read_analog(0);
peso=valor1*(10000.0/4095.0);
valor2=read_analog(1);
voltaje2=5.0*(valor2/4095.0);
pt100=21.598*voltaje2+11.728;
leer_dht22 (humedad,temperatura);
delay_ms(50);
if(envia_p==1){ //muestra en lcd cada 500ms
printf("pulsos= %Lu\r",tot_pulsos);
envia_p=0;
}
}
}