Ayuda Programa pic16f84A
Necesito hacer un programa para aprobar el curso y no tengo ni idea. es la ultima posibilidad que me dan. es en ensamblador. tiene 4 leds conectados que tienen que hacer esto:
no se enciende ninguno, luego1, luego 2, luego 3, luego 4, luego nada, luego 4, luego 3, luego 2, luego 1 y luego nada y asi sucesivamente. solo con el pic y con un intervalo entre encendido y encendido de 1 segundo... para mi es muy complicado, agradeceria que me ayuden..., que posteen alguna idea o me lo manden al correo. mil gracias
no se enciende ninguno, luego1, luego 2, luego 3, luego 4, luego nada, luego 4, luego 3, luego 2, luego 1 y luego nada y asi sucesivamente. solo con el pic y con un intervalo entre encendido y encendido de 1 segundo... para mi es muy complicado, agradeceria que me ayuden..., que posteen alguna idea o me lo manden al correo. mil gracias
Ok, entonces tienes 4 leds, digamos que los numeramos del 0 al 3, y los conectamos al puerto B en las salidas RB0, RB1, RB2 y RB3 respectivamente, cada led. Para encender un led unicamente tenemos que enviar un 1 logico a la salida correspondiente, por ejemplo, para activar el led 3 mandamos un 1 a RB3, ahora bien, eso como lo hacemos?... El puerto B puede tener hasta 8 salidas, si representamos cada salida con un bit tendremos entonces 8 bits para el puerto B
Puerto B 0 0 0 0 0 0 0 0
Bits 7 6 5 4 3 2 1 0
Solamente mandamos como salida una cadena de ceros y unos que sea igual a la secuencia que queremos obtener, por ejemplo:
Para tu secuencia 1 (todos apagados)
molw b'00000000' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
Para secuencia 2 (1 led prendido)
movlw b'00000001'
movwf PORTB ; se envian a puerto B
Para secuencia 3 (2 leds prendidos)
movlw b'00000011'
movwf PORTB ; se envian a puerto B
Para secuencia 4 (3 leds prendidos)
movlw b'00000111'
movwf PORTB ; se envian a puerto B
Para secuencia 5 (4 leds prendidos)
movlw b'00001111'
movwf PORTB ; se envian a puerto B
...
Y asi sucesivamente... todo es cuestion de poner un 1 en el led que deseas prender y un 0 en la posicion del led que deseas apagar...
para repetir la secuencia solo necesitas un salto:
secuencia
molw b'00000000' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo
molw b'00000001' ; se prende el led conectado a RB0
movwf PORTB ; se envian a puerto B
call retardo
molw b'00000011' ; se prenden leds de RB0 y RB1
movwf PORTB ; se envian a puerto B
call retardo
molw b'00000111' ; se prenden leds RB0, RB1 y RB2
movwf PORTB ;
molw b'00001111' ; se prenden leds RB0, RB1, RB2, RB3
movwf PORTB ; se envian a puerto B
call retardo
goto secuencia
No esta todo completo, falta agregar la segunda secuencia (de 4,3,2,1 0), ni la funcion de retardo...
Espero te sirva de algo
Puerto B 0 0 0 0 0 0 0 0
Bits 7 6 5 4 3 2 1 0
Solamente mandamos como salida una cadena de ceros y unos que sea igual a la secuencia que queremos obtener, por ejemplo:
Para tu secuencia 1 (todos apagados)
molw b'00000000' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
Para secuencia 2 (1 led prendido)
movlw b'00000001'
movwf PORTB ; se envian a puerto B
Para secuencia 3 (2 leds prendidos)
movlw b'00000011'
movwf PORTB ; se envian a puerto B
Para secuencia 4 (3 leds prendidos)
movlw b'00000111'
movwf PORTB ; se envian a puerto B
Para secuencia 5 (4 leds prendidos)
movlw b'00001111'
movwf PORTB ; se envian a puerto B
...
Y asi sucesivamente... todo es cuestion de poner un 1 en el led que deseas prender y un 0 en la posicion del led que deseas apagar...
para repetir la secuencia solo necesitas un salto:
secuencia
molw b'00000000' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo
molw b'00000001' ; se prende el led conectado a RB0
movwf PORTB ; se envian a puerto B
call retardo
molw b'00000011' ; se prenden leds de RB0 y RB1
movwf PORTB ; se envian a puerto B
call retardo
molw b'00000111' ; se prenden leds RB0, RB1 y RB2
movwf PORTB ;
molw b'00001111' ; se prenden leds RB0, RB1, RB2, RB3
movwf PORTB ; se envian a puerto B
call retardo
goto secuencia
No esta todo completo, falta agregar la segunda secuencia (de 4,3,2,1 0), ni la funcion de retardo...
Espero te sirva de algo
Hola te voy a escribir un pequeño codigo para a ver si te ayuda, es parte de lo que tu quieres hacer pero lo unico que tienes que hacer tu es ponerle los valores a los registros RET1 y RET2 para conseguir el retardo de 1 seg. No se si con 2 registros te sale 1 seg, a lo mejor necesitas un 3 registro.
Hay va el codigo que le tengo puesto de titulo Pendulo.
;-----------------------------------PENDULO.asm--------------------------------
Listp=16F84A
ESTADO equ 0x03
PORTB equ 0x06
RET1 equ 0x0C
RET2 equ 0x0D
;--------------------------------CONFIGURACION--------------------------------
bsf ESTADO,5 ;Pasamos a pagina 1
movlw 0F ;Configuramos RB0 hasta RB3 ;como salida
movwf PORTB
bcf ESTADO,5 ;Pasamos a pagina 0
;-----------------------------PROGRAMA----------------------------------------
Comienzo
clrf PORTB
bsf PORTB,0
call Retardo
Rot_Izq
rlf PORTB
call Retardo
btfss PORTB,4
goto Rot_Izq
Rot_Der
rrf PORTB
call Retardo
btfss PORTB,0
goto Rot_Der
goto Comienzo
;-------------------------------SUBRUTINAS-----------------------------------
Retardo
decfsz RET1,1
goto Retardo
decfsz RET2,1
goto Retardo
return
end
ESPERO QUE TE SIRVA DE AYUDA ESTE PEQUEÑO CODIGO SI NO ENTIENDES ALGO ENVIAME UN CORREO A [email protected] Y TE INTENTARE AYUDAR EN LO QUE PUEDA.
Hay va el codigo que le tengo puesto de titulo Pendulo.
;-----------------------------------PENDULO.asm--------------------------------
Listp=16F84A
ESTADO equ 0x03
PORTB equ 0x06
RET1 equ 0x0C
RET2 equ 0x0D
;--------------------------------CONFIGURACION--------------------------------
bsf ESTADO,5 ;Pasamos a pagina 1
movlw 0F ;Configuramos RB0 hasta RB3 ;como salida
movwf PORTB
bcf ESTADO,5 ;Pasamos a pagina 0
;-----------------------------PROGRAMA----------------------------------------
Comienzo
clrf PORTB
bsf PORTB,0
call Retardo
Rot_Izq
rlf PORTB
call Retardo
btfss PORTB,4
goto Rot_Izq
Rot_Der
rrf PORTB
call Retardo
btfss PORTB,0
goto Rot_Der
goto Comienzo
;-------------------------------SUBRUTINAS-----------------------------------
Retardo
decfsz RET1,1
goto Retardo
decfsz RET2,1
goto Retardo
return
end
ESPERO QUE TE SIRVA DE AYUDA ESTE PEQUEÑO CODIGO SI NO ENTIENDES ALGO ENVIAME UN CORREO A [email protected] Y TE INTENTARE AYUDAR EN LO QUE PUEDA.
que te parece esto haber si le entiendes me imagino que viendo el codigo entenderas mas =D
;---------------Encabezado-------------
radix hex
;------------Mapa de memoria---------
estado equ 0x03 ; Haciendo asignaciones
TRISB equ 0x06
PORTB equ 0x06
reg1 equ 0x0C ; Estos 3 registros los utilizaré
reg2 equ 0x0D ; para hacer el retardo
reg3 equ 0x0E
;-------Configuración de puertos-------
org 0
inicio bsf estado,5 ; pone rp0 a 1 y pasa al banco1
movlw b\'00000000\' ; carga W con 00000000
movwf TRISB ; y pasa el valor a trisb
bcf estado,5 ; pone rp0 a 0 y regresa al banco0
;-------Aqui encienden los LEDS------
secuencia movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000001\' ; Enciende RB0
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000010\' ; Enciende RB1
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000100\' ; Enciende RB2
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00001000\' ; Enciende RB3
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00010000\' ; Enciende RB4
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; se prenden leds RB0, RB1 y RB2
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00100000\' ; Enciende RB5
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'01000000\' ; Enciende RB6
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; se prende el led conectado a RB0
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'10000000\' ; Enciende RB7
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
goto secuencia ; Busca a Secuencia
;-----------Rutina de Retardo-----------
retardo movlw 1 ; Aquí se cargan los registros
movwf reg1 ; reg1, reg2 y reg3 con los valores 10, 20 y 30
tres movlw 2 ; respectivamente
movwf reg2 ; Decrementos
dos movlw 3 ; Decrementos
movwf reg3 ; Decrementos
uno decfsz reg3,1 ; Aquí se comienza a decrementar
goto uno ; Cuando reg3 llegue a 0
decfsz reg2,1 ; le quitare 1 a reg2
goto dos ; cuando reg2 llegue a 0
decfsz reg1,1 ; le quitare 1 a reg1
goto tres ; cuando reg1 llegue a 0
retlw 00 ; regresare al lugar de donde se hizo la llamada
;-----------Final----------------
End ;indica que acabo el programa
;--------------------------------------
;---------------Encabezado-------------
radix hex
;------------Mapa de memoria---------
estado equ 0x03 ; Haciendo asignaciones
TRISB equ 0x06
PORTB equ 0x06
reg1 equ 0x0C ; Estos 3 registros los utilizaré
reg2 equ 0x0D ; para hacer el retardo
reg3 equ 0x0E
;-------Configuración de puertos-------
org 0
inicio bsf estado,5 ; pone rp0 a 1 y pasa al banco1
movlw b\'00000000\' ; carga W con 00000000
movwf TRISB ; y pasa el valor a trisb
bcf estado,5 ; pone rp0 a 0 y regresa al banco0
;-------Aqui encienden los LEDS------
secuencia movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000001\' ; Enciende RB0
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000010\' ; Enciende RB1
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000100\' ; Enciende RB2
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00001000\' ; Enciende RB3
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00010000\' ; Enciende RB4
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; se prenden leds RB0, RB1 y RB2
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00100000\' ; Enciende RB5
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; las 8 salidas en 0 logico
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'01000000\' ; Enciende RB6
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'00000000\' ; se prende el led conectado a RB0
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
movlw b\'10000000\' ; Enciende RB7
movwf PORTB ; se envian a puerto B
call retardo ; llama al ciclo de retardo
goto secuencia ; Busca a Secuencia
;-----------Rutina de Retardo-----------
retardo movlw 1 ; Aquí se cargan los registros
movwf reg1 ; reg1, reg2 y reg3 con los valores 10, 20 y 30
tres movlw 2 ; respectivamente
movwf reg2 ; Decrementos
dos movlw 3 ; Decrementos
movwf reg3 ; Decrementos
uno decfsz reg3,1 ; Aquí se comienza a decrementar
goto uno ; Cuando reg3 llegue a 0
decfsz reg2,1 ; le quitare 1 a reg2
goto dos ; cuando reg2 llegue a 0
decfsz reg1,1 ; le quitare 1 a reg1
goto tres ; cuando reg1 llegue a 0
retlw 00 ; regresare al lugar de donde se hizo la llamada
;-----------Final----------------
End ;indica que acabo el programa
;--------------------------------------