;******************************************** ;* DASHPIC USART TEST FEB 18, 2009 * ;******************************************** ; ;THIS PROGRAM is modified from USARTtest program. ;The ADC data will be sent in 3 byte hex-ascii with /0 for TCP ;tHE usart i/o IS INVERTED SO REMEMBER TO INVERT OUTPUT(RX USE OPTO) ;-BECAUSE OF 10K INPUT IMPED. CLK MUST BE SLOWER THAN .5MHZ (2uS) ;After each send, there's a 1/10 sec delay to mimic more closely the actual final pgm. ; ; ;ADCx to USART TX test complete FEB 18 2009 22:00 ; by Sandy Sims LIST P=16F74 ;LOWER BANK..... INDF EQU 0X00 TMR0 EQU 0X01 PCL EQU 0X02 STATUS EQU 0X03 FSR EQU 0X04 PORTA EQU 0X05 PORTB EQU 0X06 PORTC EQU 0X07 PORTD EQU 0X08 PORTE EQU 0X09 PCLATH EQU 0X0A INTCON EQU 0X0B PIR1 EQU 0X0C PIR2 EQU 0X0D TMR1L EQU 0X0E TMR1H EQU 0X0F T1CON EQU 0X10 TMR2 EQU 0X11 T2CON EQU 0X12 SSPBUF EQU 0X13 SSPCON EQU 0X14 CCPR1L EQU 0X15 CCPR1H EQU 0X16 CCP1CON EQU 0X17 RCSTA EQU 0X18 TXREG EQU 0X19 RCREG EQU 0X1A CCPR2L EQU 0X1B CCPR2H EQU 0X1C CCP2CON EQU 0X1D ADRES EQU 0X1E ADCON0 EQU 0X1F TIMER1 EQU 0X20 TIMER0 EQU 0X21 TIMER2 EQU 0X22 SSTATUS EQU 0X23 ;0=READY TO SEND (ADCX) DATA IN TX1,2,3 EEPFLAGS EQU 0X24 ;flags for EEPROM functions RXBP EQU 0x25 ADCXSEL EQU 0X26 ;0-7 ADCX SELECTION ADCXMSB EQU 0X27 ;ADCX MSB ADCXLSB EQU 0X28 TX1 EQU 0X29 ;TX SEND BUFFERS, ONLY FOR TEST PROG HERE! TX2 EQU 0X2A TX3 EQU 0X2B TXCNT EQU 0X2F ;COUNTS TX1,2,3 AS BEING SENT ;UPPER BANK..... OPTION_REG EQU 0X81 TRISA EQU 0X85 TRISB EQU 0X86 TRISC EQU 0X87 TRISD EQU 0X88 TRISE EQU 0X89 PIE1 EQU 0X8C PIE2 EQU 0X8D PCON EQU 0X8E PR2 EQU 0X92 SSPADD EQU 0X93 SSPSTAT EQU 0X94 TXSTA EQU 0X98 SPBRG EQU 0X99 ADCON1 EQU 0X9F ;eQUate bits....__________________ ;EEPFLAGS BYTE: EEPRTW EQU .0 ;Ready to write flag EEPRTWS EQU .1 ;Ready to write settings flag(from NMEA ram) ;TXSTA BITS TXEN EQU .5 BRGH EQU .2 ;MAY NOT USE,JUST USE BYTE TRMT EQU .1 SYNC EQU .4 ;RCSTA BITS SPEN EQU .7 CREN EQU .4 ;PIR1 BITS TXIF EQU .4 RCIF EQU .5 ORG 0000 GOTO START ORG 0004 NOP ;INTERUPT VECTOR ORG 0005 START ;goto ADCDATLP BSF STATUS,5 ;TRISES ARE IN UPPER MEM! MOVLW B'11111111' MOVWF TRISA MOVLW B'00000111' ;ONLY LAST 3 ARE PORT DIRECTION!! MOVWF TRISE MOVLW B'00101111' ;7,6 & 4 are outs to ADCx 3208 chip MOVWF TRISB ;in for now MOVLW B'11111100' ;C,6&7 ARE USART, 0=RLY,1=EEP+ MOVWF TRISC MOVLW B'00001111' ; MOVWF TRISD MOVLW .25 ;FOR USART BAUD RATE GEN MOVWF SPBRG BSF TXSTA,BRGH ;SET HISPEED BAUD GEN BCF TXSTA,SYNC ;SET TO ASYNC MODE BCF STATUS,5 MOVLW 0X30 MOVWF RXBP BSF RCSTA,SPEN ;SETS TO USART SERIAL PORTS BSF RCSTA,CREN ;SET TO CONTIN. RX BSF STATUS,5 BSF TXSTA,TXEN ;SET USART TO TX,NEXTBYTE WRIT WILL START IT BCF STATUS,5 MOVLW B'00011000' ;ADCx SELECT TO ADC#0 GOES 24 TO 31 >>24. BIT 4 IS STARTBIT. MOVWF ADCXSEL LOOP ;MAINLOOP... BTFSS SSTATUS,0 ;IF ADCX DATA NOT SENT YET THEN SKIP CALL ADCX ;GETS AN ADCX 12 BIT VALUE AND STORES IN HEX TO TX1,2,3 FOR SENDING BTFSC PIR1,TXIF ;SET IF REG EMPTY CALL ADCXSEND ;SHORT DELAY ;4066 CHANGE ON RX OF "1"-"4" SEL4066 BTFSS PIR1,RCIF ;(BIT5)CHECK RX? GOTO LOOP MOVF RCREG,W ;GET RX REG MOVWF TIMER0 BTFSC STATUS,2 ;/0? GOTO ADCXDONE MOVLW .49 ;"1" XORWF TIMER0,W ;SEL 4066(1) BTFSS STATUS,2 GOTO SEL2 MOVLW B'00010000' MOVWF PORTD SEL2 MOVLW .50 ;"2" XORWF TIMER0,W ;SEL 4066(1) BTFSS STATUS,2 GOTO SEL3 MOVLW B'00100000' MOVWF PORTD SEL3 MOVLW .51 ;"3" XORWF TIMER0,W ;SEL 4066(1) BTFSS STATUS,2 GOTO SEL4 MOVLW B'01000000' MOVWF PORTD SEL4 MOVLW .52 ;"4" XORWF TIMER0,W ;SEL 4066(1) BTFSS STATUS,2 GOTO LOOP MOVLW B'10000000' MOVWF PORTD GOTO LOOP ; ----THESE NOT USED IN THIS TEST----- TXUSARTRET CALL DELAY ;STUFF'S TOO FAST GOTO LOOP SLASHZERO BTFSS TIMER0,0 ;TOGGLES /0 FOR TCP CLRF ADRES BTFSS PIR1,RCIF ;(BIT5)CHECK RX? GOTO TXUSART RXUSART MOVF RXBP,W ;RX BUFFER POINTER 30-3F MOVWF FSR MOVF RCREG,W MOVWF INDF INCF RXBP BTFSS RXBP,6 ;IF = 40H THEN BUFFER FULL, SEND DATA ;IN BUFFERS BACK TO PC GOTO SLASHZERO CALL DELAY2 GOTO TXBUFFS ;SET FLAG TO GO? TXUSART MOVF ADRES,W ;GET ADC DATA, DOESN'T WORK IN SIM... MOVWF TXREG ;INCREMENT TO NEXT BYTE TO BE SENT WOULD BE HERE INCF TIMER0 GOTO TXUSARTRET ;------------------------------------------ DELAY MOVLW 0X12 MOVWF TIMER2 DLLP DECFSZ TIMER2 GOTO DLLP RETURN DELAY2 MOVLW 0X00 ;ABOUT 1 SECOND MOVWF TIMER1 CLRF TIMER0 DELAY2LP CALL DELAY DECFSZ TIMER0 GOTO DELAY2LP DECFSZ TIMER1 GOTO DELAY2LP RETURN TXBUFFS ;MUST SEND /0 TO FINISH ADC DUMP, OR ENTER WHEN TIMER0,0=1 MOVLW 0X30 MOVWF RXBP ;SET POINTER TO START OF RXBUFS TXBUFLP MOVF RXBP,W MOVWF FSR MOVF INDF,W MOVWF ADRES WAIT BTFSS PIR1,TXIF ;SET IF REG EMPTY GOTO WAIT ;JUST WAITS FOR TXREADY... MOVF ADRES,W ;GET ADC DATA, DOESN'T WORK IN SIM... MOVWF TXREG INCF RXBP BTFSS RXBP,6 ;=40? GOTO TXBUFLP MOVLW 0X30 MOVWF RXBP ; RESET FOR NEXT RX CALL DELAY2 ;WAITS 1 SECOND BEFORE RESUMING ADC GOTO LOOP CLRRAM1 ;CLEARS LOWER PAGE OF RAM 0020 TO 007F movlw 0x20 ;initialize pointer movwf FSR ;to RAM CLRRAM1LP clrf INDF ;clear INDF register incf FSR,F ;inc pointer btfss FSR,7 ;all done? goto CLRRAM1LP ;no, clear next BYTE RETURN ADCX ;ADCX USES TIMER0 FOR ROTBUFF OUT AND TIMER1 FOR COUNT, ADCXMSB/ADCXLSB MOVF ADCXSEL,W MOVWF TIMER0 MOVLW .06 ;SEND CONTROL+NULLS. 7 BITS(CLK LO-HI) MOVWF TIMER1 BCF PORTB,4 ;CLK, INITIALIZE BCF PORTB,7 ;CS LOW STARTS A SAMPLE SEQUENCE ADCXLP BTFSS TIMER0,4 ;SETUP DATA BCF PORTB,6 ;ADCX DIN BTFSC TIMER0,4 BSF PORTB,6 NOP BSF PORTB,4 ;CLK IN MIN 1uS PER HALF CYC NOP NOP RLF TIMER0 ;NEXT TO BIT 4 BCF PORTB,4 DECFSZ TIMER1 GOTO ADCXLP ADCXDAT ;NOW GET DATA MOVLW .12 MOVWF TIMER0 BSF PORTB,4 ;CLK HI BECAUSE ADC DATAout VALID AFTER HI=LO CLRF ADCXMSB ;WILL HAVE UPPER 4 BITS CLRF ADCXLSB ;WILL HAVE LOWER 8 BITS NOP ADCDATLP RLF ADCXLSB ;CARRY WILL GO INTO MSB BCF PORTB,4 ;CLK HI->LO RLF ADCXMSB BTFSS PORTB,5 ;ADCX DATA OUT BCF ADCXLSB,0 BTFSC PORTB,5 BSF ADCXLSB,0 BSF PORTB,4 DECFSZ TIMER0 GOTO ADCDATLP BSF PORTB,7 ;CS BACK HI = DONE ;CONVERT DATA THEN SEND MOVF ADCXMSB,W ;CONVERT MSB ANDLW 0X0F ;TRIM TOP TO BE SAFE! CALL BIN2HEX ;CONVERTS NIBBLE TO ASCII MOVWF TX1 ;BUFFER TO FIRST TX SWAPF ADCXLSB,W ;SWAP IN MS NIBBLE NEXT ANDLW 0X0F ;TRIM TOP CALL BIN2HEX MOVWF TX2 MOVF ADCXLSB,W ;GET LAST NIBBLE ANDLW 0X0F ;TRIM OF TOP CALL BIN2HEX MOVWF TX3 ;TX1,2, & 3 NOW HOLD THE ADC CONVERSION. INCF ADCXSEL ;FOR NEXT ADCX**IF 4066<>"0" THEN SOME OF THESE WILL BE SKIPPED BTFSS ADCXSEL,5 ;MAX IS 00011111 GOTO ADCXDONE MOVLW B'00011000' ;ADCx SELECT TO ADC#0 GOES 24 TO 31 >>24. BIT 4 IS STARTBIT. MOVWF ADCXSEL ;***NEXT 4066 WOULD BE SELECTED HERE FOR INPUTS THAT USE THEM ADCXDONE BSF SSTATUS,0 ;tx ready_to_send-TO JUMP TO ADCXSEND FROM LOOP, FLAG MOVLW 0X29 ;SET POINTER TO TX1 MOVWF TXCNT ;SET POINTER TO TX123 FOR ADCX DATA MOVLW .25 ;100MS MOVWF TIMER1 CALL DELAY2LP RETURN ADCXSEND ;NOW THE DATA MUST BE SENT VIA USART / TXCNT POINTS TO TX1,2,3 MOVLW 0X2C ;PAST END OF RAM?IF SO SEND /0 XORWF TXCNT,W BTFSC STATUS,2 ;SKIP IF NO MATCH. NOT DONE YET GOTO ADCXSEND_DONE MOVF TXCNT,W ;GET NEXT BYTE TO SEND MOVWF FSR MOVF INDF,W MOVWF TXREG ;USART WILL SEND THIS INCF TXCNT RETURN ADCXSEND_DONE MOVLW 0X00 ;/0 MOVWF TXREG ;SEND END /0 BCF SSTATUS,0 ;RESET ADCX TX FLAG RETURN ;1 ADCX CHANNEL SMPLED AND SENT! BIN2HEX ADDWF PCL ;CONVERT 4 BIT BINARY TO HEX ASCII. 0 - 15 = "0" TO "F" RETLW .48 ;"0" RETLW .49 RETLW .50 RETLW .51 RETLW .52 RETLW .53 RETLW .54 RETLW .55 RETLW .56 RETLW .57 ;"9" RETLW .65 ;"A" RETLW .66 RETLW .67 RETLW .68 RETLW .69 RETLW .70 ;"F" END