Autor Tema: problemas con generador de pulsos!  (Leído 2184 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rabuchino

  • PIC10
  • *
  • Mensajes: 2
problemas con generador de pulsos!
« 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

Desconectado rabuchino

  • PIC10
  • *
  • Mensajes: 2
RE: problemas con generador de pulsos!
« Respuesta #1 en: 08 de Julio de 2005, 03:51:00 »
Ardiendo
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


 

anything