TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Alanmzt en 22 de Mayo de 2018, 04:34:20
-
Buenas a todos!
Estoy realizando un proyecto para mi clase de electrónica en donde se debe de medir una distancia utilizando un sensor ultrasonido SRF05 con un PIC16F18875 en xc8; el proyecto esta montado en una tabla de desarrollo Curiosity HPC.
Sucede que el resultado en pantalla es 0 y no hallo forma de solucionar. Espero me pudieran ayudar con algunas ideas. Saludos!
#include <xc.h>
#define _XTAL_FREQ 4000000
#include "LCD.h"
#include "stdio.h"
void Trigger_Pulse_10us();
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown Out Reset Selection bits (BOR enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = ON // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
void main()
{
float Distance; //Define la variable distancia
int Time;
float Total_distance[10];
ANSELA=0; //Para salidas digitales
TRISAbits.TRISA3=1; //RA3 como INPUT (Echo)
TRISAbits.TRISA0=0; //RA0 como OUTPUT (Trigger)
//Configuracion para LCD Display
ANSELB=0; //ANSEL PARA SALIDAS DIGITALES
TRISB=0; //Declara puertos B como Output
PORTB=0; //Valor inicial del puerto B
Lcd_Init();
Lcd_Cmd(LCD_CLEAR);
Lcd_Cmd(LCD_CURSOR_OFF);
T1CON = 0x80; //Initialize Timer Module
TMR1IF = 0; //Bandera TMR1IF a 0
TMR1 = 0; //Temporizador contador timer1 PIC en si, es donde se guardan los valores del timer1 PIC
Lcd_Out(1,1, "Distancia:");
while(1)
{
Trigger_Pulse_10us();
while(PORTAbits.RA3==0);
TMR1 = 0;
TMR1ON = 1; //Encender temporizador
while(PORTAbits.RA3==1 && !TMR1IF);
Time = TMR1;
TMR1ON = 0; //Apagar temporizador
TMR1IF = 0; //Bandera TMR1IF a 0
Distance = ((float)Time/117.00);
sprintf(Total_distance,"%.03f",Distance);
Lcd_Out2(2,1, Total_distance);
__delay_ms(50);
}
}
void Trigger_Pulse_10us()
{
LATAbits.LATA0 = 1;
__delay_us(10);
LATAbits.LATA0 = 0;
}
-
Algunas de las cosas que veo:
T1CON = 0x80; //Initialize Timer Module
0x80 ??? justamente ese bit no afecta en nada... Le pondria 0x00 si quisera poner a 0 los preescaler y apagar el Timer.
TMR1IF = 0; //Bandera TMR1IF a 0
TMR1ON = 0; //Apagar temporizador
A no ser que te pusiste a definir cada uno de los pines, podrias haber realizado:
T1CONbits.ON = 0;
El mismo nombre del registro + "bits" y eso es una estructura que cuando pones el punto te aparecen todas las opciones.
Otras cosas del Timer.
Pienso que seria correcto el activar RD16 (T1CON) asi TIMERH se guarda al momento de leer y poder leer correctamente.
Tambien te olvidaste setear la entrada correcta de reloj.. Me refiero al registro T1CLK, Para 0000 que es el reset, tenes que el reloj se alimenta por un pin externo del PPS, para 0001 tenes que es Fosc/4, que a 4Mhz es 1us cada pulso si no tenes preescaler y creo que eso es lo que buscas.
--------------------------------------------------------
Y luego 50ms entre lecturas, vos tenes que pensar que vas a estar actualizando el LCD cada 50ms, y eso si es una locura,, al menos para probar ponele 500ms
-
Algunas de las cosas que veo:
T1CON = 0x80; //Initialize Timer Module
0x80 ??? justamente ese bit no afecta en nada... Le pondria 0x00 si quisera poner a 0 los preescaler y apagar el Timer.
TMR1IF = 0; //Bandera TMR1IF a 0
TMR1ON = 0; //Apagar temporizador
A no ser que te pusiste a definir cada uno de los pines, podrias haber realizado:
T1CONbits.ON = 0;
El mismo nombre del registro + "bits" y eso es una estructura que cuando pones el punto te aparecen todas las opciones.
Otras cosas del Timer.
Pienso que seria correcto el activar RD16 (T1CON) asi TIMERH se guarda al momento de leer y poder leer correctamente.
Tambien te olvidaste setear la entrada correcta de reloj.. Me refiero al registro T1CLK, Para 0000 que es el reset, tenes que el reloj se alimenta por un pin externo del PPS, para 0001 tenes que es Fosc/4, que a 4Mhz es 1us cada pulso si no tenes preescaler y creo que eso es lo que buscas.
--------------------------------------------------------
Y luego 50ms entre lecturas, vos tenes que pensar que vas a estar actualizando el LCD cada 50ms, y eso si es una locura,, al menos para probar ponele 500ms
Te envié inbox!