|
|
View previous topic :: View next topic |
Author |
Message |
jacktaylor
Joined: 02 Sep 2017 Posts: 75
|
Program stopping in the delay () function |
Posted: Wed Jul 04, 2018 8:40 am |
|
|
Friends, good afternoon. Can anybody help me? I do not know why any timed line increased below the trigger(); prototype is not executed while looping (true). It looks like the program for in delay(). If you remove the delay, the loop is executed by executing the trigger(); is really very strange. Program stopping in the delay() function;
Code: |
#include <16F877A.h>
#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock= 20M)
//--->>>>>>>>>> O programa funciona sem estas diretivas fast_io nem tris_x
#use fast_io(c)
//*******COnecoes LCD*********
#define LCD_DB4 PIN_A4 // Pino bloco dados 4 no pino microcontrolador
#define LCD_DB5 PIN_A3
#define LCD_DB6 PIN_A2
#define LCD_DB7 PIN_A1
#define LCD_RS PIN_E0
#define LCD_E PIN_A5
#include <lcd4bitsMicrostronic.c>
#define trig PIN_C1
// --- Protótipo da Função Auxiliar ---
void trigger();
// --- Variáveis Globais ---
void main()
{
//Configura PORTS
SET_TRIS_C(0X04); // C2 configurado como entrada, pois é o ECHO DO SENSOR e CCP1 do PIC. C1 é TRIG do 16F877A para sensor, ENTAO SAIDA.
output_c(0x00);
Enable_Interrupts(GLOBAL);
DISABLE_INTERRUPTS(INT_TIMER1);
Enable_Interrupts(INT_CCP1 ); // USEI CCP1IE = 0x01; Habilita interrupção do periférico CCP
Setup_ccp1(CCP_CAPTURE_FE); // CCP1CON = 0x04; CONFIGURA BYTE BORDA SUBIDA NOREGISTADOR
Setup_Timer_1(T1_INTERNAL|T1_DIV_BY_2);
//Inicializa LCD
lcd_init();
lcd_putc("\f");
lcd_gotoxy(1,1); //lcd_gotoxy para coluna, linha
printf(lcd_putc,"distancia");
lcd_gotoxy(14,2); //lcd_gotoxy para coluna, linha
printf(lcd_putc,"cm");
delay_ms(100);
while(TRUE)
{
trigger(); //Chama a função de trigger
delay_ms(100); //lEITURA DO PULSO A CADA 100ms Taxa de atualização
} //end while
}// end void main
//TODO: User Code
void trigger()
{
output_high(trig); // trih = 0x01; trig em nível high
delay_us(10); //por 10 micro segundos
output_low(trig); //trig = 0x00;
} //end trigger |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19515
|
|
Posted: Wed Jul 04, 2018 9:06 am |
|
|
There is no sign of an interrupt handler for CCP1. The code will crash without this. |
|
|
jacktaylor
Joined: 02 Sep 2017 Posts: 75
|
|
Posted: Wed Jul 04, 2018 9:59 am |
|
|
Ttelmah wrote: | There is no sign of an interrupt handler for CCP1. The code will crash without this. |
Even commenting on all the configuration lines of the CCP1 module, the program is stopped in delay (); Commenting on the delay, the program executes the while (1) {trigger ();}
Note below.
Why is this happening?
Code: |
#include <16F877A.h>
#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock= 20M)
//--->>>>>>>>>> O programa funciona sem estas diretivas fast_io nem tris_x
#use fast_io(c)
//*******COnecoes LCD*********
#define LCD_DB4 PIN_A4 // Pino bloco dados 4 no pino microcontrolador
#define LCD_DB5 PIN_A3
#define LCD_DB6 PIN_A2
#define LCD_DB7 PIN_A1
#define LCD_RS PIN_E0
#define LCD_E PIN_A5
#include <lcd4bitsMicrostronic.c>
#define trig PIN_C1
// --- Protótipo da Função Auxiliar ---
void trigger();
// --- Variáveis Globais ---
void main()
{
//Configura PORTS
SET_TRIS_C(0X04); // C2 configurado como entrada, pois é o ECHO DO SENSOR e CCP1 do PIC. C1 é TRIG do 16F877A para sensor, ENTAO SAIDA.
output_c(0x00);
//!
//! Enable_Interrupts(GLOBAL);
//! DISABLE_INTERRUPTS(INT_TIMER1);
//! Enable_Interrupts(INT_CCP1 ); // USEI CCP1IE = 0x01; Habilita interrupção do periférico CCP
//! Setup_ccp1(CCP_CAPTURE_FE); // CCP1CON = 0x04; CONFIGURA BYTE BORDA SUBIDA NOREGISTADOR
//! Setup_Timer_1(T1_INTERNAL|T1_DIV_BY_2);
//!
//Inicializa LCD
//! lcd_init();
//! lcd_putc("\f");
//! lcd_gotoxy(1,1); //lcd_gotoxy para coluna, linha
//! printf(lcd_putc,"distancia");
//! lcd_gotoxy(14,2); //lcd_gotoxy para coluna, linha
//! printf(lcd_putc,"cm");
//! delay_ms(100);
while(TRUE)
{
trigger(); //Chama a função de trigger
delay_ms(100); //lEITURA DO PULSO A CADA 100ms Taxa de atualização
} //end while
}// end void main
//TODO: User Code
void trigger()
{
output_high(trig); // trih = 0x01; trig em nível high
delay_us(10); //por 10 micro segundos
output_low(trig); //trig = 0x00;
} //end trigger |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19515
|
|
Posted: Wed Jul 04, 2018 10:02 am |
|
|
Are you running this 'for real' , or in a simulator?.
In a simulator, a delay can take ages to execute.
If 'for real', are you sure you will see/detect a 10uSec pulse every 100mSec?. |
|
|
jacktaylor
Joined: 02 Sep 2017 Posts: 75
|
|
Posted: Wed Jul 04, 2018 10:57 am |
|
|
Ttelmah wrote: | Are you running this 'for real' , or in a simulator?.
In a simulator, a delay can take ages to execute.
If 'for real', are you sure you will see/detect a 10uSec pulse every 100mSec?. |
It's you absolutely right. In the simulator without the delay_us (100);, I have the signal of the trigger and I can measure 10us of signal with ease in the virtual oscilloscope, when I put the delay_ms (100), it becomes more complicated to read the signal of 10us. In actual assembly I try to work the Echo signal of the Ultrasonic Sensor HC-SR04. And I was having problems with the Echo signal, so I was reducing the program until I got to the trigger. The ideal is to have even a real oscilloscope. Thank you Ttelmah. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|