FAQ FAQ  •  Buscar Buscar  •  Registrarse Registrarse  •  Entre para ver sus mensajes privados Entre para ver sus mensajes privados
Login Login

Pasar de ASM a C este programa controla motor
Índice de los Foros Electronica Facil » FOROS ELECTRONICA » Microcontroladores PIC
Publicar nuevo tema   Responder al tema
Ver tema anteriorEntre para ver sus mensajes privadosVer tema siguiente
AutorMensaje
Meta
Asunto: Pasar de ASM a C este programa controla motor MensajePublicado: 19 Feb, 2014 - 06:22
Habitual
Habitual


Registrado: 03 Sep, 2008
Mensajes: 124

Hola:



Partiendo de este esquema, es un PIC16F84A escrito en ensamblador y quiero pasarlo a C, sea con el CCS o el XC8. Para ser sencillo a simple vista, me he comido la cabeza en 5 días para acabarlo proque partes del asm se me había olvidado y tuve que practicar y pedir ayuda al foro. Gracias colaboradores. :apreton:.

No estoy familiarizado en C ssobre microcontroladores y debo aprenderlo con tutoriales, en mi caso quiero saber su equivalencia, y el que quiera puede ayudar adaptar el código asm a C. No tienes que saber asm pàra pasarlo a C, simplemente explico el circuito, a lo mejor lo saca más rápido que asm.

Se trata de un microcontrolador PIC16F84A que tiene 5 pulsadores en el cual al pulsarlo se activa un temporizado fijo. Un motor DC de 12V de salida, siempre funciona en la misma dirección.

Pulsador 1 = 5 minutos.
Pulsador 2 = 10 minutos.
Pulsador 3 = 20 minutos.
Pulsador 4 = Stop.
Pulsador 5 = Reset del PIC.
Cada Led encensido corresponde a su pulsador.


Su funcioinamiento debe ser así ya que en el asm no me sale.

Al darle fuente alilmentación al PIC, el motor y los Led deben estar apagados. Si pulso el pulador P2, es decir, Pulsador 2, se enciende el motor dc durante 10 minutos y el Led 2. Si pulso el Pulsador 1 cuando esté o no el de 10 minutos activo, simplemente cuenta de nuevo desde cero y dura 5 minutos el motor activado. Espero que se entienda loq ue quiero decir. El Pulsdor 4 es el Stop. Si el motor está activo y Led, detiene el motor y Led. El Reset resetea el PIC y se coporta como si fuera el pulsador de Stop.

¿Parece fácil, verdad?

Les dejo el asm del 16F84A y espero que me ayuden a pasarlo a C queno tengo idea, sea a código y ya compilado.

Para los atrevidos, buena suerte.

Código:
;

;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A        ; Procesador.
    INCLUDE        <P16F84A.INC>   ; Definición de las etiquetas del PIC.
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
    __IDlOCS    0001            ; Versión del programa.

Variables UDATA_SHR
RAM     RES 1
RAM_1   RES 1
RAM_2   RES 1
RAM_3   RES 1
RAM_4   RES 1
RAM_5   RES 1
RAM_6   RES 1
RAM_7   RES 1
RAM_8   RES 1
RAM_9   RES 1
RAM_10  RES 1
RAM_11  RES 1
RAM_12  RES 1
RAM_13  RES 1
RAM_14  RES 1
RAM_15  RES 1
RAM_16  RES 1
RAM_17  RES 1

#DEFINE Pulsador_1    PORTA,4        ; Pulsador conectado a RA4.
#DEFINE Pulsador_2  PORTA,3     ; Pulsador conectado a RA3.
#DEFINE Pulsador_3  PORTA,2     ; Pulsador conectado a RA2.
#DEFINE Pul_STOP    PORTA,1     ; Pulsador de parada del motor.
#DEFINE Motor        PORTB,7        ; Línea donde se conecta el motor.
#DEFINE Led_1       PORTB,6     ; Led 1.
#DEFINE Led_2       PORTB,5     ; Led 2.
#DEFINE Led_3       PORTB,4     ; Led 3.

; ZONA DE CÓDIGOS ********************************************************************

    ORG    0                        ; El programa comienza en la dirección 0.
Inicio
     bsf        STATUS,RP0            ; Acceso al Banco 1.
    bsf        Pulsador_1            ; La línea RA4 se configura como entrada.
    bsf        Pulsador_2            ; La línea RA3 se configura como entrada.
    bsf        Pulsador_3            ; La línea RA2 se configura como entrada.
    bsf        Pul_STOP            ; La línea RA1 se configura como entrada.
    bcf        Motor                ; Se configura como salida.
    bcf     Led_1               ; Led de aviso 5 minutos en activo.
    bcf     Led_2               ; Led de aviso 10 minutos en activo.
    bcf     Led_3               ; Led de aviso 20 minutos en activo.
    bcf        STATUS,RP0            ; Acceso al Banco 0.
    bcf        Motor                ; En principio Motor apagado igual
    bcf     Led_1               ; que los Leds.
    bcf     Led_2
    bcf     Led_3

Principal
    btfsc    Pulsador_1            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Fin                    ; No. Vuelve a leerlo.
    call    Retardo20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc    Pulsador_1            ; Comprueba si es un rebote.
    goto    Fin                    ; Era un rebote y sale fuera.
    bsf     Motor               ; Activa el motor y
    bsf     Led_1               ; enciende el Led 1 que significa
    call    Retardo5m              ; los 5 minutos encendido.
    bcf     Motor               ; Apaga el motor y
    bcf     Led_1               ; el Led 1.
EsperaDejePulsar_1
    btfss    Pulsador_1            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar_1    ; No. Espera que deje de pulsar.
Fin

    btfsc    Pulsador_2            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Fin2                ; No. Vuelve a leerlo.
    call    Retardo20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc    Pulsador_2            ; Comprueba si es un rebote.
    goto    Fin2                ; Era un rebote y sale fuera.
    bsf     Motor               ; Activa el motor y
    bsf     Led_2               ; enciende el Led 2 que significa
    call    Retardo10m          ; los 10 minutos encendido.
    bcf     Motor               ; Apaga el motor y
    bcf     Led_2               ; el Led 2.
EsperaDejePulsar_2
    btfss    Pulsador_2            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar_2    ; No. Espera que deje de pulsar.
Fin2

    btfsc    Pulsador_3            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Fin3                ; No. Vuelve a leerlo.
    call    Retardo20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc    Pulsador_3            ; Comprueba si es un rebote.
    goto    Fin3                ; Era un rebote y sale fuera.
    bsf     Motor               ; Activa el motor y
    bsf     Led_3               ; enciende el Led 3 que significa
    call    Retardo20m          ; los 10 minutos encendido.
    bcf     Motor               ; Apaga el motor y
    bcf     Led_3               ; el Led 3.
EsperaDejePulsar_3
    btfss    Pulsador_3            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar_3    ; No. Espera que deje de pulsar.
Fin3    goto    Principal

; Subrutinas ****************************************************************

Retardo20ms
            ;199993 cycles
    movlw    0x3E
    movwf    RAM_8
    movlw    0x9D
    movwf    RAM_9
Retardo20ms_0
    decfsz    RAM_8, f
    goto    $+2
    decfsz    RAM_9, f
    goto    Retardo20ms_0

            ;3 cycles
    goto    $+1
    nop

            ;4 cycles (including call)
    return

Retardo5m
            ;299999995 cycles
    movlw    0x54
    movwf    RAM_10
    movlw    0xA1
    movwf    RAM_11
    movlw    0xFD
    movwf    RAM_12
    movlw    0x02
    movwf    RAM_13
Retardo5m_0
    decfsz    RAM_10, f
    goto    $+2
    decfsz    RAM_11, f
    goto    $+2
    decfsz    RAM_12, f
    goto    $+2
    decfsz    RAM_13, f
    goto    Retardo5m_0

            ;1 cycle
    nop

            ;4 cycles (including call)
    return

Retardo10m
            ;599999992 cycles
    movlw    0xA9
    movwf    RAM_4
    movlw    0x41
    movwf    RAM_5
    movlw    0xFA
    movwf    RAM_6
    movlw    0x04
    movwf    RAM_7
Retardo10m_0
    decfsz    RAM_4, f
    goto    $+2
    decfsz    RAM_5, f
    goto    $+2
    decfsz    RAM_6, f
    goto    $+2
    decfsz    RAM_7, f
    goto    Retardo10m_0

            ;4 cycles
    goto    $+1
    goto    $+1

            ;4 cycles (including call)
    return

    cblock
    RAM
    RAM_1
    RAM_2
    RAM_3
    endc

Retardo20m
            ;1199999995 cycles
    movlw    0x54
    movwf    RAM_14
    movlw    0x82
    movwf    RAM_15
    movlw    0xF3
    movwf    RAM_16
    movlw    0x08
    movwf    RAM_17
Retardo20m_0
    decfsz    RAM_14, f
    goto    $+2
    decfsz    RAM_15, f
    goto    $+2
    decfsz    RAM_16, f
    goto    $+2
    decfsz    RAM_17, f
    goto    Retardo20m_0

            ;1 cycle
    nop

            ;4 cycles (including call)
    return

    END


En C se que el código es muchísimo menor. :D

Ánimos y adelante. Luego tengo qu eestudiar el código para analizarlo y entender el concepto.

Saludo.
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
rina
Asunto:  MensajePublicado: 21 Feb, 2014 - 04:53
Fanatico de la Electronica
Fanatico de la Electronica


Registrado: 14 Ago, 2005
Mensajes: 1894

la verdad que es un programa bastante simple, te podria ayudar salvo que yo suelo manejar el micro studio picbasic, mas que nada porque recuerdo mejor los comandos pero ue practicamente todos los compiladores ya sea C o basic son sumamente similares no hay uno mejor ni peor y casi quelos dos tienen las mismas cantidades de bibliotecas ya echas para manejar algunos circuitos mas complejos.

la verdad que que podria esplicarte el como adactarlo o incluso acer ese programa tan simple en picbasic. pero no creo que tenga tanta paciencia.. (lo siento) lo que si te puedo decir que no es necesario para nada el segundo integrado ic2 con un transistor de campo mosfet que seguro lo encuentras mas faclmente ya te baldria, ademas no va usar PWM tansolo si eso tmr0 estaria designado para los tiempos.

el programa ue pusiste en ams no esta nada mal y bien esplicado, pero es mejorable vastante mejorable y quedaria al final en un programa mas chico una vez compilado.

si quieres desarrollar el programa por tu cuenta te podria echar una mano a un que ya te digo que de memoria no me se los comandos del pic C. si quieres hacerlo en picbasic te podria echar una mano para empezar a manejarte asta con las escasas interructines que dispone el 16f84 que para empezar en el pundillo de los pic es un integrado ya muy versatil.

un cordial saludo
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
rina
Asunto:  MensajePublicado: 27 Feb, 2014 - 04:14
Fanatico de la Electronica
Fanatico de la Electronica


Registrado: 14 Ago, 2005
Mensajes: 1894

toy yo bueno contestar sin darme cuenta que era el señorito clasico meta. joer tio todavia te complicas con chorradillas asi.... y despues de tantos años (deve ser lo malo de estar esperando a encontrar algo ya echo gisado y comido)

un salido
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
Mostrar mensajes anteriores:     
Cambiar a:  
Todas las horas son GMT + 1 Hora
Publicar nuevo tema   Responder al tema
Ver tema anteriorEntre para ver sus mensajes privadosVer tema siguiente
 Índice de los Foros Electronica Facil » FOROS ELECTRONICA »  Microcontroladores PIC
powered by phppowered by MySQLPOWERED BY APACHEPOWERED BY CentOS© 2004 - 2017Información LegalPrensa