TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: ralcesar en 01 de Septiembre de 2008, 11:52:06
-
Hola tengo que hacer un programa básico de pic y no tengo ni idea como hacerlo ...
Tengo 4 entradas (combinaciones binarias) y tengo q prender un led cada vez que el nº decimal correspondiente en la entrada sea par (2,4,6,8,10,12 y 14)
Ya se como definir los puertos como entrada y salida, puedo programar una función de karnaught en código para que la realice el pic ?
Sino, como puedo realizar este practico? son 7 numeros asi que pense en realizar 7 sub-funciones (creo q el pic se banca hasta 8) y en cada una realizar una comparación y utilizar el bit Z del STATUS apra prender o no el led, pero no tengo bien claro como serian los returns de las funciones, ademas de que me aprece muyyy engorroso y poco practico.-
Eso es todo, gracias al que me tire una idea de como realizarlo
-
Hola ralcesar
Bienvenido a Todopic!!!
en que lenguaje de programación piensas desarrollar el trabajo? para mas ayuda seria bueno que subas el esquematico que estás utilizando.- Creo que lo mas conveniente seria hacer comparacion para ver cual es par, si programas en basic puedo ayudarte de lo contrario no faltará alguien que te dé una mano.-
saludos
Hernán
-
Bienvenido ralcesar.
Además de lo que comenta doppel, yo creo que sólo tendrías que comprobar la entrada del bit menos significativo y, siempre que sea 0, el número será par (si consideramos también par el 0) y encenderás el LED.
-
Gracias por responder
Tengo que hacerlo usando MPLAB, el problema es que en en la consigna del ej, el numero 0 no es tomado como par
-
Versión Básica:
ciclo movf PORTA,W
andlw 0x0F
btfsc STATUS,Z
goto Apaga
btfsc PORTA,0
goto Apaga
Enciende
bsf PORTB,0
goto ciclo
Apaga
bcf PORTB,0
goto ciclo
Versión mejorada:
ciclo movf PORTA,W
andlw 0x0F
btfss STATUS,Z
btfsc PORTA,0
goto Apaga
Enciende
bsf PORTB,0
goto ciclo
Apaga
bcf PORTB,0
goto ciclo
Versión mejorada alternativa 1:
ciclo rrf PORTA,W
movf PORTA,W
andlw 0x0F
btfss STATUS,C
btfsc STATUS,Z
goto Apaga
Enciende
bsf PORTB,0
goto ciclo
Apaga
bcf PORTB,0
goto ciclo
-
guaaa muchas gracias por el codigo :mrgreen: :-/
no sabia que podia trabajar con bit individual del porta, yo pense que lei todos juntos y despues tendria que guardarlo en otro registro
muchas gracias
-
Bueno, gracias por el código, este es el programa final por si alguien alguna vez busca algo similar
;*****************************************************************;
;********* Trabajo Practico Nº 6 - Tecnicas Digitales II *********;
;****************** Oviedo Codigoni, Raúl ************************;
;*****************************************************************;
; Mostrar a través de LEDs, las distintas entradas pares de cuatro;
; puertos programados como entrada, el cero no es considerado como;
; par
;*****************************************************************;
list p=16f84
include <p16f84.inc>
;********************** Definición de Variables ******************;
PORTA EQU 0x05
PORTB EQU 0x06
STATUS EQU 0x03
TRISA EQU 0x85
TRISB EQU 0x86
;********************* Código de Programa ***********************;
org 0x00
bcf STATUS,5 ; trabajo en el banco 0, el bit 5 es el RPO
clrf PORTA ; inicializo el puertoA
bsf STATUS,5 ; voy a trabajar en el banco 1
movlw 0x0F ; cargo en W 15 en hexa q seria 1111 en binario
; para setear los puertos como entrada
movwf TRISA ; seteo los puertos como entrada
bcf STATUS,5
goto Ciclo
Ciclo movf PORTA,W ; leo el reguistro en el puerto A y lo guardo en W
andlw 0x0F ; multiplico W por 1111
btfsc STATUS,2 ; bit 2 es el Z (bit.test.fire.skip.clear) analizo el bit Z del registro
; Status si es cero la operacion es distinta de cero, por lo que podria ser
; un nº par, caso contrario (no salta) y se va por el goto a "Apaga"
goto Apaga
btfsc PORTA,0 ; si el LSB es igual a 0, osea un nº par, salta el goto
goto Apaga
Enciende
bsf PORTB,0 ; (bit.set) pongo un 1 en el pin 0 del puerto B, q es el que va con el
; led
goto Ciclo ; vuelvo a Ciclo, para seguir sensando las entradas
Apaga
bcf PORTB,0 ; (bit.clear) pongo un 0 en el pin 0 del puerto B
goto Ciclo
END
-
Hola Ralcesar, incluso puedes reemplazar el número de bit por su nombre en el programa, ya que el MPASM los reconoce, te doy un ejemplo:
Donde pones:
bcf STATUS,5 ; trabajo en el banco 0, el bit 5 es el RPO
puedes poner también:
bcf STATUS,RP0 ; trabajo en el banco 0, el bit 5 es el RPO
igual con:
btfsc STATUS,2 ; bit 2 es el Z (bit.test.fire.skip.clear) analizo el bit Z del registro
puedes hacerlo:
btfsc STATUS,Z ; bit 2 es el Z (bit.test.fire.skip.clear) analizo el bit Z del registro
saludos!!
-
Eso puse al principio pero el MPLAB me lo marcaba como un error por no estar definidos
-
Prueba los nombres de los registros en mayúsculas, también el título del include puede variar pon la "P" y la "F" del include <p16f84.inc> en mayúsculas,
osea include <P16F84.inc>.
En RP0 OJO que es un 0 (cero) y no una O (letra)
Saludos!!
Agrego: Compila y cualquier cosa nos pasas el archivo .err que te genera el MPLAB y vemos cual es el problema.
-
Ok voy a seguir probando para ver que anda y que no. Pero el que postié está andando perfecto