Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

PIC16f877 ADC conversion clock period

Status
Not open for further replies.

inxanu

New Member
Good afternoon again,

When try to simulate with Proteus at 4MHz with the pic16F877, i get the following error:
[PIC16 ADC] PC=0x000E. ADC conversion clock period [5e-07] is possibly invalid for device clock frecuency


But if i change value for clock at proteus to 1MHz, the error dissapear, I think it should works at 4MHz also.


Code:



Capdat
banksel ADCON0
movlw b'01000001' ; fosc 8, RA0 analogico
movwf ADCON0

; Incializacion convertidor AD. Justificado a la izquierda, todos los PORTA como entrada analogica

banksel ADCON1
movlw b'00001110' ;Justificado a la izquierda, canal 0, modulo habilitado
movwf ADCON1
call Demora_20us ; Esperamos el tiempo de adquisicion necesario
; Comenzamos la conversion AD

banksel ADCON0
bsf ADCON0,2

; Esperamos que acabe la conversion

espera
btfsc ADCON0,2
goto espera

; Guardamos el valor despues de la conversion en la variable ls_adc.

banksel ADRESH
movf ADRESH,0 ; Despues de finalizar la conversion AD el valor en ADRESH se guarda en el Reg W
; y el valor en ADRESL se omite, esa precision no es necesaria.
banksel ls_adc
movwf ls_adc ; valor en W Reg. se escribe en la variable ls_adc
RETURN

Demora_20us
movlw 0x05
movwf Contador ; iniciamos contador
Repeticion
decfsz Contador,1 ; Decrementa Contador en 1
goto Repeticion ; Si no es cero repetimos el ciclo
RETURN


Can anybody help me?

Thank you.
 
Yes, OSC/8 should work to 5mhz. Are you getting an error or a warning?
 
Will it work if you change ADCON0 to fosc/16?
 
Wow, good catch, Ian! It certainly is missing a settling delay.
 
This is a big part of the code that i'm trying to simulate:

Code:
	PROCESSOR 16F877	; define tipo de procesador
	__CONFIG	0x3731	; 4Mhz frecuencia de reloj, standard fuse 
	#include <p16F877.inc>	; Etiquetas de registro estandard

; Registra etiquetas EQU

STATUS	EQU	0x03
PORTA	EQU	0x05	; Registro de datos del puerto A
PORTB	EQU	0x06	; Registro de datos del puerto B
PORTC	EQU	0x07	; Registro de datos del puerto C
PORTD	EQU	0x08	; Registro de datos del puerto D
TRISA	EQU	0x85	; Direccion del registro puerto A
TRISB	EQU	0x86	; Direccion del registro puerto B
TRISC	EQU	0x87	; Direccion del registro puerto C
TRISD	EQU	0x88	; Direccion del registro puerto D
ADCON0	EQU	0x1F
ADCON1	EQU 0x9F	;
ADRESH	EQU	0x1E

TMR0	EQU	0x01	; Registro de tiempo hardware
INTCON	EQU	0x0B	; Registro de control de interrupcion
OPTREG	EQU	0x81	; Registro de opciones

st_pers	EQU	0x20	; Var para control del estado de la persiana
st_LigH	EQU	0x21	; Var para control del estado de la luz
comp1	EQU	0x22	; Var resultado comparador 1 
comp2	EQU	0x23	; Var resultado comparador 2
Lampara	EQU	0x24	; Luminosidad de la lampara 0=baja..127=maxima
result	EQU	0x25	; Var para almacenar resultado comparacion.
estado	EQU	0x26	; Var para estados d las var XXXX X pers sint sext
count1	EQU	0x27	; Var para el contador de delay
count2	EQU	0x28	; Var para el contador de delay
W_Temp	EQU	0x29	; Guardamos registro W durante interrupcion
St_Temp	EQU	0x30	; Guardamos registro STATUS durante interrupcion
ls_adc	EQU	0x31	; Guardamos el valor despues de la conversion AD
DEMORA	EQU	0x32	; Valor de demora para enceder el TRIAC
PDel0	EQU	0x33	; Variable para el calculo de 5segundos de retardo
PDel1	EQU	0x34	; Variable para el calculo de 5segundos de retardo	
PDel2	EQU	0x35	; Variable para el calculo de 5segundos de retardo
Contador EQU 0x36	; Variable para el retardo de 20us
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	ORG 	000		; Comienzo de la memoria del programa
	NOP				; Para el modo ICD
	GOTO 	init	; Salta al programa principal



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Inicializacion del puertos ..................................................

init
	BCF	STATUS,7	; Configuro el bit FSR a 0 xa trabajar bank0/1
	BCF	STATUS,5	; Seleccion el bank0 de memoria	RP0
	BCF	STATUS,6	; poniendo 00 en RP0:RP1
	BCF	estado,2	; Inicia el estado de la persiana a cerrado
	BCF	estado,3	; Ha contado los 5 segundos de accion de persiana?
	CLRF	PORTA		; Limpia los puertos del A al D
	CLRF	PORTB
	CLRF	PORTC
	CLRF	PORTD
	BSF	STATUS,5	; Selecciono el bank 1 poniendo 01 RP0:RP1
	MOVLW	0X80		; 
	MOVWF	ADCON1		; Todos los pines del puerto A son analogicos
	MOVLW	0XCF		;
	MOVWF	TRISA		; Todos los pines del puerto A son entradas

	NOP			; BANKSEL no puede ser etiquetada
	BANKSEL	TRISB		; Selecciona el bank1
	MOVLW	b'11111101'	; Configura el RB1 como salida(b'11111101') 253
	MOVWF	TRISB		; Carga el codigo DDR en F86

	NOP			; BANKSEL no puede ser etiquetada
	BANKSEL	TRISC		; Selecciona el bank1
	MOVLW	b'01111111'	; Configura RC6 y RC7 como salida(b'01111111') 127
	MOVWF	TRISC		; Carga el codigo DDR en F87

	NOP			; BANKSEL no puede ser etiquetada
	BANKSEL	TRISD		; Selecciona el bank1
	MOVLW	b'11111100'	; Configura RD1 a RD4 como salida(b'11111100') 252
	MOVWF	TRISD		; Carga el codigo DDR en F88

 	MOVLW B'11000111'	;EL PRESCALER ES ASIGNADO AL TMR0 
	MOVWF OPTION_REG
	MOVLW B'10010000'	;INTERRUPCION POR PIN RB0
	MOVWF INTCON


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



INT 
	BTFSS INTCON,INTF
	GOTO BACK
	MOVF DEMORA,W		; Valor de demora para el TRIAC
	MOVWF TMR0
	CLRF PORTA
WAIT
	BTFSS INTCON,T0IF
	GOTO WAIT        ; ESPERO EL DESBORDE DE TMR0 ENCUESTANDO LA BANDERA DE TMR0
	BCF INTCON,T0IF  ; LIMPIO LA BANDERA
	MOVLW B'00000010'; DISPARO LOS TRIACS
	MOVWF PORTB
	BSF 3,5
	BTFSS OPTION_REG,INTEDG
	GOTO SETTING
	BCF OPTION_REG,INTEDG
	BCF 3,5
	GOTO BACK
SETTING
	BSF OPTION_REG,INTEDG
	BCF 3,5
BACK
	BCF INTCON,INTF
	RETFIE


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Programa principal
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



Ppal
	CALL	Capdat	; Llamamos la subrutina de captura de datos
	CALL	nivluz1	; Llamamos la subrutina de tratamiento de datos para dimmer
	CALL	persia	; Ejecutamos la subrutina de actuacion de las persianas
	GOTO	Ppal

;Subrutina de captura de datos.................................................



; Adquisicion datos de la LDR para intensidad interior habitacion
; Inicializacion de la conversion AD. Reloj de conversion 4MHz/32,AN4 canal seleccionado como 
; AN0,AD conversion OFF,AD modulo de conversion encendido

Capdat	
		banksel ADCON0        
		movlw b'01000001'    ; fosc 8, RA0 analogico
		movwf ADCON0    

; Incializacion convertidor AD. Justificado a la izquierda, todos los PORTA como entrada analogica

 	banksel ADCON1
 	movlw b'00001110'	;Justificado a la izquierda, canal 0, modulo habilitado
 	movwf ADCON1
	call Demora_20us	; Esperamos el tiempo de adquisicion necesario
; Comenzamos la conversion AD

 	banksel ADCON0
 	bsf ADCON0,2

; Esperamos que acabe la conversion

espera
	btfsc ADCON0,2    
	goto espera

; Guardamos el valor despues de la conversion en la variable ls_adc.

	banksel ADRESH
	movf ADRESH,0       ; Despues de finalizar la conversion AD el valor en ADRESH se guarda en el Reg W 
						; y el valor en ADRESL se omite, esa precision no es necesaria.
	banksel ls_adc
	movwf ls_adc        ; valor en W Reg. se escribe en la variable ls_adc
	RETURN

Demora_20us
	movlw 0x05
	movwf Contador		; iniciamos contador
Repeticion
	decfsz Contador,1	; Decrementa Contador en 1
	goto Repeticion		; Si no es cero repetimos el ciclo
	RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Tratamiento de los datos, comparativa de niveles de luz.......................
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

nivluz1
	MOVLW 	b'11100101'	; cargo valor a comparar nivel con 4,5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem10ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz2		; en caso de que sea menor comprobamos siguiente intervalo
dem10ms
	MOVLW	b'11011001'	; cargamos 217 en DEMORA que corresponde con 10ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz2
	MOVLW 	b'11001100'	; cargo valor a comparar nivel con 4V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem9ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz3		; en caso de que sea menor comprobamos siguiente intervalo
dem9ms
	MOVLW	b'11000011'	; cargamos 195 en DEMORA que corresponde con 9ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz3
	MOVLW 	b'10110010'	; cargo valor a comparar nivel con 3.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem8ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz4		; en caso de que sea menor comprobamos siguiente intervalo
dem8ms
	MOVLW	b'10101101'	; cargamos 173 en DEMORA que corresponde con 8ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz4
	MOVLW 	b'10011001'	; cargo valor a comparar nivel con 3V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem7ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz5		; en caso de que sea menor comprobamos siguiente intervalo
dem7ms
	MOVLW	b'10010111'	; cargamos 151 en DEMORA que corresponde con 7ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz5
	MOVLW 	b'01111111'	; cargo valor a comparar nivel con 2.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem6ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz6		; en caso de que sea menor comprobamos siguiente intervalo
dem6ms
	MOVLW	b'10000010'	; cargamos 130 en DEMORA que corresponde con 6ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz6
	MOVLW 	b'01100110'	; cargo valor a comparar nivel con 2V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem5ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz7		; en caso de que sea menor comprobamos siguiente intervalo
dem5ms
	MOVLW	b'01101100'	; cargamos 108 en DEMORA que corresponde con 5ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz7
	MOVLW 	b'01001100'	; cargo valor a comparar nivel con 1.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem4ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz8		; en caso de que sea menor comprobamos siguiente intervalo
dem4ms
	MOVLW	b'01010110'	; cargamos 86 en DEMORA que corresponde con 4ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz8
	MOVLW 	b'00110011'	; cargo valor a comparar nivel con 1V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem3ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz9		; en caso de que sea menor comprobamos siguiente intervalo
dem3ms
	MOVLW	b'01000001'	; cargamos 65 en DEMORA que corresponde con 3ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz9
	MOVLW 	b'00011001'	; cargo valor a comparar nivel con 0.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem2ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	no_dem		; en caso de que sea menor no aplicamos ninguna demora
dem2ms
	MOVLW	b'00101011'	; cargamos 65 en DEMORA que corresponde con 2ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

no_dem
	MOVLW	b'00000000'	;no aplicamos ninguna demora, al estar en completa oscuridad
	MOVWF	DEMORA
	RETURN
 
Last edited:
CALL persia ; Ejecutamos la subrutina de actuacion de las persianas

Where is this subroutine?

Your init routine just runs into the ISR (bad idea) you should jump over it "goto Ppal"

You haven't a Interrupt vector call you need "ORG 4" & "GOTO INT"

Lastly your Timer0 int isn't set up. So the tmr0 int will never work.

As this is in spanish I'm kinda flumed on how to proceed

Semi working code:

Code:
	PROCESSOR 16F877	; define tipo de procesador
	__CONFIG	0x3731	; 4Mhz frecuencia de reloj, standard fuse 
	#include <p16F877.inc>	; Etiquetas de registro estandard
 
; Registra etiquetas EQU
 
STATUS	EQU	0x03
PORTA	EQU	0x05	; Registro de datos del puerto A
PORTB	EQU	0x06	; Registro de datos del puerto B
PORTC	EQU	0x07	; Registro de datos del puerto C
PORTD	EQU	0x08	; Registro de datos del puerto D
TRISA	EQU	0x85	; Direccion del registro puerto A
TRISB	EQU	0x86	; Direccion del registro puerto B
TRISC	EQU	0x87	; Direccion del registro puerto C
TRISD	EQU	0x88	; Direccion del registro puerto D
ADCON0	EQU	0x1F
ADCON1	EQU 0x9F	;
ADRESH	EQU	0x1E
 
TMR0	EQU	0x01	; Registro de tiempo hardware
INTCON	EQU	0x0B	; Registro de control de interrupcion
OPTREG	EQU	0x81	; Registro de opciones
 
st_pers	EQU	0x20	; Var para control del estado de la persiana
st_LigH	EQU	0x21	; Var para control del estado de la luz
comp1	EQU	0x22	; Var resultado comparador 1 
comp2	EQU	0x23	; Var resultado comparador 2
Lampara	EQU	0x24	; Luminosidad de la lampara 0=baja..127=maxima
result	EQU	0x25	; Var para almacenar resultado comparacion.
estado	EQU	0x26	; Var para estados d las var XXXX X pers sint sext
count1	EQU	0x27	; Var para el contador de delay
count2	EQU	0x28	; Var para el contador de delay
W_Temp	EQU	0x29	; Guardamos registro W durante interrupcion
St_Temp	EQU	0x30	; Guardamos registro STATUS durante interrupcion
ls_adc	EQU	0x31	; Guardamos el valor despues de la conversion AD
DEMORA	EQU	0x32	; Valor de demora para enceder el TRIAC
PDel0	EQU	0x33	; Variable para el calculo de 5segundos de retardo
PDel1	EQU	0x34	; Variable para el calculo de 5segundos de retardo	
PDel2	EQU	0x35	; Variable para el calculo de 5segundos de retardo
Contador EQU 0x36	; Variable para el retardo de 20us
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
	ORG 	000		; Comienzo de la memoria del programa
	NOP				; Para el modo ICD
	GOTO 	init	; Salta al programa principal
 	ORG	04
	GOTO	INT
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
; Inicializacion del puertos ..................................................
 
init
	BCF	STATUS,7	; Configuro el bit FSR a 0 xa trabajar bank0/1
	BCF	STATUS,5	; Seleccion el bank0 de memoria	RP0
	BCF	STATUS,6	; poniendo 00 en RP0:RP1
	BCF	estado,2	; Inicia el estado de la persiana a cerrado
	BCF	estado,3	; Ha contado los 5 segundos de accion de persiana?
	CLRF	PORTA		; Limpia los puertos del A al D
	CLRF	PORTB
	CLRF	PORTC
	CLRF	PORTD
	BSF	STATUS,5	; Selecciono el bank 1 poniendo 01 RP0:RP1
	MOVLW	0X80		; 
	MOVWF	ADCON1		; Todos los pines del puerto A son analogicos
	MOVLW	0XCF		;
	MOVWF	TRISA		; Todos los pines del puerto A son entradas
 
	NOP			; BANKSEL no puede ser etiquetada
	BANKSEL	TRISB		; Selecciona el bank1
	MOVLW	b'11111101'	; Configura el RB1 como salida(b'11111101') 253
	MOVWF	TRISB		; Carga el codigo DDR en F86
 
	NOP			; BANKSEL no puede ser etiquetada
	BANKSEL	TRISC		; Selecciona el bank1
	MOVLW	b'01111111'	; Configura RC6 y RC7 como salida(b'01111111') 127
	MOVWF	TRISC		; Carga el codigo DDR en F87
 
	NOP			; BANKSEL no puede ser etiquetada
	BANKSEL	TRISD		; Selecciona el bank1
	MOVLW	b'11111100'	; Configura RD1 a RD4 como salida(b'11111100') 252
	MOVWF	TRISD		; Carga el codigo DDR en F88
 
 	MOVLW B'11000111'	;EL PRESCALER ES ASIGNADO AL TMR0 
	MOVWF OPTION_REG
	MOVLW B'10010000'	;INTERRUPCION POR PIN RB0
	MOVWF INTCON
 	GOTO	Ppal
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
 
INT 
	BTFSS INTCON,INTF
	GOTO BACK
	MOVF DEMORA,W		; Valor de demora para el TRIAC
	MOVWF TMR0
	CLRF PORTA
WAIT
	BTFSS INTCON,T0IF
	GOTO WAIT        ; ESPERO EL DESBORDE DE TMR0 ENCUESTANDO LA BANDERA DE TMR0
	BCF INTCON,T0IF  ; LIMPIO LA BANDERA
	MOVLW B'00000010'; DISPARO LOS TRIACS
	MOVWF PORTB
	BSF 3,5
	BTFSS OPTION_REG,INTEDG
	GOTO SETTING
	BCF OPTION_REG,INTEDG
	BCF 3,5
	GOTO BACK
SETTING
	BSF OPTION_REG,INTEDG
	BCF 3,5
BACK
	BCF INTCON,INTF
	RETFIE
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Programa principal
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
 
Ppal
	CALL	Capdat	; Llamamos la subrutina de captura de datos
	CALL	nivluz1	; Llamamos la subrutina de tratamiento de datos para dimmer
	;CALL	persia	; Ejecutamos la subrutina de actuacion de las persianas
	GOTO	Ppal
 
;Subrutina de captura de datos.................................................
 
 
 
; Adquisicion datos de la LDR para intensidad interior habitacion
; Inicializacion de la conversion AD. Reloj de conversion 4MHz/32,AN4 canal seleccionado como 
; AN0,AD conversion OFF,AD modulo de conversion encendido
 
Capdat	
		banksel ADCON0        
		movlw b'01000001'    ; fosc 8, RA0 analogico
		movwf ADCON0    
 
; Incializacion convertidor AD. Justificado a la izquierda, todos los PORTA como entrada analogica
 
 	banksel ADCON1
 	movlw b'00001110'	;Justificado a la izquierda, canal 0, modulo habilitado
 	movwf ADCON1
	call Demora_20us	; Esperamos el tiempo de adquisicion necesario
; Comenzamos la conversion AD
 
 	banksel ADCON0
 	bsf ADCON0,2
 
; Esperamos que acabe la conversion
 
espera
	btfsc ADCON0,2    
	goto espera
 
; Guardamos el valor despues de la conversion en la variable ls_adc.
 
	banksel ADRESH
	movf ADRESH,0       ; Despues de finalizar la conversion AD el valor en ADRESH se guarda en el Reg W 
						; y el valor en ADRESL se omite, esa precision no es necesaria.
	banksel ls_adc
	movwf ls_adc        ; valor en W Reg. se escribe en la variable ls_adc
	RETURN
 
Demora_20us
	movlw 0x05
	movwf Contador		; iniciamos contador
Repeticion
	decfsz Contador,1	; Decrementa Contador en 1
	goto Repeticion		; Si no es cero repetimos el ciclo
	RETURN
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Tratamiento de los datos, comparativa de niveles de luz.......................
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
nivluz1
	MOVLW 	b'11100101'	; cargo valor a comparar nivel con 4,5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem10ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz2		; en caso de que sea menor comprobamos siguiente intervalo
dem10ms
	MOVLW	b'11011001'	; cargamos 217 en DEMORA que corresponde con 10ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN
 
nivluz2
	MOVLW 	b'11001100'	; cargo valor a comparar nivel con 4V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem9ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz3		; en caso de que sea menor comprobamos siguiente intervalo
dem9ms
	MOVLW	b'11000011'	; cargamos 195 en DEMORA que corresponde con 9ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN
 
nivluz3
	MOVLW 	b'10110010'	; cargo valor a comparar nivel con 3.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem8ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz4		; en caso de que sea menor comprobamos siguiente intervalo
dem8ms
	MOVLW	b'10101101'	; cargamos 173 en DEMORA que corresponde con 8ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN
 
nivluz4
	MOVLW 	b'10011001'	; cargo valor a comparar nivel con 3V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem7ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz5		; en caso de que sea menor comprobamos siguiente intervalo
dem7ms
	MOVLW	b'10010111'	; cargamos 151 en DEMORA que corresponde con 7ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN
 
nivluz5
	MOVLW 	b'01111111'	; cargo valor a comparar nivel con 2.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem6ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz6		; en caso de que sea menor comprobamos siguiente intervalo
dem6ms
	MOVLW	b'10000010'	; cargamos 130 en DEMORA que corresponde con 6ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN
 
nivluz6
	MOVLW 	b'01100110'	; cargo valor a comparar nivel con 2V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem5ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz7		; en caso de que sea menor comprobamos siguiente intervalo
dem5ms
	MOVLW	b'01101100'	; cargamos 108 en DEMORA que corresponde con 5ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN
 
nivluz7
	MOVLW 	b'01001100'	; cargo valor a comparar nivel con 1.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem4ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz8		; en caso de que sea menor comprobamos siguiente intervalo
dem4ms
	MOVLW	b'01010110'	; cargamos 86 en DEMORA que corresponde con 4ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN
 
nivluz8
	MOVLW 	b'00110011'	; cargo valor a comparar nivel con 1V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem3ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz9		; en caso de que sea menor comprobamos siguiente intervalo
dem3ms
	MOVLW	b'01000001'	; cargamos 65 en DEMORA que corresponde con 3ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN
 
nivluz9
	MOVLW 	b'00011001'	; cargo valor a comparar nivel con 0.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem2ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	no_dem		; en caso de que sea menor no aplicamos ninguna demora
dem2ms
	MOVLW	b'00101011'	; cargamos 65 en DEMORA que corresponde con 2ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN
 
no_dem
	MOVLW	b'00000000'	;no aplicamos ninguna demora, al estar en completa oscuridad
	MOVWF	DEMORA
	RETURN

	end
 
Last edited:
Thank you for all your comments, I've translated all the line that can explain you how it works, do you want the schematic?


Code:
	PROCESSOR 16F877	; define tipo de procesador
	__CONFIG	0x3731	; 4Mhz frecuencia de reloj, standard fuse 
	#include <p16F877.inc>	; Etiquetas de registro estandard

; Registra etiquetas EQU

STATUS	EQU	0x03
PORTA	EQU	0x05	; Registro de datos del puerto A
PORTB	EQU	0x06	; Registro de datos del puerto B
PORTC	EQU	0x07	; Registro de datos del puerto C
PORTD	EQU	0x08	; Registro de datos del puerto D
TRISA	EQU	0x85	; Direccion del registro puerto A
TRISB	EQU	0x86	; Direccion del registro puerto B
TRISC	EQU	0x87	; Direccion del registro puerto C
TRISD	EQU	0x88	; Direccion del registro puerto D
ADCON0	EQU	0x1F
ADCON1	EQU 0x9F	;
ADRESH	EQU	0x1E

TMR0	EQU	0x01	; Registro de tiempo hardware
INTCON	EQU	0x0B	; Registro de control de interrupcion
OPTREG	EQU	0x81	; Registro de opciones

st_pers	EQU	0x20	; Var para control del estado de la persiana
st_LigH	EQU	0x21	; Var para control del estado de la luz
comp1	EQU	0x22	; Var resultado comparador 1 
comp2	EQU	0x23	; Var resultado comparador 2
Lampara	EQU	0x24	; Luminosidad de la lampara 0=baja..127=maxima
result	EQU	0x25	; Var para almacenar resultado comparacion.
estado	EQU	0x26	; Var para estados d las var XXXX X pers sint sext
count1	EQU	0x27	; Var para el contador de delay
count2	EQU	0x28	; Var para el contador de delay
W_Temp	EQU	0x29	; Guardamos registro W durante interrupcion
St_Temp	EQU	0x30	; Guardamos registro STATUS durante interrupcion
ls_adc	EQU	0x31	; Guardamos el valor despues de la conversion AD
DEMORA	EQU	0x32	; Valor de demora para enceder el TRIAC
PDel0	EQU	0x33	; Variable para el calculo de 5segundos de retardo
PDel1	EQU	0x34	; Variable para el calculo de 5segundos de retardo	
PDel2	EQU	0x35	; Variable para el calculo de 5segundos de retardo
Contador EQU 0x36	; Variable para el retardo de 20us
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	ORG 	000		; Comienzo de la memoria del programa
	NOP				; Para el modo ICD
	GOTO 	init	; Salta al programa principal
	ORG		04
	GOTO	INT


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Inicializacion del puertos ..................................................

init
	BCF	STATUS,7	; Configure  bit FSR a 0 to work with bank0/1
	BCF	STATUS,5	; Selecct bank0 RP0
	BCF	STATUS,6	; writing 00 en RP0:RP1
	BCF	estado,2	; Initial state to shade (blind) as closed
	BCF	estado,3	; After 5 seconds running up PORTD, this flag will be active
	CLRF	PORTA		; cleaning PORTs A al D
	CLRF	PORTB
	CLRF	PORTC
	CLRF	PORTD
	BSF	STATUS,5	; Selectbank 1 writing 01 RP0:RP1
	MOVLW	0X80		; 
	MOVWF	ADCON1		; PORTA as analogic
	MOVLW	0XCF		;
	MOVWF	TRISA		; PORTA as input

	NOP			; BANKSEL no puede ser etiquetada
	BANKSEL	TRISB		; Select bank1
	MOVLW	b'11111101'	; Configure RB1 as output(b'11111101') 253
	MOVWF	TRISB		; Load code DDR en F86

	NOP			; BANKSEL no puede ser etiquetada
	BANKSEL	TRISC		; Select  bank1
	MOVLW	b'10111111'	; Configure RC6 as output and RC7 as input(b'01111111') 127
	MOVWF	TRISC		; Carga el codigo DDR en F87

	NOP			; BANKSEL no puede ser etiquetada
	BANKSEL	TRISD		; Select bank1
	MOVLW	b'11111111'	; Configure PORTD as output(b'11111100') 252
	MOVWF	TRISD		; load  DDR en F88

 	MOVLW B'11000111'	;Prescaler assign to TMR0 
	MOVWF OPTION_REG
	MOVLW B'10010000'	;INT PIN RB0
	MOVWF INTCON
	GOTO	Ppal

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



INT 
	BTFSS INTCON,INTF
	GOTO BACK
	MOVF DEMORA,W		; Delay reg for TRIAC TRIAC
	MOVWF TMR0
	CLRF PORTA
WAIT
	BTFSS INTCON,T0IF
	GOTO WAIT        ; Wait activation for TMR0 flag 
	BCF INTCON,T0IF  ; Clean flag
	MOVLW B'00000010'; triggering TRIACS
	MOVWF PORTB
	BSF 3,5
	BTFSS OPTION_REG,INTEDG
	GOTO SETTING
	BCF OPTION_REG,INTEDG
	BCF 3,5
	GOTO BACK
SETTING
	BSF OPTION_REG,INTEDG
	BCF 3,5
BACK
	BCF INTCON,INTF
	RETFIE

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Programa principal
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



Ppal
	CALL	Capdat	; Adquiring data subroutine
	CALL	nivluz1	; subroutine for managing delay for dimmer
	CALL	persia	; Acting on shades or blind
	GOTO	Ppal

;Subrutina de captura de datos.................................................



; getting data from LDR to manage light intensity
; Init conversion AD. Clock conversion 4MHz/32,AN4 Channel ON 
; AN0,AD conversion OFF,AD module de conversion ON

Capdat	
		banksel ADCON0        
		movlw b'01000001'    ; fosc 8, RA0 analogico
		movwf ADCON0    

; Incializacion convertidor AD. left-aligned, All PORTA as analog input

 	banksel ADCON1
 	movlw b'00001110'	;left-aligned,  channel 0, module ON
 	movwf ADCON1
	call Demora_20us	; Waiting adq time
; Starting conversion AD

 	banksel ADCON0
 	bsf ADCON0,2

; waiting for conversion end

espera
	btfsc ADCON0,2    
	goto espera

; Writing value at reg named ls_adc.

	banksel ADRESH
	movf ADRESH,0       ; Working with ADRESH only
						; 
	banksel ls_adc
	movwf ls_adc        ; valor en W Reg. se escribe en la variable ls_adc
	RETURN

Demora_20us
	movlw 0x05
	movwf Contador		; init Contador for delay
Repeticion
	decfsz Contador,1	; Decrementa Contador en 1
	goto Repeticion		; Si no es cero repetimos el ciclo
	RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Tratamiento de los datos, comparativa de niveles de luz.......................
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

nivluz1
	MOVLW 	b'11100101'	; load value to compare level with stimate 4,5V
	SUBWF 	ls_adc,W	; compare ls_adc with ref value
	BTFSC	STATUS,Z	; If match run following line, opposite jump next line
	GOTO	dem10ms
	BTFSS	STATUS, C	; check bit to know if is greater or lesser
	GOTO	nivluz2		; if lesser check following level
dem10ms
	MOVLW	b'11011001'	; load 217 on DEMORA, corresponding with  10ms forTMR0
	MOVWF	DEMORA		; 
	RETURN

nivluz2
	MOVLW 	b'11001100'	; load value to compare level with stimate 4V
	SUBWF 	ls_adc,W	; compare ls_adc with ref value
	BTFSC	STATUS,Z	; If match run following line, opposite jump next line
	GOTO	dem9ms
	BTFSS	STATUS, C	; check bit to know if is greater or lesser
	GOTO	nivluz3		; if lesser check following level
dem9ms
	MOVLW	b'11000011'	; load 195 en DEMORA que corresponding with 9ms para el TMR0
	MOVWF	DEMORA		; 
	RETURN

nivluz3
	MOVLW 	b'10110010'	; cargo valor a comparar nivel con 3.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem8ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz4		; en caso de que sea menor comprobamos siguiente intervalo
dem8ms
	MOVLW	b'10101101'	; cargamos 173 en DEMORA que corresponde con 8ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz4
	MOVLW 	b'10011001'	; cargo valor a comparar nivel con 3V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem7ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz5		; en caso de que sea menor comprobamos siguiente intervalo
dem7ms
	MOVLW	b'10010111'	; cargamos 151 en DEMORA que corresponde con 7ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz5
	MOVLW 	b'01111111'	; cargo valor a comparar nivel con 2.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem6ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz6		; en caso de que sea menor comprobamos siguiente intervalo
dem6ms
	MOVLW	b'10000010'	; cargamos 130 en DEMORA que corresponde con 6ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz6
	MOVLW 	b'01100110'	; cargo valor a comparar nivel con 2V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem5ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz7		; en caso de que sea menor comprobamos siguiente intervalo
dem5ms
	MOVLW	b'01101100'	; cargamos 108 en DEMORA que corresponde con 5ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz7
	MOVLW 	b'01001100'	; cargo valor a comparar nivel con 1.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem4ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz8		; en caso de que sea menor comprobamos siguiente intervalo
dem4ms
	MOVLW	b'01010110'	; cargamos 86 en DEMORA que corresponde con 4ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz8
	MOVLW 	b'00110011'	; cargo valor a comparar nivel con 1V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem3ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	nivluz9		; en caso de que sea menor comprobamos siguiente intervalo
dem3ms
	MOVLW	b'01000001'	; cargamos 65 en DEMORA que corresponde con 3ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

nivluz9
	MOVLW 	b'00011001'	; cargo valor a comparar nivel con 0.5V
	SUBWF 	ls_adc,W	; comparamos ambos registros
	BTFSC	STATUS,Z	; Si son iguales se ejecuta la siguiente, en caso contrario se salta
	GOTO	dem2ms
	BTFSS	STATUS, C	; comprobamos el bit de complemento para saber si es mayor o menor
	GOTO	no_dem		; en caso de que sea menor no aplicamos ninguna demora
dem2ms
	MOVLW	b'00101011'	; cargamos 65 en DEMORA que corresponde con 2ms para el TMR0
	MOVWF	DEMORA		; ya que hay luz y no necesitamos que este encendida
	RETURN

no_dem
	MOVLW	b'00000000'	;no aplicamos ninguna demora, al estar en completa oscuridad
	MOVWF	DEMORA
	RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Tratamiento de los datos, accion de persiana..................................
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



persia
	BTFSC	estado,2	;testing shade bit
	GOTO	luz			; If 1 	I will check light state bit 
	GOTO	oscuro		; If 0 I will check light state bit
luz
	BTFSS	estado, 3	; testing shade bit
	GOTO	abrir		; If closed, then will open the shade
	RETURN			; if it is openen, I do not anything
oscuro
	BTFSS	estado, 3	; testeo bit de estado
	RETURN			; if closed, nothing to do
	GOTO	cerrar		; If open, then will close the shade
abrir
	BSF 	PORTD,0		; writing 1 in RD0 to open
	GOTO 	espera5s	; Waiting  5 seconds (stimate time) to let the shade be totaly opened
	BCF	PORTD,0		; deactivate port D0
	BSF	estado,2	; Updating flag bit  estado to open
	RETURN
cerrar
	BSF	PORTD,1		; writing 1 por RD1 to close
	GOTO	espera5s	; Waiting  5 seconds (stimate time) to let the shade be totaly opened
	BCF 	PORTD,1		; deactivate port  D1
	BCF	estado,2	; Updating flag bit  estado to close
	RETURN
;-------------------------------------------------------------
espera5s
		movlw     .165  	; 1 set numero de repeticion  (C)
        movwf     PDel0    	; 1 |
PLoop0
		movlw     .41      	; 1 set numero de repeticion  (B)
        movwf     PDel1    	; 1 |
PLoop1
		movlw     .147      	; 1 set numero de repeticion  (A)
        movwf     PDel2     	; 1 |
PLoop2
		clrwdt              	; 1 clear watchdog
        clrwdt              	; 1 ciclo delay
        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
        return              	; 2+2 Fin.
;-------------------------------------------------------------

	END
 
Last edited:
Not the same..... It will work in real time but as for Proteus the time from setting the go/done and reading the go/done is 1 clock cycle (a bug in proteus?) I think so because there have been more than one occasion (mainly with graphical displays) where 1 clock cycle isn't enough to update proteus simulation status... As I said, not a problem in the real world.
 
Ok, then i will add that lines to the code to simulate it.

What do you think about my comment code "translation" ?
 
That not sound good :( , I have to write the code for comunication between PC and the pic, but I want that this part will be running good before of that.

I appreciate your help!

If you have an idea to resolve that issue don't doubt to contact me!!!! (desperate tone) hahahahaha....
 
I think the problem is that you wait for timer0 overflow... In the interrupt... You may need to wait outside for the interrupt... Why are you using tmr0 inside the interrupt anyway?

Is it for switch debounce?
 
It is because i have no idea.... so if you can explain me how can i do it in the other way, i can do it. It is going to be used to get the delay for a dimmer. And that was what i found. And i'm a beginner.

I get a zero cross detection circuit, and when i get the activation signal. I have to check the value of a LDR to get the delay for dimmer. so i get an interruption for RB0 port, and load the TMR0 with the value.
 
Last edited:
Status
Not open for further replies.

Latest threads

Back
Top