PWM de Baja frecuencia (50 Hz) en Assembler

#1
Bueno estoy hace muy poco en lo que son pic, y encontre este foro de muy buena calidad pero no logro satisfacer mi duda con respecto al PWM.
Bueno les comento estoy programando en assembler el PIC16F877a, pero no puedo generar un PWM que de una frecuencia de 50 Hz, he leido que se debe generar un contador, de hecho lo explican en un tema dentro de este foro, pero no se como asimilarlo o generar tal contador que ayude al PWM a generar los 50 Hz pero en codigo ASM.

Si pueden orientar o mostrar algun tipo de codigo, o como puedo agragar una rutina en C en un programa con assembler.
ok muchas gracias y espero su ayuda.
 
#2
Si solo tenés que generar una onda cuadrada de 50Hz (período de 20 mls) no es necesario que uses el PWM, ya que es muy simple realizar esto, decrementando unos registros y enviando un 1 y 0 en secuencia a la salida de uno de los pines del micro cada vez estos finalizan la cuenta, listo. Lo que tenés que calcular es el valor cargado en los registros de acuerdo a la frecuencia del cristal. Hay varios programas gratuitos en internet que realizan este calculo. Suerte.-
 
#3
WillyP agradesco tu respuesta pero no me deja muy claro, debe ser que soy muy novato, pero pudes ser mas especifico en cuanto a tu descripción ya que no se a que registros te refieres.

Saludos,
 
#7
Acá te dejo un código que te genera una onda cuadrada de 50hz sobre el pin 2 del puerto A (RA0), se puede hacer tambien con los timmers del pic, pero como no sabías sobre que eran los registros esto va a ser más didáctico ya que se decrementan registros. Podés simularlo desde el MPLAB, en este caso con el stopwatch en 4Mhz te dará 10 milisegundos de salida en alto y 10 milisegundos en bajo, para un período de 20 mls = 50Hz.
Está en un adjunto, suerte.-
 

Adjuntos

#10
Bueno la idea es que quiero implementar un PWM de 50Hz en el cual contenga un conversor analogo digital, o sea por medio de un potenciometro ir variando el tiempo de alta de un motor, que tiene que funcionar a 50 Hz como limite maximo. si es que lo termino lo subo para todos,

Acepto ayuda comentarios y demases
 
#11
Hola amigos, en lo mismo de pwm. Me llamo mucho la atención el crear la onda cuadrada desde puramente la programación. ¿Quisiera saber si me pueden ayudar?, yo utilizo un cristal de 20mhz.
¿Que pagina visito para el asm de un pwm a 20mhz? o si pudieran subir el programa en asm con 20Mhz.
Lo agradecería muchísimo.
 
Última edición por un moderador:
#12
Tomando como referencia el programa que subió WillyP en el post #8,
haciendo unas modificaciones, y el retardo de 10ms con el oscilador a 20MHz, quedaría de esta forma...
Código:
    list    p=16f877a
    include    <p16f877a.inc>
    __config    _HS_OSC & _PWRTE_ON & _WDTE_OFF & _LVP_OFF
    errorlevel    -302    ; Suprimir mensajes de selección de bancos

; Declaración de variables
    cblock 0x20
    Cnt1,Cnt2
    endc
    
    org    0x00
    
MainStart
    bsf    STATUS,RP0            ; Banco 1        
    movlw    0x06            ; Conversores ADC OFF (Digital I/O)
    movwf    ADCON1    
    movlw    b'11111110'        ; Solo RA0 como salida
    movwf    PORTA        
    bcf        STATUS,RP0        ; Banco 0
;______________________________________________________________________
; Programa para generar 50Hz por RA0

MainProgram
    btfss    PORTA,0            ; Salta una dirección si RA0 es 1
    goto    $+4                ; Si es 0, salta para invertir estado
    nop                        ; nop para simetría de los estados 
    bcf        PORTA,0            ; Si es 1, invierte estado de RA0
    goto    $+3                ; Salta 3 posiciones
    bsf        PORTA,0            ; RA0 en nivel alto
    goto    $+1                ; Consume 2 ciclos, para simetría
    call    Delay10Ms        ; Ir a subrutina de 10Ms
    goto    MainProgram        ; continúa 
;___________________________________________________________________
; Subrutina de retardo de 10Ms. @ 20MHz.
Delay10Ms
; 49993 ciclos
    movlw    0x0E
    movwf    Cnt1
    movlw    0x28
    movwf    Cnt2
Delay10Ms_0
    decfsz    Cnt1,f
    goto    $+2
    decfsz    Cnt2,f
    goto    Delay10Ms_0
; 3 ciclos
    goto    $+1
    nop
; 4 ciclos (incluyendo call)
    return            

    end
Suerte.
 
Última edición:
Arriba