TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: rabuchino en 06 de Julio de 2005, 08:11:00
-
Hola a todos, os remito un problemilla que tengo. Como podreis comprobar aun soy un novato en esto de la programacion de PICs. Bueno os comento el asunto:
Quiero generar 2 pulsos completamente independientes por dos salidas diferentes del PIC, si las pruebo los bucles por separado van bien pero al intentar hacer que salgan las dos solo me sale la primera (la salida 0 del puerto B), la salida 1 se me queda en un pulso positivo sin oscilar como toca.
Supongo que el problema esta en sacar los bucles anidados. Os adjunto el fichero completo por si alguno me puede ayudar, ya que veo que por aqui hay gente que controla bastante del asunto.
Gracias de antemano.
;************************************ Oscilador.asm ***********************************
;
; El LED (OSC1) conectado a la línea 0 del puerto de salida se enciende durante 625 us
; y se apaga durante 625 us (Fr=800Hz D=50%).
; El LED (OSC2) conectado a la línea 1 del puerto de salida se enciende durante 1.25 ms
; y se apaga durante 18.75 ms (Fr=50Hz D=6.25%).
;
;
; ZONA DE DATOS ***********************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C ; En esta posición empieza la RAM de usuario.
ENDC
#DEFINE OSC1 PORTB,0
#DEFINE OSC2 PORTB,1
; ZONA DE CÓDIGOS **********************************************************************
ORG 0
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
bcf OSC1 ; Línea del LED configurada como salida.
bcf STATUS,RP0 ; Acceso al Banco 0.
bsf STATUS,RP0 ; Acceso al Banco 1.
bcf OSC2 ; Línea del LED configurada como salida.
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal1
bsf OSC1 ; Enciende el LED
call Retardo_625us ; durante la suma de este tiempo.
bcf OSC1 ; Lo apaga durante la suma de los siguiente
call Retardo_625us ; retardos.
goto Principal1
Principal2
bsf OSC2 ; Enciende el LED
call Retardo_1.25ms ; durante la suma de este tiempo.
bcf OSC2 ; Lo apaga durante la suma de los siguiente
call Retardo_18.75ms ; retardos.
goto Principal2
; Subrutinas "Retardo_Micros" y "Retardo_Micros"-------------------------------------------
;
CBLOCK
R_ContA ; Contadores para los retardos.
R_ContB
R_ContC
R_ContD
R_ContE
ENDC
; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4Mhz
; la llamada subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina "return"
; toma otros 2 ciclos máquina y cada instruccion "nop" tarda 1 ciclo máquina.
Retardo_625us ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d"206" ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_Micros ; Aporta 2 ciclos máquina.
;
; El próximo bloque "Retardos_Micros" tarda:
; 1+(K-1)+2+(K-1)*2=(2+3K) ciclos máquina
;
Retardos_Micros
movwf R_ContA ; Aporta 1 ciclo máquina.
RMicros_Bucle
decfsz R_ContA,F ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto RMicros_Bucle ; Aporta (K-1)x2 ciclos máquina.
return ; El salto de retorno aporta 2 ciclos máquina.
;
; En total estas subrutinas tardan:
; - Retardo_625us: 2 + 1 + 2 + (2 + 3K) = 625 cm = 625 us. (para K=206 y 4 Mhz).
Retardo_1.25ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d"2" ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms1 ; Aporta 2 ciclos máquina.
Retardo_18.75ms
movlw d"50"
goto Retardos_ms2
; En el proximo bloque "Retardos_ms" tarda:
; 1+M+M+KxM+(K-1)xM+Mx2+(K-1)Mx2+(M-1)+2+(M-1)x2+2=(2+4M+4KM) ciclos máquina.
; Para K=249 y M=1 supone 1002 cilos máquina que a 4Mhz son 1002us = 1ms
Retardos_ms1
movlw R_ContC ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d"155" ; Aporta Mx1 ciclos máquina. Éste es el valor de "K"
Movwf R_ContB ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContB,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContC,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1ms_BucleExterno ; Aporta (K-1)x2 ciclos máquina.
return
;
Retardos_ms2
movlw R_ContE ; Aporta 1 ciclo máquina.
R2ms_BucleExterno
movlw d"93" ; Aporta Mx1 ciclos máquina. Éste es el valor de "K"
Movwf R_ContD ; Aporta Mx1 ciclos máquina.
R2ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContD,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R2ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContE,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R2ms_BucleExterno ; Aporta (K-1)x2 ciclos máquina.
return
; En total estas subrutinas tardan:
; - Retardo_1.25ms: 2 + 1 + 2 + (2 + 4M+ 4KM) = 1250 cm = 1.25 ms. (para K=155 y 4 Mhz).
; - Retardo_18.75ms: 2 + 1 + 2 + (2 + 4M+ 4KM) = 18607 cm= 18.75 ms. (para K=93 y 4 Mhz).
;
END
-

Hola, después de varios dias trasteando con el programa he llegado a la conclusion que no puedo temporizar dos salidas independientes, ya que aunque una de ellas la controle con el TMR0 y otra con RETARDOS al trabajar el PIC secuencialmente con las instrucciones las salidas siempre van a depender de la temporizacion mas larga, este creo que es el motivo de que cuando pruebo las rutinas de los salidas oscilantes independientemente van perfectamente pero cuando quiero que me muestren las dos simultaneamente la frecuencia de salida me la va a marcar la de frecuencia menor.
Bueno esa es mi teoria, si alguien puede ayudarme se lo agradeceria
Gracias