tiwari.sachin
New Member
Hello
I am trying the code for uart in interrupt mode.
My code works fine when i am not using it in interrupt mode.
Somewhere round my interrupt service routine seems to be wrong. I am not really familiar with interrupt usage.
My main code is as follows
#include<htc.h>
#include "usart.h"
int main()
{
char uart_read_value;
init_comms();
RCIE = 1;
GIE = 1;
//uart_read_value = getch();
//putch(uart_read_value);
while(1)
{
CLRWDT();
}
}
void interrupt ISR_high(void)
{
char input;
if((RCIF) && (RCIE))
{
// Overrun error bit
//if(OERR) //
//{ //
// CREN=0; // Restart USART
// CREN=1; //
//} //
// If error ...
//if(FERR)
//{
// Flush buffer
// RCREG=RCREG;
// RCREG=RCREG;
// RCREG=RCREG;
//}
//else
//{
input = RCREG;
putch(input);
//}
}
}
usart.c
#include <htc.h>
#include <stdio.h>
#include "usart.h"
void
putch(unsigned char byte)
{
/* output one byte */
while(!TXIF) /* set when register is empty */
continue;
TXREG = byte;
}
usart.h
#ifndef _SERIAL_H_
#define _SERIAL_H_
#define BAUD 9600
#define FOSC 4000000L
#define NINE 0 /* Use 9bit communication? FALSE=8bit */
#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
#define HIGH_SPEED 1
#if NINE == 1
#define NINE_BITS 0x40
#else
#define NINE_BITS 0
#endif
#if HIGH_SPEED == 1
#define SPEED 0x4
#else
#define SPEED 0
#endif
#if defined(_16F87) || defined(_16F88)
#define RX_PIN TRISB2
#define TX_PIN TRISB5
#else
#define RX_PIN TRISC7
#define TX_PIN TRISC6
#endif
/* Serial initialization */
#define init_comms()\
RX_PIN = 1; \
TX_PIN = 1; \
SPBRG = DIVIDER; \
RCSTA = (NINE_BITS|0x90); \
TXSTA = (SPEED|NINE_BITS|0x20)
void putch(unsigned char);
I am confused with void interrupt ISR_high(void) call for ISR, Is it right what i am doing. If not what should i be doing..
I can see RCIF and RCIE bit being set and RCREG also has the uart value in it.
When i have a breakpoint in ISR, the code never comes there.
I am not clear how to call the ISR.
Kindly let me know the solution to this..
Regards
Sachin
I am trying the code for uart in interrupt mode.
My code works fine when i am not using it in interrupt mode.
Somewhere round my interrupt service routine seems to be wrong. I am not really familiar with interrupt usage.
My main code is as follows
#include<htc.h>
#include "usart.h"
int main()
{
char uart_read_value;
init_comms();
RCIE = 1;
GIE = 1;
//uart_read_value = getch();
//putch(uart_read_value);
while(1)
{
CLRWDT();
}
}
void interrupt ISR_high(void)
{
char input;
if((RCIF) && (RCIE))
{
// Overrun error bit
//if(OERR) //
//{ //
// CREN=0; // Restart USART
// CREN=1; //
//} //
// If error ...
//if(FERR)
//{
// Flush buffer
// RCREG=RCREG;
// RCREG=RCREG;
// RCREG=RCREG;
//}
//else
//{
input = RCREG;
putch(input);
//}
}
}
usart.c
#include <htc.h>
#include <stdio.h>
#include "usart.h"
void
putch(unsigned char byte)
{
/* output one byte */
while(!TXIF) /* set when register is empty */
continue;
TXREG = byte;
}
usart.h
#ifndef _SERIAL_H_
#define _SERIAL_H_
#define BAUD 9600
#define FOSC 4000000L
#define NINE 0 /* Use 9bit communication? FALSE=8bit */
#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
#define HIGH_SPEED 1
#if NINE == 1
#define NINE_BITS 0x40
#else
#define NINE_BITS 0
#endif
#if HIGH_SPEED == 1
#define SPEED 0x4
#else
#define SPEED 0
#endif
#if defined(_16F87) || defined(_16F88)
#define RX_PIN TRISB2
#define TX_PIN TRISB5
#else
#define RX_PIN TRISC7
#define TX_PIN TRISC6
#endif
/* Serial initialization */
#define init_comms()\
RX_PIN = 1; \
TX_PIN = 1; \
SPBRG = DIVIDER; \
RCSTA = (NINE_BITS|0x90); \
TXSTA = (SPEED|NINE_BITS|0x20)
void putch(unsigned char);
I am confused with void interrupt ISR_high(void) call for ISR, Is it right what i am doing. If not what should i be doing..
I can see RCIF and RCIE bit being set and RCREG also has the uart value in it.
When i have a breakpoint in ISR, the code never comes there.
I am not clear how to call the ISR.
Kindly let me know the solution to this..
Regards
Sachin