Ayuda Programa pic16f84A

laguia19
16 de Mayo del 2006
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

Duarte
16 de Mayo del 2006
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



creosote
16 de Mayo del 2006
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.

Kraxyny[INVITADO]
16 de Mayo del 2006
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
;--------------------------------------

kraxyny[INVITADO]
16 de Mayo del 2006
ups se me olvido que querias 4led´s y yo puse 8 jajaj bueno nimodo XD