#include <math.h>
#define adjust 1000//500,1000
#define bright 1
#define MAX_CONTROL PORTC.B5
#define TIMER_START_VALUE 250 //230,200,255,500
#define TIMER_START_VALUE_1 250 //210,160,254,255
[B]volatile[/B] unsigned char index,sdat=0,read=0,write=0;
volatile unsigned char input_string[12];
char FND_0=1,FND_1=2;
/*********************************************************/
void interrupt(){
void Interrupts() iv 0x0008 ics ICS_AUTO
{
//UART1
if((RC1IF_bit==1) && (RC1IE_bit==1)) if(PIR1.RCIF==1)
{
Test=~Test;
if(RCSTA.OERR)
{
RCSTA.CREN=0;
Nop();
RCSTA.CREN=1;
}
if(RCSTA.FERR)
{
//FERR: Framing Error bit
//1 = Framing error (can be updated by reading RCREG register and receiving next valid byte)
sdat=RCREG;
}
MAX_CONTROL =1;
UART1_Write(RCREG);
MAX_CONTROL =0;
[B] sdat=RCREG; [/B] // be sure to read RCREG register
if(sdat==64)
{
read=1;
MAX_CONTROL =1;
UART1_Write(FND_0);
MAX_CONTROL =0;
}
else
{
write=1;
MAX_CONTROL =1;
UART1_Write(FND_1);
MAX_CONTROL =0;
}
}
if(INTCON.TMR0IF){
TMR0L = TIMER_START_VALUE;
TMR0H = TIMER_START_VALUE_1;
TMR0IF_bit = 0;
}
}
void main() {
TRISD = 0x00; /*//PortD as output*/
PORTD = 0x00; /*//Initial value*/
TRISC = 0b10000000;
TRISB = 0x55; //0 as o/p, 1 as i/p
PORTB = 0x00;
INTCON =0b11100000 ; /*//0xc0;0xa0*/
TMR0ON_bit = 0; /*//Stop timer 0 during set up*/
T08BIT_bit = 0; /*// Enable 16 bit timer*/
T0CS_bit = 0; /*// use internal clock to trigger timer to count*/
PSA_bit = 0; /*// Use the prescaler to slow the timer down*/
// prescaler
T0PS0_bit = 0; //1 /*//for 16 bit timer 1/4 of clock freq 001*/
T0PS1_bit = 1; //0
T0PS2_bit = 0; //0
TMR0L = TIMER_START_VALUE;
TMR0H = TIMER_START_VALUE_1;
/*TXSTA = 0b00100000;
RCSTA = 0b10010000;
BAUDCON.BRG16 = 0;
TXSTA.BRGH = 0;
//SPBRGH:SPBRG = 129; //for 20MHz crystal
SPBRG = 25; //for 20MHz crystal*/
UART1_Init(9600);
Delay_ms(200);
PIR1.RCIF=0;
RCREG=0;
PIE1 = 0b00100000; //RCIE_bit=1 enabled RX it
MAX_CONTROL=0;
TMR0ON_bit = 1; //start the timer
[B] RCIP_bit=1; // see IPR1
IPEN_bit=1; // enable high priority see RCON
GIE_bit=1;[/B]
while(1){
};
}
char FND_0='1',FND_1='2';
#include <math.h>
#define MAX_CONTROL PORTC.B5
#define Test PORTD.B0 //Pin 19
volatile unsigned char index=0,sdat=0,read=0,write=0;
volatile unsigned char input_string[12];
char FND_0='1',FND_1='2';
/*********************************************************/
void interrupt(){
if(PIR1.RCIF==1){
Test=~Test;
if(RCSTA.OERR){
RCSTA.CREN=0;
Nop();
Nop();
RCSTA.CREN=1;
}
/*if(RCSTA.FERR){
RCSTA.SPEN=0;
Nop();
Nop();
RCSTA.SPEN=1;
}*/
else{
input_string[index]=RCREG;
MAX_CONTROL =1;
UART1_Write(input_string[index]);
MAX_CONTROL =0;
if(index==10) index=0;
}
//PIR1.RCIF=0;
}
}
void main() {
TRISD = 0x00; /*//PortD as output*/
PORTD = 0x00; /*//Initial value*/
TRISC = 0b10000000;
TRISB = 0x55; //0 as o/p, 1 as i/p
PORTB = 0x00;
INTCON =0b11100000 ; /*//0xc0;0xa0*/
TXSTA = 0b00100000;
RCSTA = 0b10010000;
BAUDCON.BRG16 = 0;
TXSTA.BRGH = 0;
//SPBRGH:SPBRG = 129; //for 20MHz crystal
SPBRG = 32; //for 20MHz crystal
//UART1_Init(9600);
//Delay_ms(200);
PIR1.RCIF=0;
RCREG=0;
PIE1 = 0b00100000; //RCIE bit enabled
PIR1.RCIF=0;
IPR1.RCIP = 1;
IPR1.TXIP = 1;
RCON.IPEN = 1;
PIE1 = 0b00100000; //RCIE bit enabled
MAX_CONTROL=0;
index=0;
while(1){
};
}
shall i take it as RCIF and RCIE bits
What char or string do you send ?In case of code provided by Paul, it is always printing 2.
you can replace this byUART1_Write(input_string[index]);
// choice of MCU
#define PIC18F45K22
#include <built_in.h>
#include <math.h>
// use LAT instead PORT for output on PIC18F
#ifdef PIC18F45K22
#define Test LATD.B0 // on my board
#define MAX_CONTROL LATD.B1
#else
#define Test LATD.B0 //Pin 19
#define MAX_CONTROL LATC.B5
#endif
volatile unsigned char index=0,sdat=0,read=0,write=0;
volatile unsigned char input_string[12];
// char FND_0='1',FND_1='2';
// high level of interrupt
void Interrupts() iv 0x0008 ics ICS_AUTO
{
// if you have more than one interrupt
// it is better to check also the corresponding Autoristaion bit
if((RC1IF_bit==1) && (RC1IE_bit==1))
{
Test=~Test;
if(RCSTA1.OERR)
{
RCSTA1.CREN=0;
_asm Nop; // usefull ??
_asm Nop;
RCSTA1.CREN=1;
}
if(RCSTA1.FERR)
{
// don't touch SPEN_bit !
// bit 7 SPEN: Serial Port Enable bit
// 1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)
sdat=RCREG1; // to erase FERR flag
}
// read RCREG , so RCIF will be cleared abd you get the content of RCREG
sdat=RCREG1;
MAX_CONTROL =1;
TXREG1=sdat; // echo receiveid char to TX UART
input_string[index]=sdat; // store the reading char
index++;
MAX_CONTROL =0;
index=0;
}
}
void main()
{
// conditional Hardware config
#ifdef PIC18F45K22
ANSELB = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
PORTB = 0x00; // set PORTB to FF
TRISB = 0; // designate portb pins as output
PORTA = 0xFF;
TRISA=0b11101111 ; // RA4 as output RA0,1,2,3,5=input
ANSELA=1; // RA0 as analog
TRISE=0;
PORTE=0xFF;
TRISD=0x00; // all outputs
ADCON0 =1 ;
ADCON1 = 0x8D ; //B'10001101'
PORTC = 0xFE; // set PORTC to $FF
TRISC=0b10111101 ; //RC1 as output
#else
// with your PIC
TRISD = 0x00; /*//PortD as output*/
PORTD = 0x00; /*//Initial value*/
TRISC = 0b10000000;
TRISB = 0x55; //0 as o/p, 1 as i/p
PORTB = 0x00;
#endif
//INTON
//GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
INTCON =0;
TMR0IE_bit=0; // timer0 IT not used here
//let's MikroC UART library do the job !
UART1_Init(9600);
#ifdef PIC18F45K22
UART1_Write_Text("\r\nTest with PIC18F45K22\r\n");
#else
UART1_Write_Text("\r\nTest with PIC18F4520\r\n");
#endif
// PIR1.RCIF=0; // you can NOT ERASE this bit !
sdat=RCREG; // here you erase RCIF bit !
// RCREG=0; // you can not eras it, read only register !
PIR1.RCIF=0;
IPR1.RCIP = 1;
// don't arme interrupt TX UART if not used
// IPR1.TXIP = 1; interrupt for transmit not used here !
RCON.IPEN = 1;
MAX_CONTROL=0;
index=0;
RCIE_bit=1; // idem as PIE1.RCIE=1; bit enabled
GIE_bit=1; // idem as INTCON.B7=1;
while(1)
{
};
}
#include <math.h>
#define MAX_CONTROL PORTC.B5
#define Test PORTD.B0 //Pin 19
volatile unsigned char index=0,sdat=0,read=0,write=0,garbage=0;
volatile unsigned char input_string[12],*string;
char FND_0='1',FND_1=2;
/*********************************************************/
//void interrupt(){
void Interrupts() iv 0x0008 ics ICS_AUTO{
if((RCIF_bit==1) && (RCIE_bit==1)) {
Test=~Test;
if(RCSTA.OERR)
{
RCSTA.CREN=0;
_asm Nop;
_asm Nop;
RCSTA.CREN=1;
garbage=RCREG;
}
if(RCSTA.FERR)
{
sdat=RCREG;
}
sdat=RCREG;
MAX_CONTROL =1;
TXREG = sdat;
input_string[index]=sdat;
TXREG=input_string[index];
/*if(sdat==64) read=1;
if(sdat==63) write=1;*/
index++;
MAX_CONTROL =0;
//if (index==5)
index=0;
}
}
void main() {
TRISD = 0x00; /*//PortD as output*/
PORTD = 0x00; /*//Initial value*/
TRISC = 0b10000000;
TRISB = 0x55; //0 as o/p, 1 as i/p
PORTB = 0x00;
INTCON =0b11000000 ; /*//0xc0;0xa0*/
/*TXSTA = 0b00100000;
RCSTA = 0b10010000;
BAUDCON.BRG16 = 0;
TXSTA.BRGH = 0;
//SPBRGH:SPBRG = 129; //for 20MHz crystal
SPBRG = 31; //for 20MHz crystal*/
UART1_Init(9600);
Delay_ms(2);
//PIR1.RCIF=0;
sdat=RCREG;
PIE1 = 0b00100000; //RCIE bit enabled
PIR1.RCIF=0;
IPR1.RCIP = 1;
//IPR1.TXIP = 1;
RCON.IPEN = 1;
PIE1 = 0b00100000; //RCIE bit enabled
INTCON.GIE=1;
MAX_CONTROL=0;
index=0;
while(1){
if(read==1){
MAX_CONTROL =1;
UART1_Write_Text("\r\nTest with PIC18F4520\r\n");
MAX_CONTROL =0;
read=0;
}
if(write==1){
MAX_CONTROL =1;
UART1_Write_Text("\r\nMay be wrking\r\n");
MAX_CONTROL =0;
write=0;
}
};
}
statement getting printed on serial window two times for each character sent once.
TXREG = sdat;
input_string[index]=sdat;
[B][COLOR=#FF0000]TXREG=input_string[index];[/COLOR][/B]
// TRMT: Transmit Shift Register Status bit// 1 = TSR empty 0 = TSR full
while l(TXSTA.TMRT==0) ; // wait until empty register
TXREG = sdat;
input_string[index]=sdat; // echo on terminal
add a line at the start of ISR to disable the interrupt like GIE=0, which will prevent another interrupt event before the previous one is completely processed. Then enable interrupt again at the end of ISR.
Hi paul,
But when i increment the array for each successive received character, and send it on UART, nothing is getting printed. Only for the '0' th index values gets printed. And no successive values.[/COLOR]
[B][COLOR=#0000FF] index++[/COLOR][/B];
MAX_CONTROL =0;
//if (index==5)
[COLOR=#FF0000] index=0;[/COLOR]
if(write==1){
MAX_CONTROL =1;
UART1_Write_Text("\r\nMay be working\r\n");
[B][COLOR=#0000CD] for (i=0;i<index,i++) UART1_Write (input_string[i];[/COLOR][/B]
UART1_Write('\r');UART1_Write('\n'); // next line
MAX_CONTROL =0;
write=0;
}
for (i=0;i<index,i++) UART1_Write (input_string[i];
#define MAX_CONTROL PORTC.B5
#define Test PORTD.B0
char input_string[12];
char index = 0;
void interrupt() {
if(RCIF_bit) {
if(OERR_bit) {
CREN_bit = 0;
CREN_bit = 1;
OERR_bit = 0;
}
input_string[index] = UART1_Read();
UART1_Write(input_string[index]);
index++;
input_string[index] = '\0';
RCIF_bit = 0;
if(index >= 12)index = 0;
MAX_CONTROL = 0;
}
}
void main() {
TRISA = 0xC0;
TRISC = 0xC0;
PORTC = 0x00;
LATC = 0x00;
UART1_Init(9600);
Delay_ms(200);
RCIE_bit = 1;
RCIF_bit = 0;
INTCON = 0xC0;
while(1) {
}
}
//*******************************************************************************
// Called when a byte from the host is received by the UART
void ByteFromBus()
{
BusRx = WaitRx();
if(BusRx == STX) //start of a new transmission block?
{
BusRxPtr = 0;
*BusRxBuffer = 0;
return;
}
if(BusRx == CR) //end of a transmission block
{
if(BusRxBuffer[0] == GATEBOX_ID) // check if for this module
{
switch(BusRxBuffer[1])
{
case 'Q': SendResponse();
break;
case 'I': IDResponse();
break;
case 'L': if(BusRxBuffer[2] == '1') GATE_LED = 1;
else GATE_LED = 0;
break;
case 'U': if(BusRxBuffer[2] == '1')
{
UNLOCK = 1;
RelockTimer = RELOCK_TENTH_SECONDS;
}
else
{
UNLOCK = 0;
RelockTimer = 0;
}
break;
case 'B': Beeper();
break;
case 'G': if(BusRxBuffer[2] == '1') GreenLEDEnabled = 1;
else GreenLEDEnabled = 0;
break;
case 'R': if(BusRxBuffer[2] == '1') RedLEDEnabled = 1;
else RedLEDEnabled = 0;
}
}
BusRxPtr = 0;
BusRxBuffer[0] = 0;
}
if(BusRxPtr < BUS_RXBUFFER_SIZE) // prevent buffer overflow
{
BusRxBuffer[BusRxPtr++] = BusRx;
BusRxBuffer[BusRxPtr] = 0;
}
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?