saeed_pk
Full Member level 4
- Joined
- May 20, 2006
- Messages
- 237
- Helped
- 35
- Reputation
- 68
- Reaction score
- 28
- Trophy points
- 1,308
- Location
- Islamabad, Pakistan
- Activity points
- 2,655
software uart
I va tried bitbang procedure given in samples of PICC on PIC16F877A , when i tried to utilized it for PIC18F452 it does not work
Compiler Used :
Hi-Tech PICC for 16F877A
Hi-Tech PICC-18 for 18F452
please help ..
and main file is
I va tried bitbang procedure given in samples of PICC on PIC16F877A , when i tried to utilized it for PIC18F452 it does not work
Compiler Used :
Hi-Tech PICC for 16F877A
Hi-Tech PICC-18 for 18F452
please help ..
Code:
/*
* Serial port driver (uses bit-banging)
* for 16Cxx series parts.
*
* IMPORTANT: Compile this file with FULL optimization
*
* Copyright (C)1996 HI-TECH Software.
* Freely distributable.
*/
#include <pic.h>
/*
* Tunable parameters
*/
/* Transmit and Receive port bits */
#define SERIAL_PORT PORTC
#define SERIAL_TRIS TRISC
#define TX_PIN 6
#define RX_PIN 7
/* Xtal frequency */
#define XTAL 4000000
/* Baud rate */
#define BRATE 9600
/* Don't change anything else */
#define SCALER 10000000
#define ITIME 4*SCALER/XTAL /* Instruction cycle time */
#if BRATE > 1200
#define DLY 3 /* cycles per null loop */
#define TX_OHEAD 13 /* overhead cycles per loop */
#else
#define DLY 9 /* cycles per null loop */
#define TX_OHEAD 14
#endif
#define RX_OHEAD 12 /* receiver overhead per loop */
#define DELAY(ohead) (((SCALER/BRATE)-(ohead*ITIME))/(DLY*ITIME))
static bit TxData @ (unsigned)&SERIAL_PORT*8+TX_PIN; /* Map TxData to pin */
static bit RxData @ (unsigned)&SERIAL_PORT*8+RX_PIN; /* Map RxData to pin */
#define INIT_PORT SERIAL_TRIS = 1<<RX_PIN /* set up I/O direction */
void
putch(char c)
{
unsigned char bitno;
#if BRATE > 1200
unsigned char dly;
#else
unsigned int dly;
#endif
INIT_PORT;
TxData = 0; /* start bit */
bitno = 12;
do {
dly = DELAY(TX_OHEAD); /* wait one bit time */
do
/* waiting in delay loop */ ;
while(--dly);
if(c & 1)
TxData = 1;
if(!(c & 1))
TxData = 0;
c = (c >> 1) | 0x80;
} while(--bitno);
NOP();
}
char
getch(void)
{
unsigned char c, bitno;
#if BRATE > 1200
unsigned char dly;
#else
unsigned int dly;
#endif
for(;;) {
while(RxData)
continue; /* wait for start bit */
dly = DELAY(3)/2;
do
/* waiting in delay loop */ ;
while(--dly);
if(RxData)
continue; /* twas just noise */
bitno = 8;
c = 0;
do {
dly = DELAY(RX_OHEAD);
do
/* waiting in delay loop */ ;
while(--dly);
c = (c >> 1) | (RxData << 7);
} while(--bitno);
return c;
}
}
char
getche(void)
{
char c;
putch(c = getch());
return c;
}
and main file is
Code:
#include <stdio.h>
#include <pic.h>
/* A simple demonstration of serial communications which
* uses the bit-banging implementation of a serial communications.
* Useful for PIC16Cxxx series of devices, or if USART is already
* in use. */
void main(void){
unsigned char input;
INTCON=0; // purpose of disabling the interrupts.
printf("\rPress a key and I will echo it back:\n");
while(1){
input = getch(); // read a response from the user
printf("\rI detected [%c]",input); // echo it back
}
}