TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: yukardo en 24 de Mayo de 2008, 13:42:41

Título: Problema con programa
Publicado por: yukardo en 24 de Mayo de 2008, 13:42:41
Saludoss.

Estoy diseñando un pequeño organo, para ello empece a realizar una pequeña prueba. Pero el programa no me funciona como deberia. Me gustaria saber donde esta el error.

aqui esta el programa hice:

TRISIO=%00111110
A VAR BIT
B VAR BIT
C VAR BIT
D VAR BIT
main:
PEEK GPIO.1,A
PEEK GPIO.2,B
PEEK GPIO.4,C
PEEK GPIO.5,D
if A=0 THEN
GOSUB LA
ENDIF
IF B=0 THEN
GOSUB SI
ENDIF
IF C=0 THEN
GOSUB DO
ENDIF
IF D=0 THEN
GOSUB RE
ENDIF
GOTO MAIN
LA:
while A=0
freqout GPIO.0,1,440
WEND
RETURN
SI:
WHILE B=0
FREQOUT GPIO.0,1,494
WEND
RETURN
DO:
WHILE C=0
FREQOUT GPIO.0,1,262
WEND
RETURN
RE:
WHILE D=0
FREQOUT GPIO.0,1,294
WEND
RETURN

estoy usando el micro 12F675.

Tambien adjunto el circuito con el que estoy probando dicho programa.

Gracias por su ayuda de antemano.

Título: Re: Problema con programa
Publicado por: Chrisbaf en 24 de Mayo de 2008, 18:43:00
que es lo  que no hace tu programa
Título: Re: Problema con programa
Publicado por: yukardo en 24 de Mayo de 2008, 19:45:18
Se mantiene produciendo un sonido y al oprimir los pulsadores no pasa, nada no cambia el sonido. De echo el no deberia sonar a menos que sea oprimido algun pulsador.
Título: Re: Problema con programa
Publicado por: Chrisbaf en 24 de Mayo de 2008, 21:26:00
seria posible que pongas el esquema en formato de isis solo para que sea mas facil revisarlo, la proxima vez gracias
Título: Re: Problema con programa
Publicado por: Chrisbaf en 24 de Mayo de 2008, 21:42:06
chequea gp3 esta directo a la fuente
Título: Re: Problema con programa
Publicado por: yukardo en 24 de Mayo de 2008, 21:57:35
si conecto MCLR a la fuente y pasa eso. si no lo conecto no suena. Mañana coloco el archivo de proteus. lo tengo en otra PC.
Título: Re: Problema con programa
Publicado por: Chrisbaf en 26 de Mayo de 2008, 01:33:22
estuve chequeando tu programa y agregue la configuracion para inicializar el pic, ademas apague los comparadores y coloque todas las entradas digitales  lo probe y ya me funciono, aqui te dejo el codigo, creeme que yo tambien estoy aprendiendo. saludos, si no declaras wdt off el proteus te resetea a cada momento el pic. saludos :-/

        @ DEVICE pic12F675, INTRC_OSC_NOCLKOUT
                ' System Clock Options (Internal)       
        @ DEVICE pic12F675, WDT_oFF
                ' Watchdog Timer
        @ DEVICE pic12F675, PWRT_ON
                ' Power-On Timer
        @ DEVICE pic12F675, MCLR_OFF
                ' Master Clear Options (Internal)
        @ DEVICE pic12F675, BOD_ON
                ' Brown-Out Detect
        @ DEVICE pic12F675, CPD_OFF
                ' Data Memory Code Protect
        @ DEVICE pic12F675, PROTECT_OFF

TRISIO=%00111110
CMCON = 7 ' apaga comparadores
ANSEL = 0  ' setea todo digital
SYMBOL A = GPIO.1 
SYMBOL b = GPIO.2 
SYMBOL c = GPIO.4 
SYMBOL d = GPIO.5

main:

if A=0 THEN
GOSUB LA
ENDIF
IF B=0 THEN
GOSUB SI
ENDIF
IF C=0 THEN
GOSUB DO
ENDIF
IF D=0 THEN
GOSUB RE
ENDIF
GOTO MAIN
LA:
while A=0
freqout GPIO.0,1,440
WEND
RETURN
SI:
WHILE B=0
FREQOUT GPIO.0,1,494
WEND
RETURN
DO:
WHILE C=0
FREQOUT GPIO.0,1,262
WEND
RETURN
RE:
WHILE D=0
FREQOUT GPIO.0,1,294
WEND
RETURN

Título: Re: Problema con programa
Publicado por: yukardo en 26 de Mayo de 2008, 16:28:05
Muchas gracias ese era el error.

Aunque a mi el programa no me corre perfectamente al oprimir cualquier pulsador se me queda en la nota y no cambia.  Nose si a ti te paso.
Título: Re: Problema con programa
Publicado por: yukardo en 26 de Mayo de 2008, 16:53:21
TRISIO=%00111110
CMCON=%00000111
ANSEL=%00000000
A VAR BIT
B VAR BIT
C VAR BIT
D VAR BIT

main:
PEEK GPIO.1,A
PEEK GPIO.2,B
PEEK GPIO.4,C
PEEK GPIO.5,D

if a=0 then
freqout GPIO.0,1,440
endif
IF B=0 THEN
FREQOUT GPIO.0,1,494
ENDIF
IF C=0 THEN
FREQOUT GPIO.0,1,262
ENDIF
IF D=0 THEN
FREQOUT GPIO.0,1,294
ENDIF
GOTO MAIN

Asi me quedo la modificación del programa. Tiene un detalle cuando oprimo el pulsador C se queda pegado en esa nota y nose porque.
Título: Re: Problema con programa
Publicado por: Chrisbaf en 26 de Mayo de 2008, 17:58:43
cuando corro tu programa y agrego las modificaciones si me da ese efecto  pero cuando lo corro exactamente como te mostre usando symbol para definir entradas si me corre bien. Yo renombre con symbol las entradas y no use peek y si me corre bien las 4 entradas y no se me queda con ese efecto que me dices. saludos
Título: Re: Problema con programa
Publicado por: yukardo en 26 de Mayo de 2008, 18:50:23
nose cual es la diferencia pero como tu dices si funciona. muchas gracias.
Título: Re: Problema con programa
Publicado por: yukardo en 27 de Mayo de 2008, 11:14:15
cambie el codigo para agregarle mas notas.

Ahora tengo el siguiente codigo:

TRISIO=%00001000
CMCON=%00000111
ANSEL=%00000000

SYMBOL ENT = GPIO.3
A VAR GPIO.1
B VAR GPIO.2
C VAR GPIO.4
D VAR GPIO.5

main:
A=0
B=0
C=0
D=0
if (A=0)and(B=0)AND(C=0)AND(D=0)AND(ENT=0) THEN
FREQOUT GPIO.0,1,262 'DO
ENDIF
HIGH A
IF (A=1)AND(B=0)AND(C=0)AND(D=0)AND(ENT=0) THEN
freqout GPIO.0,1,277 'DO#
ENDIF
LOW A
HIGH B
IF (A=0)AND(B=1)AND(C=0)AND(D=0)AND(ENT=0) THEN
freqout GPIO.0,1,294 'RE
ENDIF
HIGH A
IF (A=1)AND(B=1)AND(C=0)AND(D=0)AND(ENT=0) THEN
freqout GPIO.0,1,311 'RE#
ENDIF
LOW A
LOW B
HIGH C
IF (A=0)AND(B=0)AND(C=1)AND(D=0)AND(ENT=0) THEN
freqout GPIO.0,1,330 'MI
ENDIF
HIGH A
IF (A=1)AND(B=0)AND(C=1)AND(D=0)AND(ENT=0) THEN
freqout GPIO.0,1,349 'FA
ENDIF
LOW A
HIGH B
IF (A=0)AND(B=1)AND(C=1)AND(D=0)AND(ENT=0) THEN
freqout GPIO.0,1,370 'FA#
ENDIF
HIGH A
IF (A=1)AND(B=1)AND(C=1)AND(D=0)AND(ENT=0) THEN
freqout GPIO.0,1,392 'SOL
ENDIF
LOW A
LOW B
LOW C
HIGH D
IF (A=0)AND(B=0)AND(C=0)AND(D=1)AND(ENT=0) THEN
freqout GPIO.0,1,415 'SOL#
ENDIF
HIGH A
IF (A=1)AND(B=0)AND(C=0)AND(D=1)AND(ENT=0) THEN
freqout GPIO.0,1,440 'LA
ENDIF
LOW A
HIGH B
IF (A=0)AND(B=1)AND(C=0)AND(D=1)AND(ENT=0) THEN
freqout GPIO.0,1,466 'LA#
ENDIF
HIGH A
IF (A=1)AND(B=1)AND(C=0)AND(D=1)AND(ENT=0) THEN
freqout GPIO.0,1,494 'SI
ENDIF
GOTO MAIN

pero no me compila me da el siguiente error: address limit of 3ffh exceeded

Título: Re: Problema con programa
Publicado por: mancupic en 27 de Mayo de 2008, 13:34:30
Sobre pasaste el maximo de memoria, address limit of 3ffh exceeded, yo no programo en c, pero si en pbp y me tira ese herror cuando supero la capacidad de memoria... creo que ese pic tiene hasta 1K de flash... trata de ir quitando sentencias, hasta que entre... (Por lo menos para ver si este es el verdadero motivo)
Título: Re: Problema con programa
Publicado por: Chrisbaf en 27 de Mayo de 2008, 21:31:06
tienes razon mancupic ese es el problema.
Título: Re: Problema con programa
Publicado por: yukardo en 28 de Mayo de 2008, 14:00:12
si ese era el problema. muchas gracias.
Título: Re: Problema con programa
Publicado por: mancupic en 28 de Mayo de 2008, 16:45:47
Hola, no se mucho de C, pero por lo visto no es muy diferente a PBP, si no estas apurado... creo que puedo darte una idea... ahora estoy trabajando, pero cuando llegue a casa veo de hacer un diagrama de flujo para simplificar tu programa, de tal manera que puedas hacerlo entrar en la memoria del micro y te sobre espacio para agregarle si queres mas funciones... Ya tengo una idea de como hacerlo, asi que si queres luego te lo explico, por ahora lo unico que te puedo adelantar es que po lo que veo, la diferencia entre una sentencia y la otra es el valor de la frecuencia a emitir, por lo tanto fijate de  poner algo asi:

donde VAR es una variable dinamica:
(O como sea en C )

*--------------------------------------------------------------------------------*
inicio:
    IF (A=0)and(B=0)AND(C=0)AND(D=0)AND(ENT=0) THEN
         Var := 440
    endif
     IF (A=1)AND(B=0)AND(C=0)AND(D=1)AND(ENT=0) THEN
         Var := 262
     endif
     IF (A=1)AND(B=1)AND(C=0)AND(D=1)AND(ENT=0) THEN
         Var := 402
     endif
     call emitir
goto inicio

emitir:
         freqout GPIO.0,1, VAR
Return

*--------------------------------------------------------------------------------*


Como (, freqout GPIO.0,1 , Var) es siempre igual, y lo unico que se modifica es VAR, entonces usa los if los usas solo para modificar el valor de var y no repetir (, freqout GPIO.0,1,var ,)
De esta manera evitas repetir siempre la misma sentencia y no malgastas la memoria del microcontrolador....

Bueno, alfinal creo que te explique todo ahora....

No me dejes con la intriga, contame como te fue...

Saludos! 
Título: Re: Problema con programa
Publicado por: mancupic en 28 de Mayo de 2008, 16:48:37
  :? Ojo, fijate que lo mio no es el C, una de esas tenes que adaptarlo ,  :-) Pero la ideaq es esa...
Título: Re: Problema con programa
Publicado por: yukardo en 29 de Mayo de 2008, 20:35:59
Nose porque dices que eso es C si es PicBasic.

Por otro lado tu idea fue buena yo lo habia pensado pero no sabia que se podia poner como variable la frecuencia. Bueno hice la modificacion lo probe y sigue superando el limite de la memoria.

Otra cosa es que en proteus a mis circuitos con micros siempre le tengo que colocar el MCLR a 5 V nose como puedo hacer para que sea una entrada como tal.

Gracias por tu ayuda
Título: Re: Problema con programa
Publicado por: navaismo en 29 de Mayo de 2008, 21:18:37

Otra cosa es que en proteus a mis circuitos con micros siempre le tengo que colocar el MCLR a 5 V nose como puedo hacer para que sea una entrada como tal.

Gracias por tu ayuda


Pues desactivas el MCLR en el fuse. Y con eso se hara I/O
Título: Re: Problema con programa
Publicado por: yukardo en 30 de Mayo de 2008, 12:33:03
gracias con eso solucione el problema
Título: Re: Problema con programa
Publicado por: mancupic en 30 de Mayo de 2008, 14:43:34
 :-/ Bien!
Pero aun no solucionamos el tema de la memoria... Fijate si pedes hacer algo asi:

inicio:
         if gpio = 000111 then  Var = 440
         if gpio = 000011 then  Var = 420
         if gpio = 001111 then  Var = 500
         call emitir
goto inicio

emitir:
         freqout GPIO.0,1, VAR
Return

end

La idea es:
    No ponerle  nombres a los puertos.
    Evitar el uso de las sentencias AND.
    Evitar el uso del endif.
Para:
    Permitirle al compilador, compilar  :D el programa sin usar las librerias de compuertas...
    Lo de evitar el endif, es solo por una cuestion de orden, el compilador sabe que si solo hay una sentencia sedpues del if, la misma se ejecuta dentro de si mismo y no la que le sigue. Cuando usas mas de una sentencia, es necesario usar el endif.

Suerte! :lol:
Título: Re: Problema con programa
Publicado por: yukardo en 30 de Mayo de 2008, 17:51:08
bueno en vista del problema de la memoria opte por solo usar las 7 notas musicales y sus octavas con lo cual hice este programa.

@ DEVICE pic12F675, MCLR_OFF
                ' Master Clear Options (Internal)

TRISIO=%00001000
CMCON=%00000111
ANSEL=%00000000
symbol ENT = GPIO.3
symbol SEL=GPIO.5
A VAR GPIO.1
B VAR GPIO.2
C VAR GPIO.4

FREQ VAR WORD

main:
A=0
B=0
C=0

FREQ = 0

if (A=0)and(B=0)AND(C=0)AND(ENT=0) THEN
FREQ=262 'DO
ENDIF


HIGH a
IF (A=1)AND(B=0)AND(C=0)AND(ENT=0) THEN
FREQ=294 'RE
ENDIF

LOW A
high B
IF (A=0)AND(B=1)AND(C=0)AND(ENT=0) THEN
freq=330 'MI
ENDIF

HIGH A
high b
IF (A=1)AND(B=1)AND(C=0)AND(ENT=0) THEN
freq=349 'FA
ENDIF

LOW A
low B
IF (A=0)AND(B=0)AND(C=1)AND(ENT=0) THEN
freq=392 'SOL
ENDIF

HIGH A
high c
IF (A=1)AND(B=0)AND(C=1)AND(ENT=0) THEN
freq=440 'LA
ENDIF

LOW A
HIGH B

IF (A=0)AND(B=1)AND(C=1)AND(ENT=0) THEN
freq=494 'SI
ENDIF

CALL sonido
GOTO MAIN


sonido:
if sel=0 then
freq=freq*2
endif
while ENT=0
FREQOUT GPIO.0,1,FREQ
WEND
RETURN

el problema es q no me corre en el proteus nose porq parece que es un problema en el 74ls151 que estoy usando.
Título: Re: Problema con programa
Publicado por: yukardo en 03 de Junio de 2008, 16:29:31
Alguien que me ayude no quiero dejar este proyecto a medias.
Título: Re: Problema con programa
Publicado por: navaismo en 03 de Junio de 2008, 18:37:44
porque no nos pones la ventana del debug o la de mensajes del Isis para saber si te manda un warniing o algo y a veces es mejor hacerlo fisicamente que virtual.
Título: Re: Problema con programa
Publicado por: yukardo en 03 de Junio de 2008, 20:23:25
Bueno lo monte fisico y me funciono igual que en el proteus. y bueno adjunto el archivo de proteus que estoy probando.