MOVLW 'T' ;CARGO EL CARACTER N
CALL TX_DATO ;ENVIO N
MOVF TEMPERATURA,W ;CARGO W CON LA VARIABLE TEMPERATURA
CALL TX_DATO ;ENVIO LA VARIABLE TEMPERATURA
MOVLW 'T' ;CARGO W CON T
CALL TX_DATO ;ENVIO T, ES DECIR ENTRE T y T VA EL DATO
CALL DEMORA
MOVLW 'N' ;CARGO EL CARACTER N
CALL TX_DATO ;ENVIO N
MOVF NIVEL,W ;CARGO W CON LA VARIABLE NIVEL
CALL TX_DATO ;ENVIO LA VARIABLE NIVEL
MOVLW 'N' ;CARGO W CON N
CALL TX_DATO ;ENVIO N, ES DECIR ENTRE N y N VA EL DATO
LIST P=16F877A
#INCLUDE "P16F877A.INC"
CBLOCK 0X20
PDel0
PDel1
PDel2
_INT_SAVE_W
_INT_SAVE_STATUS
_INT_SAVE_FSR
_INT_SAVE_PCLATH
ENDC
ORG 0
GOTO INICIO
ORG 4
GOTO INTER
;@@@@@@@@@@@@@@@@@ SELECCION DE CANALES ANALOGOS @@@@@@@@@@@@@@@@@@@@@@@
CANAL0 BCF STATUS,RP0
MOVLW B'01000001' ; Fosc/8, CANAL0 ACTIVO, CONVERSION OFF, CONVERSOR ON
MOVWF ADCON0
RETURN ; PARA EMPEZAR CONVERSION SETEAR ADCON0,2 = GO_DONE
CANAL1 BCF STATUS,RP0
MOVLW B'01001001' ;Fosc/8, CANAL1 ACTIVO, CONVERSION OFF, CONVERSOR ON
MOVWF ADCON0
RETURN
CONVERSION BSF ADCON0,GO_DONE
ESPERE CALL DEMORA
BTFSC ADCON0,GO_DONE
GOTO ESPERE
MOVF ADRESH,W
MOVWF PORTB
RETURN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@ RUTINA CONTROL DEL TX @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
TX_DATO BCF PIR1,TXIF ;RESTAURA FLAG DEL TRANSMISOR
MOVWF TXREG ;ALMACENA EL DATO A ENVIAR Y ENVIA
BSF STATUS,RP0 ; BANCO1
TX_DATO_WAIT
BTFSS TXSTA,TRMT ; BYTE TRANSMITIDO?
GOTO TX_DATO_WAIT ;NO
BCF STATUS,RP0 ;SI, BANCO0
RETURN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@ MANEJO DE INTERRUPCION @@@@@@@@@@@@@@@@@@@@@@@@@@
INTER
PUSH MOVWF _INT_SAVE_W ;GUARDAR W
SWAPF STATUS,W ;GUARDAR STATUS
MOVWF _INT_SAVE_STATUS
SWAPF FSR,W ;GUARDAR FSR
MOVWF _INT_SAVE_FSR
SWAPF PCLATH,W ;GUARDAR PCLATH (PAGINA DE PROGRAMA)
MOVWF _INT_SAVE_PCLATH
SWAPF OPTION_REG,W ;GUARDAR OPTION_REG (BANCOS)
MOVWF _INT_SAVE_OPTION_REG
;>>>>>>>AQUI RUTINAS DE INTERRUPCION POR RECEPCION DE LA USART<<<<<<<<<<<<<<<<
POP SWAPF _INT_SAVE_PCLATH,W ;RESTAURAR VALOR DE PCLATH
MOVWF PCLATH
SWAPF _INT_SAVE_FSR,W ;RESTAURAR VALOR DE FSR
MOVWF FSR
SWAPF _INT_SAVE_STATUS,W ;RESTAURAR VALOR DE STATUS
MOVWF STATUS
SWAPF _INT_SAVE_W,W
RETFIE
;@@@@@@@@@@@@@@@@@@@@@@@@@@ FIN DE INTERRUPCION @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
INICIO BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO1
MOVLW 0XFF
MOVWF TRISA ;PORTA COMO ENTRADA
MOVLW B'00000001'
MOVWF ADCON1 ;TODAS ENTRADAS ANALOGAS, +VREF=RA3 -VREF=GND
;8 bits mas significativo=ADRESH
;Los 2 BIT memos significativos se quedan en ADRESL.
CLRF TRISB
CLRF TRISE
BCF STATUS,RP0 ; BANCO0
BSF ADCON0,ADCS0
BCF ADCON0,ADCS1 ;RELOJ PARA EL CONVERSOR AD = Fosc/8
BSF ADCON0,ADON
;@@@@@@@@@@@@@@@ CONFIG USART @@@@@@@@@@@@@@
BSF STATUS,RP0 ;BANCO1
MOVLW B'10111111' ;RC6 SALIDA(TX), RC7 ENTRADA(RX)
MOVWF TRISC
MOVLW B'00100100'
MOVWF TXSTA ;TX en On, modo asíncrono con 8 bits y alta velocidad
MOVLW .25
MOVWF SPBRG ;9600 baudios con Fosc=4MHz
BSF PIE1,RCIE ;Habilita interrupción en la recepción
BCF STATUS,RP0 ; BANCO0
MOVLW B'10010000'
MOVWF RCSTA ;USART en On, recepción contínua
BSF INTCON,PEIE ;Activa interrupción de periféricos
BSF INTCON,GIE ;Activa interrupciones
CLRF RCREG
CLRF PORTB
;@@@@@@@@@@@@@@ FIN CONFIG USART @@@@@@@@@@@@@
;########## PROGRAMA PRINCIPAL ####################
ALT CALL CANAL0
CALL CONVERSION
CALL CANAL1
CALL CONVERSION
GOTO ALT
;########################## RUTINA 1 SEGUNDO ###############################
DEMORA movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
end ;Fin del programa fuente #BYTE ADCON1=0X9F
FOR(;; )
{
ADCON1=0B00001101; //AN0 AN1 VREF+ VREF-
SET_ADC_CHANNEL(0);
DELAY_US(20);
Q=READ_ADC();
ADCON1=0B00000100;//AN0 AN1 VREF+=VCC VREF-=GND
SET_ADC_CHANNEL(1);
DELAY_US(20);
O=READ_ADC();
P=(2.5*Q)/255.0;
R=(5.0*O)/255.0;
PRINTF(LCD_PUTC,"\fADC'S=%u %u",Q,O);
PRINTF(LCD_PUTC,"\nV1=%1.2fV V2=%1.2fV",P,R);
PRINTF("%u\r\n",Q);
Despues de tantos dias, he venido instruyendome en esto del ccs, haciendo programitas, leyendo aqui y alla, al fin y decidido a llevar a cabo este proyeto en lenguaje c. Ahora vengo con nuevas dudas: una de ellas es la siguiente:
1-resulta qu tengo la termocupla conectada al AD594 que lo que hace tratar de linealizar la lectura de temperatura y asi tengo un comportamiento muy similar al del LM35 con sus 10mV/°C entonces he configurado en el pic un voltaje de referencia de 2,5V y conversion 8bits con lo cual tengo una sensibilidad de aproximadamente 10mV, pero eso tan solo para temperatura y para nivel se tiene un transmisor que entrega 1-5V, entonces no se me serviria el voltaje de referencia de 2.5V.
q podria hacer entonces?,,,,me preguntaba si programando en c antes de leer el canal que corrresponde a nivel puedo cambiar el voltaje de referencia al voltaje interno osea 5V
while(true)
{
Lectura();
}
#int_RDA
void RDA_isr(void)
{
dato=0;
if(knhit())
{
dato=getc();
switch(dato)
{
case '1' : SetPointFase = 10;//Asigno el angulo de disparo
break;
case '2' : ...
...
case 'A' : output_high(pin_b1);
break;
...
}
}
}