please dont rip this site

Microchip SERIAL9.ASM

 
; 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 21:57, local time: 2024/11/8 15:13,
TOP NEW HELP FIND: 
3.135.184.127:LOG IN
©2024 PLEASE DON'T RIP! THIS SITE CLOSES OCT 28, 2024 SO LONG AND THANKS FOR ALL THE FISH!

 ©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?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://www.piclist.com/techref/microchip/SERIAL9.ASM"> microchip SERIAL9</A>

Did you find what you needed?

  PICList 2024 contributors:
o List host: MIT, Site host massmind.org, Top posters @none found
- Page Editors: James Newton, David Cary, and YOU!
* Roman Black of Black Robotics donates from sales of Linistep stepper controller kits.
* Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters.
* Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated!
* Contributors: Richard Seriani, Sr.
 
Quick, Easy and CHEAP! RCL-1 RS232 Level Converter in a DB9 backshell
Ashley Roll has put together a really nice little unit here. Leave off the MAX232 and keep these handy for the few times you need true RS232!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  .