|
|
View previous topic :: View next topic |
Author |
Message |
Orcino
Joined: 07 Sep 2003 Posts: 56
|
PIC24 does not generate interruption |
Posted: Sat Mar 25, 2017 3:23 pm |
|
|
PIC24 does not generate uart1 interruption, when the function "envia_dtmf(10); " is called inside the main loop.
If I remove the function, it works.
Can anyone help?
Thanks
Orcino Borges
Code: |
#include <24FJ128GB204.h>
#build (stack=256)
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOWINDIS //Watch Dog Timer in Window mode
#FUSES NOJTAG //JTAG disabled
#FUSES CKSFSM //Clock Switching is enabled, fail Safe clock monitor is enabled
#FUSES NOWDTCMX //WDT always uses LPRC as its clock source
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES NOWPFP //Write/Erase Protect Page Start/End Location, set to page 0
#FUSES NOBROWNOUT //No brownout reset
#FUSES NODSBOR //BOR disabled in Deep Sleep
#FUSES NODSWDT //Deep Sleep Watchdog Timer disabled
#FUSES NODS //Deep Sleep operation is always disabled
#FUSES PLL6X //6x PLL Output Frequency is selected
#use delay(clock=60MHz,crystal=10MHz)
#use FIXED_IO( A_outputs=PIN_A10,PIN_A8,PIN_A7 )
#use FIXED_IO( B_outputs=PIN_B14,PIN_B13,PIN_B6 )
#use FIXED_IO( C_outputs=PIN_C5,PIN_C0 )
#define DATA_HT9200 PIN_A7
#define ON_OFF_GPRS PIN_A8
#define CE_HT9200 PIN_A10
#define USB_DET PIN_B3
#define STATUS_GPRS PIN_B4
#define ON_RADIO PIN_B6
#define PTT PIN_B13
#define CLK_HT9200 PIN_B14
#define RST_GPS PIN_C0
#define RST_BT PIN_C5
//==============================================================================
// Macros
//==============================================================================
#define ligaRadio output_low(ON_RADIO);
#define desligaRadio output_high(ON_RADIO);
//=============================================================================
//
//=============================================================================
#pin_select U1TX=PIN_C1
#pin_select U1RX=PIN_C2
#use rs232(UART1, baud=9600,ERRORS,stream=GPS)
#pin_select U2TX=PIN_B7
#pin_select U2RX=PIN_B8
#use rs232(UART2, baud=9600, ERRORS,stream=BT)
#pin_select U3TX=PIN_C4
#pin_select U3RX=PIN_C3
#use rs232(UART3, baud=9600, ERRORS,stream=GPRS)
#pin_select INT1 = PIN_B9
#include <string.h>
#include <stdlib.h>
#include <GPS_read.c>
//#include <SIM900D.c>
//=============================================================================
// Funções
//=============================================================================
void envia_dtmf(unsigned int8 A);
void verificaDadosRxDTMF(void);
void enviaCoordenadas(void);
//=============================================================================
// Variaveis Globais
//=============================================================================
char GPSData[80]; // Buffer de recepção dos dados so GPS
char GPRSdata[128];
char BTdata[20];
unsigned int8 GPSDataPtr=0,
BTDataPtr=0;
unsigned int8 GPSDataReady = FALSE,
BTReady = FALSE;
unsigned int8 GPSmsgCount = 0;
char GPSrxCaracter;
char GPRSrxCaracter;
char BTrxCaracter;
unsigned int8 DTMFrx=0;
unsigned int8 rxDDC=0;
int1 flagRxDTMF=0;
int1 A=0,B=0,C=0,D=0;
//==============================================================================
// Interrupção externa STD do HT9170
//==============================================================================
#INT_EXT1
void ext0_isr_HT9170(void)
{
flagRxDTMF=1;
A = input(PIN_C9);
B = input(PIN_C8);
C = input(PIN_C7);
D = input(PIN_C6);
}
//=============================================================================
// Interrupção RX UART1 GPS
// Recebe os dados do GPS e armazena no buffer
//=============================================================================
#INT_RDA
void rda_isr_GPS(void)
{
GPSrxCaracter = fgetc(GPS);
switch (GPSrxCaracter)
{
case '$':
GPSDataPtr = 0;
break;
case '\n':
{
if( (GPSdata[3] == 'R') && (GPSdata[4] == 'M') && (GPSdata[5] == 'C') )
GPSDataReady = TRUE;
}
break;
}
GPSData[GPSDataPtr++ & 0x7F] = GPSrxCaracter;
if(GPSdataPtr > 79)
GPSdataPtr=0;
}
//=============================================================================
// Interrupção RX UART2 BLUETOOTH
//=============================================================================
#INT_RDA2
void rda2_isr_BT(void)
{
BTrxCaracter = fgetc(BT);
BTdata[BTDataPtr]=BTrxCaracter;
if(BTrxCaracter == '\n')
BTready = TRUE;
BTDataPtr++;
if(BTDataPtr > 20 )
BTDataPtr=0;
}
//=============================================================================
// Interrupção RX UART3 GPRS
//=============================================================================
#INT_RDA3
void rda3_isr_GPRS(void)
{
}
//=============================================================================
// Função principal
//=============================================================================
void main()
{
setup_adc(ADC_OFF);
setup_adc_ports(NO_ANALOGS, VSS_VDD);
setup_timer1(TMR_DISABLED);
setup_timer2(TMR_DISABLED);
setup_timer3(TMR_DISABLED);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_RDA);
enable_interrupts(INT_RDA2);
enable_interrupts(INT_RDA3);
enable_interrupts(INTR_GLOBAL);
while(TRUE)
{
//envia_dtmf(10);
if(flagRxDTMF)
verificaDadosRxDTMF();
if (GPSDataReady)
enviaCoordenadas();
}
}
//=============================================================================
// Função que envia ton DTMF usando HT9200A
//=============================================================================
void envia_dtmf(unsigned int8 A)
{
int8 k;
output_high(CE_HT9200);
output_low(CLK_HT9200);
output_high(CLK_HT9200);
output_low(CE_HT9200);
delay_ms(15);
A = A & 0B00001111;
if (A == 0) // 0 em DTMF =10
A = 10;
for(k=0;k<5;k++)
{
if(bit_test(A,k) == 1)
output_high(DATA_HT9200);
else
output_low(DATA_HT9200);
output_low(CLK_HT9200);
delay_ms(1);
output_high(CLK_HT9200);
delay_ms(1);
}
output_high(DATA_HT9200); // DATA_HT9200=1;
delay_ms(100); // VALOR MINIMO DE DURAÇÃO DE CADA TOM DTMF
for(k=0;k<5;k++)
{
output_low(CLK_HT9200);
delay_ms(1);
output_high(CLK_HT9200);
delay_ms(1);
}
delay_ms(50);
}
//=============================================================================
//
//=============================================================================
void verificaDadosRxDTMF(void)
{
if(A==1) bit_set(DTMFrx,0);
if(B==1) bit_set(DTMFrx,1);
if(C==1) bit_set(DTMFrx,2);
if(D==1) bit_set(DTMFrx,3);
}
//==============================================================================
//
//==============================================================================
void enviaCoordenadas(void)
{
GPRMCInfo MyGPRMCInfo;
GPRMC_decode(GPSData, &MyGPRMCInfo);
if (MyGPRMCInfo.Valid == 'A')
{
delay_ms(500);
fprintf(BT,"\n\rTime: %d:%d:%d\n\r",MyGPRMCInfo.DT.Hour, MyGPRMCInfo.DT.Minute, MyGPRMCInfo.DT.Second);
fprintf(BT,"Date: %d/%d/%d\n\r", MyGPRMCInfo.DT.Day, MyGPRMCInfo.DT.Month, MyGPRMCInfo.DT.Year);
fprintf(BT,"Latitude: %f %c\n\r", MyGPRMCInfo.Latitude, MyGPRMCInfo.N_S);
fprintf(BT,"Longitude: %f %c\n\r", MyGPRMCInfo.Longitude, MyGPRMCInfo.E_W);
fprintf(BT,"Speed: %f knots\n\r", MyGPRMCInfo.Speed);
}
else
fprintf(BT,"Detectando satelites...\n\r");
GPSDataReady = FALSE;
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Mar 25, 2017 5:21 pm |
|
|
Correct the simple things first. Here you have the #int_rda3 routine,
and you have enabled it in main(), but you don't get the character.
You have an empty routine. If a character comes in, this will just keep
interrupting over and over again, and your program will appear to lock
up. Never do this. Add an fgetc() statement to read the character.
Quote: | #INT_RDA3
void rda3_isr_GPRS(void)
{
}
|
2nd thing. At least for your initial testing, get rid of this stuff below.
For most people, "fixed_io" causes trouble. It doesn't help.
Quote: | #use FIXED_IO( A_outputs=PIN_A10,PIN_A8,PIN_A7 )
#use FIXED_IO( B_outputs=PIN_B14,PIN_B13,PIN_B6 )
#use FIXED_IO( C_outputs=PIN_C5,PIN_C0 ) |
|
|
|
Orcino
Joined: 07 Sep 2003 Posts: 56
|
|
Posted: Sun Mar 26, 2017 12:38 pm |
|
|
I did the changes you said, but it did not work.
I checked that this problem only happens, when there is some command like output_high or output_low.
If I remove these commands from the function, the program works.
Any idea what might be going on?
Thank you
Orcino
Code: |
#include <24FJ128GB204.h>
#build (stack=256)
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOWINDIS //Watch Dog Timer in Window mode
#FUSES NOJTAG //JTAG disabled
#FUSES CKSFSM //Clock Switching is enabled, fail Safe clock monitor is enabled
#FUSES NOWDTCMX //WDT always uses LPRC as its clock source
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES NOWPFP //Write/Erase Protect Page Start/End Location, set to page 0
#FUSES NOBROWNOUT //No brownout reset
#FUSES NODSBOR //BOR disabled in Deep Sleep
#FUSES NODSWDT //Deep Sleep Watchdog Timer disabled
#FUSES NODS //Deep Sleep operation is always disabled
#FUSES PLL6X //6x PLL Output Frequency is selected
#use delay(clock=60MHz,crystal=10MHz)
// #use FIXED_IO( A_outputs=PIN_A10,PIN_A8,PIN_A7 )
// #use FIXED_IO( B_outputs=PIN_B14,PIN_B13,PIN_B6 )
// #use FIXED_IO( C_outputs=PIN_C5,PIN_C0 )
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#define DATA_HT9200 PIN_A7
#define ON_OFF_GPRS PIN_A8
#define CE_HT9200 PIN_A10
#define USB_DET PIN_B3
#define STATUS_GPRS PIN_B4
#define ON_RADIO PIN_B6
#define PTT PIN_B13
#define CLK_HT9200 PIN_B14
#define RST_GPS PIN_C0
#define RST_BT PIN_C5
//==============================================================================
// Macros
//==============================================================================
#define ligaRadio output_low(ON_RADIO);
#define desligaRadio output_high(ON_RADIO);
//=============================================================================
//
//=============================================================================
#pin_select U1TX=PIN_C1
#pin_select U1RX=PIN_C2
#use rs232(UART1, baud=9600,ERRORS,stream=GPS)
#pin_select U2TX=PIN_B7
#pin_select U2RX=PIN_B8
#use rs232(UART2, baud=9600, ERRORS,stream=BT)
#pin_select U3TX=PIN_C4
#pin_select U3RX=PIN_C3
#use rs232(UART3, baud=9600, ERRORS,stream=GPRS)
#pin_select INT1 = PIN_B9
#include <string.h>
#include <stdlib.h>
#include <GPS_read.c>
//#include <SIM900D.c>
//=============================================================================
// Funções
//=============================================================================
void envia_dtmf(unsigned int8 A);
void verificaDadosRxDTMF(void);
void enviaCoordenadas(void);
//=============================================================================
// Variaveis Globais
//=============================================================================
char GPSData[80]; // Buffer de recepção dos dados so GPS
char GPRSdata[128];
char BTdata[20];
unsigned int8 GPSDataPtr=0,
BTDataPtr=0;
unsigned int8 GPSDataReady = FALSE,
BTReady = FALSE;
unsigned int8 GPSmsgCount = 0;
char GPSrxCaracter;
char GPRSrxCaracter;
char BTrxCaracter;
unsigned int8 DTMFrx=0;
unsigned int8 rxDDC=0;
int1 flagRxDTMF=0;
int1 A=0,B=0,C=0,D=0;
//==============================================================================
// Interrupção externa STD do HT9170
//==============================================================================
#INT_EXT1
void ext0_isr_HT9170(void)
{
flagRxDTMF=1;
A = input(PIN_C9);
B = input(PIN_C8);
C = input(PIN_C7);
D = input(PIN_C6);
}
//=============================================================================
// Interrupção RX UART1 GPS
// Recebe os dados do GPS e armazena no buffer
//=============================================================================
#INT_RDA
void rda_isr_GPS(void)
{
GPSrxCaracter = fgetc(GPS);
switch (GPSrxCaracter)
{
case '$':
GPSDataPtr = 0;
break;
case '\n':
{
if( (GPSdata[3] == 'R') && (GPSdata[4] == 'M') && (GPSdata[5] == 'C') )
GPSDataReady = TRUE;
}
break;
}
GPSData[GPSDataPtr++ & 0x7F] = GPSrxCaracter;
if(GPSdataPtr > 79)
GPSdataPtr=0;
}
//=============================================================================
// Interrupção RX UART2 BLUETOOTH
//=============================================================================
#INT_RDA2
void rda2_isr_BT(void)
{
BTrxCaracter = fgetc(BT);
BTdata[BTDataPtr]=BTrxCaracter;
if(BTrxCaracter == '\n')
BTready = TRUE;
BTDataPtr++;
if(BTDataPtr > 20 )
BTDataPtr=0;
}
//=============================================================================
// Interrupção RX UART3 GPRS
//=============================================================================
#INT_RDA3
void rda3_isr_GPRS(void)
{
GPRSrxCaracter = fgetc(GPRS);
}
//=============================================================================
// Função principal
//=============================================================================
void main()
{
setup_adc(ADC_OFF);
setup_adc_ports(NO_ANALOGS, VSS_VDD);
setup_timer1(TMR_DISABLED);
setup_timer2(TMR_DISABLED);
setup_timer3(TMR_DISABLED);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_RDA);
enable_interrupts(INT_RDA2);
enable_interrupts(INT_RDA3);
enable_interrupts(INTR_GLOBAL);
while(1)
{
envia_dtmf(10);
if(flagRxDTMF)
verificaDadosRxDTMF();
if (GPSDataReady)
enviaCoordenadas();
}
}
//=============================================================================
// Função que envia ton DTMF usando HT9200A
//=============================================================================
void envia_dtmf(unsigned int8 A)
{
int8 k;
output_high(CE_HT9200);
output_low(CLK_HT9200);
output_high(CLK_HT9200);
output_low(CE_HT9200);
delay_ms(15);
A = A & 0B00001111;
if (A == 0) // 0 em DTMF =10
A = 10;
for(k=0;k<5;k++)
{
if(bit_test(A,k) == 1)
output_high(DATA_HT9200);
else
output_low(DATA_HT9200);
output_low(CLK_HT9200);
delay_ms(1);
output_high(CLK_HT9200);
delay_ms(1);
}
output_high(DATA_HT9200); // DATA_HT9200=1;
delay_ms(100); // VALOR MINIMO DE DURAÇÃO DE CADA TOM DTMF
for(k=0;k<5;k++)
{
output_low(CLK_HT9200);
delay_ms(1);
output_high(CLK_HT9200);
delay_ms(1);
}
delay_ms(50);
}
//=============================================================================
//
//=============================================================================
void verificaDadosRxDTMF(void)
{
if(A==1) bit_set(DTMFrx,0);
if(B==1) bit_set(DTMFrx,1);
if(C==1) bit_set(DTMFrx,2);
if(D==1) bit_set(DTMFrx,3);
}
//==============================================================================
//
//==============================================================================
void enviaCoordenadas(void)
{
GPRMCInfo MyGPRMCInfo;
GPRMC_decode(GPSData, &MyGPRMCInfo);
if (MyGPRMCInfo.Valid == 'A')
{
delay_ms(500);
fprintf(BT,"\n\rTime: %d:%d:%d\n\r",MyGPRMCInfo.DT.Hour, MyGPRMCInfo.DT.Minute, MyGPRMCInfo.DT.Second);
fprintf(BT,"Date: %d/%d/%d\n\r", MyGPRMCInfo.DT.Day, MyGPRMCInfo.DT.Month, MyGPRMCInfo.DT.Year);
fprintf(BT,"Latitude: %f %c\n\r", MyGPRMCInfo.Latitude, MyGPRMCInfo.N_S);
fprintf(BT,"Longitude: %f %c\n\r", MyGPRMCInfo.Longitude, MyGPRMCInfo.E_W);
fprintf(BT,"Speed: %f knots\n\r", MyGPRMCInfo.Speed);
}
else
fprintf(BT,"Detectando satelites...\n\r");
GPSDataReady = FALSE;
}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19550
|
|
Posted: Sun Mar 26, 2017 12:59 pm |
|
|
You need to learn to debug.
Test one thing at a time.
Your problem is your code to drive the HT9200A, is really badly flawed.
You end with the chip left enabled. You have a huge delay (150mSec - that's 150 characters at your serial rate - no wonder the serial stops working...).
The chip accepts it's data at 100KHz. You don't need/want the huge delays.
The whole code is wrong. You need to drop CE, send five bits, and raise CE.
If you want to delay leaving the tone on, then have a tick timer, and keep in your main loop, and send the off code when this expires. |
|
|
|
|
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
|