Name: | Mr. Fredy Lievano |
Web Site: | |
Code:
aqui esta un comverzor a/d que envia los datos por el rs323 y adeams recibe datos los manda al portb a su vez retorna el dato al pcHere is c a/d that takes al the data referent to a volt on portb and send all that data to the pc via rs232 and it also reads data from the PC shows it on the portb and resend it to the serial port.
LIST P=16F873 #INCLUDE "p16f873.inc" ;STATUS EQU 03H PORT_A EQU 05H PORT_B EQU 06H PORT_C EQU 07H ;PCLATC EQU 0AH ;INTCON EQU 0BH ;PIR1 EQU 0CH ;RCSTA EQU 18H ;TXREG EQU 19H ;RCREG EQU 1AH ;ADRESH EQU 1EH ;ADCON0 EQU 1FH ;TRISA EQU 85H ;TRISB EQU 86H ;TRISC EQU 87H ;TXSTA EQU 98H ;SPBRG EQU 99H ADRES1 EQU 9EH ;ADCON1 EQU 9FH ;RP0 EQU 5 ;RP1 EQU 6 ;IRP EQU 7 ;Z EQU 2 ;C EQU 0 ;TXIF EQU 4 LOOPS EQU 20H LOOPS2 EQU 21H CAJA1 EQU 22H CAJA2 EQU 23H CAJA3 EQU 24H BUFFER EQU 25H ;receive EQU 26H __CONFIG _CP_OFF & _PWRTE_OFF& _WDT_OFF & _XT_OSC & _LVP_OFF & _BODEN_OFF ;CONFIGURO ; PARA LA GRABACION, CODE PROTECT OFF, RESET DE ENCENDIDO ,ETC ;************************* COMIENZO DEL PROGRAMA ********************* ORG 00 GOTO INICIO ;----------------------------------------------------------------------- RETARDO MOVWF LOOPS ;RUTINA DE RETARDO EN MILISEGUNDOS TOP2 MOVLW .110 ;EL NUMERO DE MILISEC LLEGA CARGADO MOVWF LOOPS2 ;EN EL REGISTRO LOOPS TOP NOP DECFSZ LOOPS2,1 ;PREGUNTA SI TERMINO 1 mS. GOTO TOP DECFSZ LOOPS,1 ;PREGUNTA SI TERMINO RETARDO GOTO TOP2 RETLW 0 ;-----------------------------------------------------------------------; ; RUTINA DE CONVERSION A/D A 10 BITS DEVUELVE 3 DATOS EN HEXADECIMAL GUARDADOS ; ; ; ; EN LOS REGISTROS CAJA1, CAJA2 Y CAJA3 ; ;-----------------------------------------------------------------------; CONVER BSF STATUS,RP0 MOVLW B'10000010' ;SELECCIONA Vref INTERNO(+5 Y GND) MOVWF ADCON1 ;DATOS EN ADRESL Y 2 BITS EN ADRESH BCF STATUS,RP0 BSF ADCON0,GO ;INICIO DE CONVERSION NOP NOP CONSU BTFSC ADCON0,GO ;ESPERA QUE TERMINE DE CONVERTIR GOTO CONSU MOVF ADRESH,W MOVWF CAJA1 ;PASA TRES DIGITOS HEXADECIMALES MOVLW 30H ;A REGISTROS INDIVIDUALES ADDWF CAJA1,1 ;PARA SER TRANSMITIDO BSF STATUS,RP0 ;AL REGISTRO CAJA1 LE SUMA 30H MOVF ADRES1,W ;PARA CONVERTIRLO EN ASCII BCF STATUS,RP0 MOVWF BUFFER ANDLW 0FH MOVWF CAJA3 ;EL REGISTRO CAJA3 QUE CONTIENE MOVLW 0AH ;EL DIGITO MENOS SIGNIFICATIVO DEBE SUBWF CAJA3,0 ;PROBARSE PARA VER SI ES UN NUMERO MOVLW 37H ;DE 0 A 9 O SI ES LA LETRA A HASTA F BTFSS STATUS,C ;PARA HACER LA CONVERSION A ASCII MOVLW 30H ADDWF CAJA3,1 SWAPF BUFFER,0 ANDLW 0FH MOVWF CAJA2 ;EL DIGITO CAJA2 TIENE EL MISMO MOVLW 0AH ;PROCEDIMIENTO QUE CAJA3 SUBWF CAJA2,0 MOVLW 37H BTFSS STATUS,C MOVLW 30H ADDWF CAJA2,1 RETLW 0 ;-----------------------------------------------------------------------; ; ESTA RUTINA ENVIA LOS DATOS de CONVERSION ; ; ; ;-----------------------------------------------------------------------; ENVIAR MOVF CAJA1,0 ;TRANSMITE EL DIGITO HEXADECIMAL ESPER BTFSS PIR1,TXIF ;PDE MAYOR PESO GOTO ESPER MOVWF TXREG MOVF CAJA2,0 ;TX EL SEGUNDO DIGITO HEXA ESPERA BTFSS PIR1,TXIF ;PERO DEBE ESPERAR QUE TERMINE DE GOTO ESPERA ;TX EL DATO ANTERIOR MOVWF TXREG MOVF CAJA3,0 ;TX TERCER DIGITO ESPER2 BTFSS PIR1,TXIF GOTO ESPER2 MOVWF TXREG MOVLW .88 ;TX EL CARACTER "x" PARA SEPARAR ESPER3 BTFSS PIR1,TXIF ;CADA DATO DE LOS DIFERENTES CANALES GOTO ESPER3 MOVWF TXREG RETLW 0 ;-----------------------------------------------------------------------; ; ESTA RUTINA recive SERIALMENTE LOS DATOS ; ;-----------------------------------------------------------------------; dato bcf STATUS,RP0 ; RAM PAGE 0 movlw b'10010000' ; enable Async Reception movwf RCSTA nop nop movf RCREG,W ; save received data in W movwf TXREG ; send data in W TransWt bsf STATUS,RP0 ; RAM PAGE 1 WtHere btfss TXSTA,TRMT ; aquireboto dato para comprobar qeu leyo goto WtHere bcf STATUS,RP0 ; RAM PAGE movf RCREG,W movwf PORT_B RETLW 0 ;-----------------------------------------------------------------------; ; ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;PROGRAMA PRINCIPAL ;-----------------------------------------------------------------------; INICIO BSF STATUS,RP0 ;RAM PAGE 0 MOVLW B'11111111' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB ;PUERTOS A Y B COMO ENTRADAS MOVLW B'10101111' MOVWF TRISC ;PUERTO C ENTRADAS Y PIN TX SALIDA MOVLW B'00100110' ;PROGRAMA USART ASINCRONO PARA TX MOVWF TXSTA ;ALTA RATA DE BAUDIOS MOVLW .25 ;CONFIGURA TEMPORIZADOR A 4MHZ MOVWF SPBRG ;9600 BPS (8,N,1) call dato BCF STATUS,RP0 ;RAM PAGE 0 BSF PIR1,TXIF MOVLW B'10000001' ;SELECCIONA CANAL 0 Y RELOJ DE CONV MOVWF ADCON0 ;CONVERTIDOR ENCENDIDO ;call dato CALL CONVER ;LLAMA RUTINA CONVERSION A/D CALL ENVIAR ;ENVIA DATOS SERIALES MOVLW B'10001001' ;SELECCIONA CANAL1 Y RELOJ DE CONVERSION MOVWF ADCON0 ;CONVERTIDOR ENCENDIDO CALL CONVER CALL ENVIAR MOVLW .13 ;LA SEPARACION ENTRE CADA BLOQUE ESPER4 BTFSS PIR1,TXIF ;DE 4 DATOS GOTO ESPER4 ;SE HACE CON EL CARRIAGE RETURN MOVWF TXREG ;Y UN CARACTER LINE FEED MOVLW .10 ;SIRVE PARA SEPARAR LAS LINEAS DE ;DATOS QUE SE RECIBEN, BAJA UN RENGLON ESPER5 BTFSS PIR1,TXIF ;EN EL PROGRAMA TERMINAL DE WINDOWS GOTO ESPER5 ;CADA LINEA DE DATOS TIENE ;CANAL0, CANAL1 , CANAL2 , CANAL3 MOVWF TXREG ESPER6 BTFSS PIR1,TXIF ;ESTA COMPROBACION ES PARA ;GARANTIZAR QUE SE TRANSMITA GOTO ESPER6 ;EL ULTIMO CARACTER ANTES DE SEGUIR MOVLW .110 ;RETARDO ENTRE BLOQUES DE 4 DATOS CALL RETARDO GOTO INICIO ;COMIENZA NUEVAMENTE PARA ENVIAR ;OTRO PAQUETE DE DATOS END any questions email me to fredylg@gmail.com
;;---------------Encabezado------------- LIST P=16F873 #INCLUDE "p16f873.inc" radix hex ;------------mapa de memoria--------- LOOPS EQU 20H LOOPS2 EQU 21H estado equ 0x03 ; Haciendo asignaciones dc1 equ 0x0C ; Estos 3 registros los utilizaré dc2 equ 0x0D ; para hacer el retardo reg3 equ 0x0E CONTADOR EQU 21H cont EQU 0A MEMORIA EQU 28H __CONFIG _CP_OFF & _PWRTE_OFF& _WDT_OFF & _XT_OSC & _LVP_OFF & _BODEN_OFF ;CONFIGURO ;-------**** COMIENZO DEL PROGRAMA ****----- ORG 00 GOTO INICIO ;----------------------- LOOP NO BTFSS PORTA,2 GOTO NO MOVFW PORTA ;lee el dato y lo mandada MOVWF MEMORIA ;a memoria BTFSS MEMORIA,1 ;lee el dato de ra1 GOTO STEPCCW ; BTFSS MEMORIA,0 ;si el pusador en ra0 esta en uno vulveve a mirara GOTO STEPCW ;sino entonces anda hacia el otro lado GOTO LOOP ; SI AMOS SON CERO VOALVO A LEER HASTA QEU CAMBIE STEPCW NOOO BTFSS PORTA,2 GOTO NOOO CALL S1 ;da un paso y BTFSS PORTA,1 ;si el pulsador 1 cambio GOTO LOOP ;checkea CALL S2 BTFSS PORTA,1 GOTO LOOP CALL S3 BTFSS PORTA,1 GOTO LOOP CALL S4 GOTO STEPCW STEPCCW NOO BTFSS PORTA,2 GOTO NOO CALL S4 BTFSS PORTA,0 GOTO LOOP CALL S3 BTFSS PORTA,0 GOTO LOOP CALL S2 BTFSS PORTA,0 GOTO LOOP CALL S1 GOTO STEPCCW S1 MOVLW B'00000101' MOVWF PORTC CALL DELAY CALL DELAY RETURN S2 MOVLW B'000000110' MOVWF PORTC CALL DELAY CALL DELAY RETURN S3 MOVLW B'000001010' MOVWF PORTC CALL DELAY CALL DELAY RETURN S4 MOVLW B'0000001001' MOVWF PORTC CALL DELAY CALL DELAY RETURN ;------------------------------------------------ DELAY movlw 35 ; Outer loop iteration count movwf dc1 dl1 clrf dc2 ; Initialize inner loop dl2 nop nop decfsz dc2,F goto dl2 decfsz dc1,F goto dl1 return ;----------------------------------------------------------------------- INICIO BSF STATUS,RP0 MOVLW 06h MOVWF ADCON1 MOVLW B'00001111' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB MOVLW B'00000000' MOVWF TRISC bcf STATUS,RP0 ; RAM PAGE 0 CLRF PORTB CLRF PORTC CLRF MEMORIA GOTO LOOP END ;---------------------------------------------------------------------------
Questions: