Pasar del PIC16F84A a Arduino UNO r3

Hola:


http://www.subeimagenes.com/img/router-zyxel-850073.png

Partiendo de este esquema, es un PIC16F84A escrito en ensamblador y quiero pasarlo a C con arduino UNO r3. 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. :slight_smile:

No estoy familiarizado en C sobre 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 o sentido.

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 funcionamiento debe ser así ya que en el asm no me sale.

Al darle fuente alilmentación a Arduino UNO r3, 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 lo que quiero decir. El Pulsdor 4 es el Stop. Si el motor está activo y Led, detiene el motor y Led. El Reset resetea el Arduino 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.

;

;
; 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. :smiley:

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

Saludo.

No me queda clara la pregunta...

¿estas pidiendo que te traduzcamos el programa en ASM del pic a lenguaje C de arduino?

Si es esto no hace falta que lo pidas, tu mismo coges el ejemplo blink without delay del IDE y lo aplicas a temporizaciones que quieras, y el resto son solo ordenes tipo digitalwrite para activar el motor y encender leds y luego digitaread para leer pulsadores.

Lo de traducir el asembler de pic, olvidate... no tiene nada que ver, simplemente reescribe el codigo desde cero y punto.

Yo adapte una libreria en C18 de pic a codigo de arduino y me costo lo suyo y no tenia nada que ver...

De ASM ya ni me acuerdo, pues programaba la serie OTP 16C5x o sea... calcula lo que ha llovido desde entonces...

Ah, se me olvidaba, algun condensador de desacoplo en alimentacion para el L293 no estaria mal (tambien pienso que es prescindible, yo emplearia un transistor de potencia) y las resistencias de pullup de los pulsadores, salvo que sea un ambiente muy ruidoso en interferencias me las ahorraba usando las internas de pullup del arduino.

Hola:

Lo del asm para que vean lo que he hecho y se entienda, y si, mejor desde cero, si no te vuelves loco. :grin:

Me olvidé de hasta poner condensador en el propio motor dc.


Ver esquema nuevo.

Lista de componentes:

Resistencias:
R1, R2, R3, R4, R5 = 10 K - 1/4W.
R7, R8, R9 = 330 Ohm - 1/4 W.
R6 = 100 Ohm - 1/4 W.

Condensadores:
C1, C2 = 22 pF / 6V
C3,C5 = 100 nF / 6V
C4 = 250 n / 16V

Diodos:
D1, D2, D3 = Led de 3 ó 5 mm color rojo, verde o naranja. 2V/25 mA.

Oscilador de cuarzo:
X1 = 4 MHz

Circuitos integrados:
IC1 = PIC16F84A-04
IC2 = L293D

Otros componentes:
Z1 = Zócalo de 18 pines.
Z2 = Zócalo de 16 pines.
M1 = Motor DC 12 V.
5 micropulsadores.

En Arduino UNO r3 este es su montaje.

Ver esquema compelto.
Aún no estoy muy familiarizado con el Arduino, y me cuesta más el C de este que el asm de los clácios PIC de toda la vida. :wink: Eso si, asm ya agota, hay que ir a por lo nuevo y cómodo para acabar antes.

Voy a intenar programarlo. A los entusiastas pueden programarlo y poner su código, luego se analiza paso a paso. También se puede sugerir para mejorarlo.

Cualquier sugerencia es bienvenida.