TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: ralcesar en 01 de Septiembre de 2008, 11:52:06

Título: Ayuda, pic16f84 prender led
Publicado 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
Título: Re: Ayuda, pic16f84 prender led
Publicado por: doppel en 01 de Septiembre de 2008, 13:09:33
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
Título: Re: Ayuda, pic16f84 prender led
Publicado por: jfmateos2 en 01 de Septiembre de 2008, 13:29:15
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.
Título: Re: Ayuda, pic16f84 prender led
Publicado por: ralcesar en 01 de Septiembre de 2008, 16:22:46
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
Título: Re: Ayuda, pic16f84 prender led
Publicado por: BrunoF en 01 de Septiembre de 2008, 23:47:24
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
Título: Re: Ayuda, pic16f84 prender led
Publicado por: ralcesar en 02 de Septiembre de 2008, 00:00:13
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
Título: Re: Ayuda, pic16f84 prender led
Publicado por: ralcesar en 02 de Septiembre de 2008, 14:22:00
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
Título: Re: Ayuda, pic16f84 prender led
Publicado por: flacoclau en 02 de Septiembre de 2008, 15:11:13
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!!
Título: Re: Ayuda, pic16f84 prender led
Publicado por: ralcesar en 02 de Septiembre de 2008, 15:18:20
Eso puse al principio pero el MPLAB me lo marcaba como un error por no estar definidos
Título: Re: Ayuda, pic16f84 prender led
Publicado por: flacoclau en 02 de Septiembre de 2008, 15:26:45
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.
Título: Re: Ayuda, pic16f84 prender led
Publicado por: ralcesar en 02 de Septiembre de 2008, 19:37:32
Ok voy a seguir probando para ver que anda y que no. Pero el que postié está andando perfecto