Autor Tema: GENERAR DOS SEÑALES DE SALIDA CON EL PIC18F4550  (Leído 2423 veces)

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

Desconectado jes

  • PIC10
  • *
  • Mensajes: 4
GENERAR DOS SEÑALES DE SALIDA CON EL PIC18F4550
« en: 18 de Junio de 2020, 22:15:44 »
Hola, tengo una duda; estoy recien empezando a aprender programacion y necesito ayuda con un problema que es el siguiente; tengo que usar el PIC18f4550 para generar dos señales de salida, una por RB3 y otra por RB5. Lo estoy simulando con Proteus y estoy usando MPLAB X IDE para crear el codigo asembler, la frecuencia que uso (Fosc = 20Mz) y las frecuencias que se deberian visualizar por las salidas (configure RB3 y RB5 como salidas) son de 63Hz y 467Hz respectivamente, en el problema me plantean que puedo construir el codigo ya sea por consulta o por interrupcion y que ademas puedo usar ya sea el timer0 o el timer1. Mi problema es el siguiente: Cuando tengo que construir el codigo solo con una señal de salida, mi codigo me funciona  bien , el problema esta cuando quiero generar dos señales de salida con diferente frecuencia simultaneamente como me plantean en el ejercicio.
Mas que nada, me gustaria que me ayudaran sobre como es que puedo hacer para tener dos señales de salida con diferentes frecuencias no importando tanto el tema de las frecuencias. Les adjuntare el programa a continuacion que uso para generar solo una señal de salida por el pin RB7 empleando el timer1 por consulta:

#INCLUDE P18F4550.INC
VI EQU D'60182'
 CALL INITB
 CALL INIT_TMR1
BUCLE
 CALL CARGAR_TIMER
ESPERAR_DESBORDE
 BTFSS PIR1, TMR1IF; ?
 GOTO ESPERAR_DESBORDE
 CALL INVERTIR_SALIDA
 CALL BORRAR_BANDERA
 GOTO BUCLE
INITB
 CLRF TRISB
 CLRF PORTB
 RETURN
INIT_TMR1
 MOVLW HIGH(VI)
 MOVWF TMR1H
 MOVLW LOW(VI)
 MOVWF TMR1L
 MOVLW B'10000000';RELOJ INTERNO
 MOVWF T1CON; 1:1
 BSF T1CON , TMR1ON; ARRANQUE
 RETURN
INVERTIR_SALIDA
 MOVLW 0X80
 XORWF PORTB
 RETURN
CARGAR_TIMER
 MOVLW HIGH(VI)
 MOVWF TMR1H
 MOVLW LOW(VI)
 MOVWF TMR1L
 RETURN
BORRAR_BANDERA
 BCF PIR1, TMR1IF
 RETURN
 END
 
Y este es el que yo intente modificar para obtener dos señales de salida usando una con el timer0 y otra con el timer1 y una por interrupcion y otra por consulta (aunque creo que esta parte es la que esta mal):

#INCLUDE P18F4550.INC
VI0 EQU D'62859'
VI1 EQU D'25853'
 GOTO PROGRAMA
 ORG 0X0008
 GOTO INTERRUPCION
PROGRAMA
 CALL INITB
 CALL INIT_TMR0
 CALL INIT_TMR1
 CALL INIT_INT
BUCLE                                                                         
 CALL CARGAR_TIMER
ESPERAR_DESBORDE
 BTFSS PIR1, TMR1IF; ?
 GOTO ESPERAR_DESBORDE
 CALL INVERTIR_SALIDA
 CALL BORRAR_BANDERA
 GOTO BUCLE
INTERRUPCION
 MOVLW HIGH(VI0)
 MOVWF TMR1H
 MOVLW LOW(VI0)
 MOVWF TMR1L
 MOVLW 0X20 ;PIN 5
 XORWF PORTB
 BCF INTCON,T0IF
 RETFIE
INITB
 CLRF TRISB
 CLRF PORTB
 RETURN
INIT_TMR0
 MOVLW HIGH(VI0)
 MOVWF TMR0H
 MOVLW LOW(VI0)
 MOVWF TMR0L
 CLRF INTCON
 MOVLW B'10010000'
 ;Arrancado, 16 bits
 ;Reloj interno con pre-escalador 1:2
 MOVWF T0CON
 RETURN
INIT_TMR1
 MOVLW HIGH(VI1)
 MOVWF TMR1H
 MOVLW LOW(VI1)
 MOVWF TMR1L
 MOVLW B'10000000';RELOJ INTERNO
 MOVWF T1CON; 1:1
 BSF T1CON , TMR1ON; ARRANQUE
 RETURN
INVERTIR_SALIDA
 MOVLW 0X80 ;PIN 7
 XORWF PORTB
 RETURN
CARGAR_TIMER
 MOVLW HIGH(VI1)
 MOVWF TMR1H
 MOVLW LOW(VI1)
 MOVWF TMR1L
 RETURN
BORRAR_BANDERA
 BCF PIR1, TMR1IF
 RETURN
INIT_INT
 BSF INTCON, T0IE
 BSF INTCON, GIE
 RETURN
 END


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:GENERAR DOS SEÑALES DE SALIDA CON EL PIC18F4550
« Respuesta #1 en: 18 de Junio de 2020, 22:51:47 »
Si no te importa tanto el tema de la frecuencia...

29421Hz es el mcm de 63Hz y 467Hz.

El periodo de 29421 es 33.9893us, lo mas proximo es de 34us para hacerlo redondo. Pero como necesitas dos cambios por cada Hz, entonces es cada 17us
Ahora para obtener el de 467Hz serian 29421/467 = 63 veces el periodo de 34us, o 63 veces 17us en bajo y 63 veces 17us en alto.
Y para el de 63Hz serian 467 veces el periodo de 34us, o igual que arriba 467 veces 17us en bajo y 467 veces 17us en alto.

Solo se necesita contar.... Si lo haces mas simple seria algo asi (Timepo 1 = 467Hz, Tiempo2 = 63Hz ) :

Tu loop principal:
Código: [Seleccionar]
Incremetno 1 contador Tiempo 1
Incremetno 1 contador Tiempo 2
Tiempo 1 igual a 63? SI -> cambio de estado salida y pongo a cero Tiempo 1
NO-> agregarles NOP por la misma cantidad de instrucciones que arriba ( contar el salto)
Tiempo 2 igual a 467? SI-> cambio de estado salida y pongo a cero Tiempo 2
NO-> agregarles NOP por la misma cantidad de instrucciones que arriba ( contar el salto)
Espera en la cual las instrucciones de arriba + el salto sea lo mas proximo a 17us
« Última modificación: 18 de Junio de 2020, 22:54:55 por KILLERJC »

Desconectado jes

  • PIC10
  • *
  • Mensajes: 4
Re:GENERAR DOS SEÑALES DE SALIDA CON EL PIC18F4550
« Respuesta #2 en: 18 de Junio de 2020, 23:30:58 »
Si te entiendo pero, el pic se esta configurando como temporizador, si el bit 1 de este byte en la linea:" MOVLW B'10000000';RELOJ INTERNO"  tuviera valor 1 (osea B'10000010') si se habria configurado como contador. Ademas estoy usando el desbordamiento de los timer y todo esto esta en el bucle infinito:
BUCLE
 CALL CARGAR_TIMER ; Carga el numero D'60182' en el registro timer1 que es el Valor Inicial
ESPERAR_DESBORDE ; El codigo espera a que el timer1 se desborde, osea que llegue a su valor maximo, como uso 16 bits el numero maximo es 2^16
 BTFSS PIR1, TMR1IF; Aqui se comprueba si se ha desbordado el timer1, si es asi salta la siguiente instruccion
 GOTO ESPERAR_DESBORDE; si es que aun no se ha desbordado vuelve a ESPERAR_DESBORDE
 CALL INVERTIR_SALIDA; luego de que se desborda se invierte el puertoB para que empiezen los valores de nuevo con la operacion OR EXCLUSIVO
 CALL BORRAR_BANDERA; borra la bandera del registro del timer1
 GOTO BUCLE ; fin del bucle

Busco un temporizador mas no un contador, pero igual gracias por comentar :')

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:GENERAR DOS SEÑALES DE SALIDA CON EL PIC18F4550
« Respuesta #3 en: 19 de Junio de 2020, 08:45:03 »
Bueno, usa los dos timers, uno para el de 63 y otro para el de 467 corregilo a esto:


Código: ASM
  1. BUCLE
  2.   DETECTO_DESBORDE_TIM1
  3.   DETECTO_DESBORDE_TIM0
  4. GOTO BUCLE ; fin del bucle
  5.  
  6. DETECTO_DESBORDE_TIM1
  7.   BTFSS desbordo TM1?
  8.   NO -> RETURN
  9.   SI  ->
  10.   INVIERTO SALIDA
  11.   CARGO TIMER
  12.   BORRO FLAG_TIM1
  13.   RETURN
  14.  
  15. DETECTO_DESBORDE_TIM0
  16.   BTFSS desbordo TM0?
  17.   NO -> RETURN
  18.   SI  ->
  19.   INVIERTO SALIDA
  20.   CARGO TIMER
  21.   BORRO FLAG_TIM0
  22.   RETURN


Observa que no espero nada.. no me quedo esperando con un loop infinito ( GOTO $-1, etc ), simplemente observo la bandera y actuo en consecuencia. Nada de esperas o delays

Usualmente las esperas y delays es lo que le trae problemas a los que recien comienzan. Por lo mismo que te ocurre a vos. Solo funciona en ambos casos, pero cuando lo juntas, el codigo que te funcionaba, ahora se ve bloqueado con los delays y/o esperas del otro codigo.

Desconectado jes

  • PIC10
  • *
  • Mensajes: 4
Re:GENERAR DOS SEÑALES DE SALIDA CON EL PIC18F4550
« Respuesta #4 en: 19 de Junio de 2020, 12:40:01 »
Te entiendo, más bien un pregunta sobre los timers, yo estoy haciendo mi código con ambos timers del pic(el 0 y el 1) configurados para 16 bits porque pienso que al ser dos señales de salida no se va a poder desbordar ambos ya que son frecuencias diferentes pero, ¿se puede hacer solo con un timer? Ya sea con el 0 o con el 1 pero es posible? Ya que esto de usar ambos timers uno para cada frecuencia me esta dando un gran dolor de cabeza.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:GENERAR DOS SEÑALES DE SALIDA CON EL PIC18F4550
« Respuesta #5 en: 19 de Junio de 2020, 12:52:22 »
Si, se puede.. El problema lo vas a tener en los tiempos (debido a las frecuencias elegidas)....

63 y 467 son numeros primos , por lo cual como te comentaba los el minimo multiplo que comparten es 63*467 = 29421 , lo cual son microsegundos

Y volvemos a lo que hice antes (sin timer), contando cuantas veces ocurren las interrupciones (activa el flag) y cambiando la salida.

Ahora si las frecuencias fueran distintas por ejemplo 64 y 468, todo cambia, ya que el mcm ahora es de 7488, y eso implica menos posibles errores con respecto al tiempo, ya que tendrias "interrupciones" (flag activado) cada 66us y no 17us... Por lo tanto es mas permisivo el error en el tema de tiempos..

Ya que el error en cada vuelta se va acumulando. y mientras menos "vueltas" contando tengas mejor.
Podes evitar esos errores si usas el modulo CCP.
« Última modificación: 19 de Junio de 2020, 22:04:06 por KILLERJC »

Desconectado jes

  • PIC10
  • *
  • Mensajes: 4
Re:GENERAR DOS SEÑALES DE SALIDA CON EL PIC18F4550
« Respuesta #6 en: 20 de Junio de 2020, 22:49:34 »
Si gracias, ya logré solucionar mi problema con tu ayuda :'D

Desconectado raul edgarsd

  • PIC10
  • *
  • Mensajes: 1
Re:GENERAR DOS SEÑALES DE SALIDA CON EL PIC18F4550
« Respuesta #7 en: 12 de Junio de 2021, 12:23:28 »
hola!.
por favor podrías compartir tu código ?? también tengo el mismo problema


 

anything