vaya lio tengo en el soft:
el caso es que ciertas rutinas se que van, pero cuando pongo todo, esto no va...
el codigo esta un poco revuelto, pues ciertas rutinas las baje de la web de todopic(ejemplos) otras las modifique y otras son realizadas por mi, y claro esta con vuestra ayuda....
para que sea más facil te comento el montaje.
4 displays 7 segmento al puerto b del micro.
las lineas de activacion estan desde ra1 a ra4.
en ra0 entrada de adc.
en puerto d el cs del max
conectado el max
lo que pretendo al final del todo es ajustar un nivel con un potenciometro por ra0, leer la temperatura del max en los displays y comparar esa lectura con el valor fijado por el potenciometro para asi dar una alarma....
probe primero el adc, y me llego a funcionar, pues de 0 a 5 voltios leia en los displays el valor de 000 a fff, peroi el display 4 no me funcionaba (problemas en ra4).....
la rutina de leer del max creo que va bien, pues cuando no usso el paso a bcd del dato del max y vuelco en el display, va leyendo datos. Pero sigo teniendo que tener el WDT activafdo porqwue sino, el dato no se mueve (hace una lectura y se para).....
bueno te pego el codigo, que seguro es una bestialidad el ponerlo todo....
list p=16f877 ; list directive to define processor
#include <p16f877.inc> ; processor specific variable definitions
; __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
ERRORLEVEL -302 ;ASEGURARSE DE TRABAJAR EN EL BANCO COREÇRECTO
ERRORLEVEL -305
ERRORLEVEL -173
;***** VARIABLE DEFINITIONS
w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
; MemoriaDeUsuario
dig1 equ 0X20 ;acumulador miles
dig2 equ 0X21 ;acumulador centenas
dig3 equ 0X22 ;acumulador decenas
dig4 equ 0X23 ;acumulador unidades
rota equ 0X24 ;variable para desplazamiento de display
HEXADECIMAL EQU 0X25 ;VARIABLES PARA LA CONVERSION DE
BCD_S EQU 0X26
BCD_H EQU 0X27 ; HEXADECIMAL A 7 SEG
BCD_M EQU 0X28
BCD_L EQU 0X29
DIGITO_H EQU 0X2A
DIGITO_M EQU 0X2B
DIGITO_L EQU 0X2C
Valor EQU 0X2D
ADCLOW EQU 0X2E
ADCHIGH EQU 0X2F
loops3 equ 0x77 ; PARA RETARDO
loops4 equ 0X78 ; PARA RETARDO
VALOR EQU 0X79 ; VARIABLE
loops equ 0x7A ; PARA RETARDO DISPLAY
loops2 equ 0X7B ; PARA RETARDO DISPLAY
DPL_1 EQU 0X7C
DPL_2 EQU 0X7D
DPL_3 EQU 0X7E
DPL_4 EQU 0X7F
VALOR2 EQU 0X30
MAXHIGH EQU 0X31
MAXLOW EQU 0X32
;**********************************************************************
ORG 0x000 ; processor reset vector
clrf PCLATH ; ensure page bits are cleared
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
; movwf w_temp ; save off current W register contents
; movf STATUS,w ; move status register into W register
; movwf status_temp ; save off contents of STATUS register
GOTO 0X000
; isr code can go here or be located as a call subroutine elsewhere
; movf status_temp,w ; retrieve copy of STATUS register
; movwf STATUS ; restore pre-isr STATUS register contents
; swapf w_temp,f
; swapf w_temp,w ; restore pre-isr W register contents
; retfie ; return from interrupt
;PROGRAMA PRINCIPAL
main ; remaining code goes here
CALL CONF_PORTA
CALL CONF_PORTB
CALL CONF_PORTC
CALL CONF_PORTE
CALL CONF_SPI
; CALL CONFIGURAR
INIC
BCF STATUS, RP0 ;BANO 0
BCF STATUS, RP1
CALL LEE_SPI
; CALL CONVERTIR
; CALL RETARDO
; MOVFW ADCLOW
CALL DATA_MAX
movlw B'00000010'
MOVWF PORTA
MOVFW MAXLOW
MOVWF PORTB
; MOVWF HEXADECIMAL
; CALL TEST
GOTO INIC
;**************************************************************************************
;* *
;* *
;* RUTINAS *
;* *
;* *
;**************************************************************************************
CONF_PORTA ;CONFIGURA PORT A COMO AN[TER1 TER2] [ VREF- VREF+] DIG[FUNCION] AN[DERR]
BSF STATUS, RP0 ;BANO 1
BCF STATUS, RP1
MOVLW B'10001110' ;PATILLAS DIGITALES de la ra7 a la ra1 y an0 es analogica
MOVWF ADCON1
MOVLW B'00000000' ;dirreccion datos, 0-salida 1-entrada
MOVWF TRISA
BCF STATUS,RP0 ;BANCO 0
CLRF PORTA ;BORRA PUERTO
RETURN
CONF_PORTB ;CONFIGURA EL PORT B COMO SALIDA
BCF STATUS,RP1 ;BANCO 1
BSF STATUS,RP0
MOVLW B'00000000' ;SALIDAS
MOVWF TRISB
BCF STATUS,RP0 ;BANCO 0
CLRF PORTB
RETURN
CONF_PORTC ;CONFIGURA EL PORT C
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW b'10010101'
MOVWF TRISC
BCF STATUS,RP0
CLRF PORTC
RETURN
CONF_PORTE ;CONFIGURA EL PORT B COMO SALIDA
BCF STATUS,RP1 ;BANCO 1
BSF STATUS,RP0
MOVLW B'00000000' ;SALIDAS
MOVWF TRISE
BCF STATUS,RP0 ;BANCO 0
MOVLW B'00000111'
MOVWF PORTE
RETURN
CONF_SPI
BCF STATUS,RP1 ;BANCO 1
BSF STATUS,RP0
MOVLW B'10100100' ;REGISTRO
MOVWF SSPSTAT
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
MOVLW B'00110010' ;SSPCON1
MOVWF SSPCON
BCF STATUS,RP1 ;BANCO 1
BSF STATUS,RP0
MOVLW B'00000000' ;SSPCON2
MOVWF SSPCON2
RETURN
CONFIGURAR
bcf STATUS, RP0 ; Go to BANK0
bcf STATUS, RP1
movlw B'11000001' ; Fosc/8, A/D enabled
movwf ADCON0 ; Fosc/8 [7-6], A/D ch0 [5-3], A/D on [0]
bsf STATUS,RP0 ; Go to BANK1
movlw B'00001111' ;TMR0 prescaler, 1:256
movwf OPTION_REG
movlw B'10001110' ; Left justify, 1 analog channel
movwf ADCON1 ; VDD and VSS references (5v,0v)
bcf STATUS, RP0 ; Go to BANK0
RETURN
LEE_SPI
CALL RETARDO_MAX
bcf STATUS, RP0 ; Go to BANK0
bcf STATUS, RP1
MOVLW B'00000110' ;ACTIVAMOS CS DEL MAX
MOVWF PORTE
MOVLW B'00001111' ;BYTE BASURA
MOVWF SSPBUF
NOP
NOP
bSf STATUS, RP0 ; Go to BANK1
bcf STATUS, RP1
ESP1 BTFSS SSPSTAT,BF
GOTO ESP1
bcf STATUS, RP0 ; Go to BANK0
bcf STATUS, RP1
MOVFW SSPBUF
MOVWF MAXHIGH ;ESCRIBE EN MAXHIG LOS PRIMEROS 8 BITS
NOP
MOVLW B'00001111' ;BYTE BASURA
MOVWF SSPBUF
NOP
NOP
bSf STATUS, RP0 ; Go to BANK1
bcf STATUS, RP1
ESP2 BTFSS SSPSTAT,BF
GOTO ESP2
bcf STATUS, RP0 ; Go to BANK0
bcf STATUS, RP1
MOVFW SSPBUF
MOVWF MAXLOW ;ESCRIBE EN MAXlow LOS SEGUNDOS 8 BITS
NOP
bcf STATUS, RP0 ; Go to BANK0
bcf STATUS, RP1
MOVLW B'00000111' ;DESACTIVAMOS CS DEL MAX
MOVWF PORTE
RETURN
;
CONVERTIR
Main
btfss INTCON, T0IF ; Wait for Timer0 to timeout
goto Main ; <bit 2> espera interrupcion
bcf INTCON,T0IF ; pone en cero el bit2 de interrupcion
; <1> timer interrumpido
; <0> timer no interrumpido
bsf ADCON0,GO ; Start A/D conversion
; Pone el bit Go en <1>
Wait
btfss PIR1,ADIF ; Wait for conversion to complete
goto Wait ; Bandera <ADIF> -->
; <0> no conversion aun
; <1> conversion ok
; banksel ADRESH ; ADC-LSB en W, aqui hago lo que quiero
bSf STATUS, RP0 ; Go to BANK1
bcf STATUS, RP1
movf ADRESL,w ; ADC-MSB en W, aqui ha go lo que quiero
BCF STATUS,RP0
; MOVF ADRESH,W
; MOVWF ADCHIGH
movwf HEXADECIMAL ;LEDs
RETURN
RETARDO_MAX ;subrutina de retardo GENERAL
movwf loops3 ;la variable de trabajo contiene la cant.
top4 movlw D'400' ;de ms a demorar
movwf loops4
top3 nop
nop
nop
nop
nop
nop
decfsz loops4 ;controla si termina 1mS
goto top3
decfsz loops3 ;controla si termina el retardo completo
goto top4
RETURN
ERROR1
MOVLW H'0C'
CALL TABLA
MOVWF DPL_1
MOVWF DPL_2
MOVWF DPL_3
MOVWF DPL_4
CALL PRESENT_DPL
GOTO INIC
DATA_MAX
; BTFSC MAXLOW,1 ;SI BIT 1=0 SALTA (CERO ES ID ES OK)
; GOTO ERROR1 ;DISPOSITIVO MAX MAL
; BTFSC MAXLOW,2 ;SI BIT 2 =0 SALTA (0 ES CORRECTO)
; GOTO ERROR1 ;TERMOPAR MAL O SUELTO
BCF STATUS,C ;BORRA EL CARRY Y ROTAMOS TRES VECES
RRF MAXLOW,1
BCF STATUS,C
RRF MAXLOW,1
BCF STATUS,C
RRF MAXLOW,1 ;EN MAX LOW NOS QUEDA SOLO EL DATO
RETURN
DATA_MAX2
BTFSC MAXHIGH,0 ;COMPROBABOS BIT 0 DE HIGH PARA PASARLO AL D5 DEL LOW
GOTO ES11
BCF MAXLOW,5 ;=0 ENTOCES BIT 5 DEL LOW A 0
CERO1 BSF MAXHIGH,0 ;PONEMOS EL BIT A CERO
GOTO BIT2
ES11 BSF MAXLOW,5 ;=1 ENTOCES BIT 5 DEL LOW A 1
GOTO CERO1
BIT2 BTFSC MAXHIGH,1
GOTO ES12
BCF MAXLOW,6
CERO2 BSF MAXHIGH,1
GOTO BIT3
ES12 BSF MAXLOW,6
GOTO CERO2
BIT3 BTFSC MAXHIGH,2
GOTO ES13
BCF MAXLOW,7
CERO3 BSF MAXHIGH,2
GOTO BITFUERA
ES13 BSF MAXLOW,7
GOTO CERO3
BITFUERA
BCF STATUS,C ;ROTAMOS EN HIGH PARA COLOCAR
BCF MAXHIGH,7 ;NOS ASEGURAMOS QUE EL BIT15 SEA CERO
RRF MAXHIGH,1
RRF MAXHIGH,1
RRF MAXHIGH,1 ;ROTAMOS TRES VECES Y TENEMOS COLOCADO
RETURN
RETARDO_DPL ;subrutina de retardo PARA DISPLAY
movwf loops ;la variable de trabajo contiene la cant.
top2 movlw D'10' ;de ms a demorar
movwf loops2
top nop
nop
nop
nop
nop
nop
decfsz loops2 ;controla si termina 1mS
goto top
decfsz loops ;controla si termina el retardo completo
goto top2
RETURN
PRESENT_DPL
MOVF DPL_1,0 ;CARGA DATO DISPLAY 1
MOVWF PORTB ;LO PONE EN PORT B
MOVLW B'00000010' ;LO PRESENTA EN DPL_1
MOVWF PORTA
CALL RETARDO_DPL
MOVF DPL_2,0 ;CARGA DATO DISPLAY 2
MOVWF PORTB ;LO PONE EN PORT B
MOVLW B'00000100' ;LO PRESENTA EN DPL_2
MOVWF PORTA
CALL RETARDO_DPL
MOVF DPL_3,0 ;CARGA DATO DISPLAY 3
MOVWF PORTB ;LO PONE EN PORT B
MOVLW B'00001000' ;LO PRESENTA EN DPL_3
MOVWF PORTA
CALL RETARDO_DPL
MOVF DPL_4,0 ;CARGA DATO DISPLAY 4
MOVWF PORTB ;LO PONE EN PORT B
MOVLW B'00010000' ;LO PRESENTA EN DPL_4
MOVWF PORTA
CALL RETARDO_DPL
RETURN
TEST
; MOVLW B'00011111'
; MOVWF HEXADECIMAL
CALL Hex_Bcd
MOVFW BCD_L
CALL TABLA
MOVWF DPL_1
MOVFW BCD_M
CALL TABLA
MOVWF DPL_2
MOVFW BCD_H
CALL TABLA
MOVWF DPL_3
MOVLW BCD_S
CALL TABLA
MOVWF DPL_4
CALL PRESENT_DPL
RETURN
TABLA ;genera los numeros sobre el display
addwf 0X002 ;agrega al cont. programa el valor de work
retlw b'00111111' ;genera el 0
retlw b'00000110' ;genera el 1
retlw b'01011011' ;genera el 2
retlw b'01001111' ;genera el 3
retlw b'01100110' ;genera el 4
retlw b'01101101' ;genera el 5
retlw b'01111101' ;genera el 6
retlw b'00000111' ;genera el 7
retlw b'01111111' ;genera el 8
retlw b'01100111' ;genera el 9
retlw b'01111011' ;genera el A
retlw b'01111100' ;genera el B
retlw b'00111001' ;genera el C
retlw b'01011110' ;genera el D
retlw b'01111001' ;genera el E
retlw b'01110001' ;genera el F
RETURN
;RUTINA PARA PASAR DE HEX A BCD Y DESPUES A 7 SEG
; LA VARIABLE A INTRODUCIR EL " HEXADECIMAL"
Hex_Bcd
;
clrf BCD_S
clrf BCD_H ;Para BCD D'0'
clrf BCD_M ;Para BCD D'0'
clrf BCD_L ;Para BCD D'0'
;
;Millar
; movlw D'1000' ;D'1000' --> W
; subwf HEXADECIMAL,W ;HEXADECIMAL - D'100' --> W
; skpc ;? HEXADECIMAL es menor que D'100' ?
; goto Centenas ;Si
; movwf HEXADECIMAL ;Salva el resto
; incf BCD_S,F ;Incrementa el contador de millar BCD
; goto Millar ;Vuelve por otros D'1000'
;
Centenas
;
movlw D'100' ;D'100' --> W
subwf HEXADECIMAL,W ;HEXADECIMAL - D'100' --> W
skpc ;? HEXADECIMAL es menor que D'100' ?
goto Decenas ;Si
movwf HEXADECIMAL ;Salva el resto
incf BCD_H,F ;Incrementa el contador de centenas BCD
goto Centenas ;Vuelve por otros D'100'
;
Decenas
;
movlw D'10' ;D'10' --> W
subwf HEXADECIMAL,W ;HEXADECIMAL - D'10' --> W
skpc ;? HEXADECIMAL es menor que D'10' ?
goto Unidades ;Si
movwf HEXADECIMAL ;Salva el resto
incf BCD_M,F ;Incrementa el contador de decenas BCD
goto Decenas ;Vuelve por otros D'10'
;
Unidades
;
movf HEXADECIMAL,W ;El resto pertenece
movwf BCD_L ;a las unidades BCD
clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL
return ;Retorna
;*************
;
; entrada : W Valor bcd a convertir (H'00' a H'09').
; salida : W Valor 7 segmentos
;
;La codificacion de los siete segmentos es la siguiente.
;
; PABCDEFG
;B'xxxxxxxx'
;
; A
; ----
; F | | B
; | G |
; ----
; E | | C
; | |
; ---- o P "punto decimal"
; D
Bcd_7Seg
andlw H'0F'
addwf PCL,F
; PGFEDCBA
retlw b'00111111' ;genera el 0
retlw b'00000110' ;genera el 1
retlw b'01011011' ;genera el 2
retlw b'01001111' ;genera el 3
retlw b'01100110' ;genera el 4
retlw b'01101101' ;genera el 5
retlw b'01111101' ;genera el 6
retlw b'00000111' ;genera el 7
retlw b'01111111' ;genera el 8
retlw b'01100111' ;genera el 9
;
;Los siguientes debuelven E de "error", esto es por si se pasa
;un valor a la tabla desde H'0A' hasta H'0F'.
;
retlw b'01111011' ;genera el A
retlw b'01111100' ;genera el B
retlw b'00111001' ;genera el C
retlw b'01011110' ;genera el D
retlw b'01111001' ;genera el E
retlw b'01110001' ;genera el F
;*************
;Presenta el digito en su respectivo display de 7 segmentos
;
Display
;
; No codifiqué esta rutina ya que depende del pic usado y
; la asignación de sus puertos
;
; movf DIGITO_H,W
; movf DIGITO_M,W
; movf DIGITO_L,W
; return
END ;FIN DE PROGRAMA