TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: MADKazuya en 13 de Agosto de 2009, 22:48:13
-
Antetodo, buenos dias a todos! :)
Soy un novato con muchas ganas de exprimir todo cuanto el maravilloso mundo PIC nos pueda dar, asi que me he hecho con un Pickit 2 starter kit de microchip, el mplab 8.10 y unos cuantos PIC 16F84A ( tambien el 16F690 ke venia con el kit, pero este me lo reservo para mas adelante hacer algun invento con PWM y leds RGB :lol:).
El caso es ke para comenzar keria hacer una secuencia de leds en particular, ke podriamos decir ke se parece a una barra de carga/descarga, aunke no sera esa su utilidad final, seguramente me hare entender mucho mejor asi :)
La idea es ke primero se encienda el primer led, luego el segundo (y se mantenga el primero), luego el tercero ( y se mantengan todos los anteriores) y asi sucesivamente hasta 5. He implementado el codigo en asm y consigo ke lo haga bien, incluido los retardos (gracias al fichero ke he encontrado en este mismo site, y el cual ha sido tremendamente util!). El problema esta en ke una vez encendidos todos los leds, reinicia de nuevo toda la serie, exactamente 7 veces mas, y luego se keda congelado con los leds encendidos (como deberia ser). Estoy completamente desesperado porke no kiero ke reinicie todo el programa! kiero ke se keden todos encendidos y de ahi no se muevan! por favor, ayudadme, no se ke mas hacer...y seguro ke es una tonteria...
Datos de interes: uso un cristal de cuarzo a 4MHz, con dos C de 22 pF, un regulador de 5v para alimentar el pic y leds normales, con sus correspondientes resistencias
Intentare pegar el codigo a continuacion (por favor, webmasters, si hay algo ke no haga bien, notifikenmelo y lo editare; soy nuevo :oops: :oops:)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Autor:Kazu
;
; Fecha:11 agosto 2009
;
; Version:1.0
;
; Titulo:Cluster control
;
; Descripcion:Encendido paulatino de agujas
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;***** VARIABLE DEFINITIONS
STATUS equ 03h ; Direccion del registro STATUS
TRISB equ 86h ; Direccion del registro triestado para el Puerto B.
PORTB equ 06h ; Direccion del Puerto B.
PDel0 equ 0Ch ; Primer contador para nuestros bucles de retardo.
PDel1 equ 0Dh ; Segundo contador para nuestros bucles de retardo.
PDel2 equ 0Eh
;**********************************************************************
;
;****Configuracion del Puerto****
clrwdt
bsf STATUS,5 ; Cambiamos al banco 1Switch to Bank 1
CLRF TRISB ; ...como salidas.
bcf STATUS,5 ; Volvemos al Banco 0.
CLRF PORTB
;****Encendido del LED RB7****
BSF PORTB,7 ; Transmitimos una senal alta al bit 7 del puerto B
call Retraso ; Llama la subrutina retraso y la ejecuta
;****Encendido del LED RB6****
BSF PORTB,6 ; Transmitimos una senal alta al bit 6 del puerto B
call Retraso ; Llama la subrutina retraso y la ejecuta
;****Encendido del LED RB5****
BSF PORTB,5 ; Transmitimos una senal alta al bit 5 del puerto B
call Retraso ; Llama la subrutina retraso y la ejecuta
;****Encendido del LED RB4****
BSF PORTB,4 ; Transmitimos una senal alta al bit 4 del puerto B
call Retraso ; Llama la subrutina retraso y la ejecuta
;****Encendido del LED RB3****
BSF PORTB,3 ; Transmitimos una senal alta al bit 3 del puerto B
;****Inicio del buble de retardo****
Retraso
movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;****Termina el Programa****
end ; Algunos compiladores necesitan esta instruccion.
Tb decir ke aunke use el template del mplab con los __config, #include, y demas, no hay diferencia alguna en el resultado, tarde mas o menos, siempre se reinicia. Parece como si se desbordase el programa...en fin, lo dejo en vuestras sabias manos...help, please!!!!
Muchisimas gracias de antemano :)
-
Bienvenido MADKazuya!
Después de:
Coloca un bucle infinito:
Revisa el siguiente link: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A (http://www.todopic.com.ar/foros/index.php?topic=24720.0)
Saludos!
-
Infinitas gracias Suky!!!!!!!!!!!!!!!!!!!!
Comprobado y funciona a las mil maravillas! :) se nota ke soy novato...como no lo habia pensado antes? :oops:
De todos modos, y con el fin de aprender mejor, como es ke pasaba eso ke se reiniciaba exactamente 7 veces? el WDT estaba desconectado y por programa no habia ningun goto de bucle. Ya se ke hay ke hacer ke el retardo el programa se lo salte, pero de todos modos ke es lo ke ha provocado ese loop no deseado?
Una vez mas, muchisimas gracias, no sabes el peso ke me acabas de kitar de encima! :-)
-
Hola:
El problema que tenes se da porque no hiciste un bucle con goto. Por esta razón el programa continuaba y ejecutaba la subrutina como si fuera parte del programa. Una vez finalizada la subrutina volvia con el return a la ultima direccion grabada en el stack interno, cosa que lo hacia inestable.
Por otra parte sugiero que empieces la programacion mas estructurada como corresponde de la siguiente manera
list=16F84
__Config (coloca aca los bits de configuracion)
include "pic16F84.inc"
pdel equ 0x0c
org 0x00
goto INICIO
org 0x04
(rutina de interrupcion)
INICIO
(aca coloca la configuracion de puertos, timers, etc)
LAZO
(aca el programa principal)
goto LAZO
end
Ademas te sugiero anular el watchdog desde la configuracion.
-
Gracias boser, lo tendre en cuenta :)
-
Recuerda hacer tus programas en un ciclo infinito.Asi nunca tendras esos problemas ni cosas extrañas ^^
-
Recuerda hacer tus programas en un ciclo infinito.Asi nunca tendras esos problemas ni cosas extrañas ^^
Importante esto!! no tenias ciclos, es como si le dijeras al pic que vaya a la tienda ( :D ) pero que no vaya por donde el sabe sino que tome callejones sin salida. por eso se queda estancado...
sigue programando mas cosas y no te desanimes con primeros tropiezos, con paciencia mucha paciencia y (ojo) LOGICA seras un excelente programador...
-
Gracias a todos por la ayuda. Lo cierto es que gracias a este foro estoy consiguiendo tirar mi proyecto adelante. Es un proyecto particularmente curioso, vistos los que por aqui desarrolais, ya que va enfocado a un cuadro de instrumentacion de un vehiculo corriente :mrgreen: En si es un proyecto ridiculamente sencillo, pero lo cierto es que en este mundillo sera (espero, si lo consigo finalizar) algo completamente novedoso.
Ahora que mi 16F84A ya hace todo lo que quiero sin despistes (ni irse a la tienda por caminos no deseados :mrgreen: :mrgreen: :mrgreen:) atacare a mi 16F690 y su PWM, a ver si consigo enterarme de como va.
Gracias de nuevo! :P