; CC5X Version 3.0E, Copyright (c) B. Knudsen Data ; C compiler for the PICmicro family ; ************ 19. Dec 1999 19:57 ************* processor 16F84 radix DEC OPTION_REG EQU 0x81 PORTA EQU 0x05 TRISA EQU 0x85 PORTB EQU 0x06 TRISB EQU 0x86 PCLATH EQU 0x0A INTCON EQU 0x0B Carry EQU 0 Zero_ EQU 2 RP0 EQU 5 _TxOUT EQU 0 RxD_pin EQU 0 rxBuf EQU 0x0E timeout EQU 0x0D idx EQU 0x0C idx_2 EQU 0x7F GOTO main ; FILE D:\WINDOWS\DESKTOP\IRV00\SERIAL9.C ;/* ; * 9 bit BitBang Serial routines ; * 19/Dec/1999 JLS ; * (c) 1999 Jose Luiz Pinto Souto ; * souto@cryogen.com ; * CC5x Compiler (http://www.bknd.com) ; * 10 MHz operation ; */ ; ;#include <16f84.h> ; ;#pragma update_RP 0 /* OFF */ ; ;#define DEF_TRISA 0x00 ;#define DEF_TRISB 0x01 ; ;bit _TxOUT @ PORTA.0; ;bit RxD_pin @ PORTB.0; ; ; ;unsigned char rxBuf[2]; ; ;void Delay_uSeg (unsigned char timeout); ;void TxSerial (void); ;void RxSerial (void); ; ;/*--------------------------------------------------------------------------*/ ;void Delay_uSeg (unsigned char timeout) { Delay_uSeg MOVWF timeout ;/*--------------------------------------------------------------------------*/ ; ; // delay = (3*timeout + 7) * 0.4uS (including call and return) ; ; while (1) { m001 DECFSZ timeout,1 ; timeout--; GOTO m001 ; if (timeout==0) { NOP ; nop(); NOP ; nop(); RETURN ; return; ; } ; } ; ;}// Delay_uSeg ; ;/*--------------------------------------------------------------------------*/ ;void TxSerial (void) { TxSerial ;/*--------------------------------------------------------------------------*/ ; ;/* ; ;---------------------------------------------------------------------------* ; ; Transmit 1 start bit Lo, 9 data bits and 1 stop bit Hi at 9600 bps ; ; Byte time = 1.144 mS ; ; Bit time = 104 uS (0.16% error @ 10 MHz) ; ; Input : rxBuf[0] = 9th bit (bit 0) ; ; rxBuf[1] = byte to be transmitted ; ; Output: byte transmitted by serial pin ; ;---------------------------------------------------------------------------* ;*/ ; ; char idx; ; BSF rxBuf,1 ; rxBuf[0] = rxBuf[0] | 0x02; // stop bit added BCF 0x03,Carry ; Carry = 0; // start bit in carry ; MOVLW .11 ; for (idx=11; idx; idx--) { // 3*0.4us=1.2us MOVWF idx m002 MOVF idx,1 BTFSC 0x03,Zero_ GOTO m003 BTFSS 0x03,Carry ; _TxOUT = Carry; // 4*0.4us=1.6us BCF 0x05,_TxOUT BTFSC 0x03,Carry BSF 0x05,_TxOUT MOVLW .80 ; Delay_uSeg(80); // (80*3+7)*0.4us = 98.8 us CALL Delay_uSeg RRF rxBuf,1 ; rxBuf[0] = rr(rxBuf[0]); // 1*0.4us=0.4us RRF rxBuf+1,1 ; rxBuf[1] = rr(rxBuf[1]); // 1*0.4us=0.4us DECF idx,1 ; } // 3*0.4us=1.2us GOTO m002 m003 RETURN ;} ; ;/*--------------------------------------------------------------------------*/ ;void RxSerial (void) { RxSerial ;/*--------------------------------------------------------------------------*/ ; ;/* ; ;---------------------------------------------------------------------------* ; ; Receives 1 start bit Lo, 9 data bits and 1 stop bit Hi at 9600 bps ; ; Byte time = 1.144 mS ; ; Bit time = 104 uS (0.16% erro w/10 Mhz) ; ; ; ; False start bit check ; ; ; ; Start bit hunting timeout = 4*1.283ms ; ; ; ; Input : none ; ; Output : Carry = 1 => success ; ; rxBuf[0,1] = input byte +9th bit ; ; Carry = 0 => error (timeout or stop bit=0) ; ;---------------------------------------------------------------------------* ;*/ ; ; char idx; ; MOVLW .4 ; rxBuf[0] = 4; // 5.135 ms timeout MOVWF rxBuf CLRF idx_2 ; idx = 0; ; ; while (1) ; { m004 BTFSS 0x06,RxD_pin ; while (RxD_pin) // input "high" GOTO m005 ; { DECFSZ idx_2,1 ; if ((-- idx)==0) GOTO m004 ; { DECFSZ rxBuf,1 ; rxBuf[0]--; GOTO m004 ; if (rxBuf[0]==0) ; { BCF 0x03,Carry ; Carry = 0; RETURN ; return; ; } ; } ; } ; m005 MOVLW .40 ; Delay_uSeg(40); // 1/2 bit delay (40*3+7)*0.4us=50.8us CALL Delay_uSeg BTFSC 0x06,RxD_pin ; if (RxD_pin) GOTO m004 ; continue; // false start bit detection ; MOVLW .1 ; rxBuf[0] = 0x01; // 9 bits counter and reception buffer MOVWF rxBuf CLRF rxBuf+1 ; rxBuf[1] = 0x00; ; ; do ; { m006 MOVLW .81 ; Delay_uSeg(81); // (81*3+7)*0.4us=100us CALL Delay_uSeg NOP ; nop(); // 0.4us NOP ; nop(); // 0.4us BCF 0x03,Carry ; Carry = RxD_pin; // 1.2us bit read BTFSC 0x06,RxD_pin BSF 0x03,Carry RRF rxBuf,1 ; rxBuf[0] = rr(rxBuf[0]); // 0.4us store and count RRF rxBuf+1,1 ; rxBuf[1] = rr(rxBuf[1]); // 0.4us ; } // 1.2us BTFSS 0x03,Carry ; while (Carry==0); GOTO m006 MOVLW .81 ; Delay_uSeg(81); // (81*3+7)*0.4us=100us CALL Delay_uSeg NOP ; nop(); // 0.4us BCF 0x03,Carry ; Carry = RxD_pin; // stop bit read BTFSC 0x06,RxD_pin BSF 0x03,Carry RETURN ; return; // 100 us availiable ; } ;} ; ; ;/*--------------------------------------------------------------------------*/ ;void main (void) ;/*--------------------------------------------------------------------------*/ ;{ main ; CLRF INTCON ; INTCON = 0; // no interrupts CLRF PCLATH ; PCLATH = 0; // bank 0 MOVLW .1 ; PORTA = 1; MOVWF PORTA CLRF PORTB ; PORTB = 0; BSF 0x03,RP0 ; RP0 = 1; // RAM bank 1 CLRF TRISA ; TRISA = DEF_TRISA; MOVWF TRISB ; TRISB = DEF_TRISB; MOVLW .195 ; OPTION = 0b11000011; // Prescaler Timer0 1:16 MOVWF OPTION_REG BCF 0x03,RP0 ; RP0 = 0; // RAM bank 0 ; ; while (1) { ;// RxSerial(); m007 MOVLW .1 ; rxBuf[0]=0x01; // 9th bit MOVWF rxBuf MOVLW .170 ; rxBuf[1]=0xAA; // test byte MOVWF rxBuf+1 CALL TxSerial ; TxSerial(); GOTO m007 ; } ; END
file: /Techref/microchip/SERIAL9.ASM, 6KB, , updated: 1999/12/19 22:57, local time: 2024/8/14 23:14,
18.117.187.38:LOG IN
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://techref.massmind.org/Techref/microchip/SERIAL9.ASM"> microchip SERIAL9</A> |
Did you find what you needed? |
Welcome to massmind.org! |
Welcome to techref.massmind.org! |
.