TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: pipoforos en 15 de Noviembre de 2007, 11:17:32
-
Hola amigos del foro,, quisiera saber si hay (debe haber) alguna manera de hacer que este programa que adjunto se pueda reducir, no se, obviando algunas cosas q podrian estar de mas o utilizando un metodo mas reducido,, el problema es qe al momento de compilar me sale ocupa mucha memoria del pic 16f877a,, y creo que me esta trayendo problemas a la hora de probarlo....
la idea del programa es la de controlar un intercomunicador, al pin0 del portd esta conectdo un pulsador que he difinico como cuenta,, en el se va a almacenar la cantidad de veces que se ha pulsado que significa el numero de usuario que quiero conectar el intercomunicador por un tiempo de 4seg, luego va a verificar si se encuentra mandando un pulso a un piezo electrico al usuario, si se encuentra activará el swtich conectado el portd.1 y comenzara la comunicacion y en el lcd aparecerá "conectado.." y ccuando cuelgue aparecerá ·fin..adios", y si no, aparecera en el lcd "no disponible"
el codigo es el sgte:
' Conexiones obligatorias a la LCD, no requiere inicializar puertos del PIC.
' LCD PIC
' DB4 PortB.0
' DB5 PortB.1
' DB6 PortB.2
' DB7 PortB.3
' RS PortB.4
' E PortB.5
' RW Ground
' Vdd 5 volts
' Vss Ground
' Vo 20K potentiometer (or ground)
' DB0-3 No connect
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 4
led0 var PORTC.0
led1 var portc.1
led2 var portc.2
led3 var portc.3
led4 var portc.4
led5 var portc.5
led6 var portc.6
led7 var portc.7
boton var PORTD.0
contesta var PORTD.1
i var byte
j var byte
m var byte
p var byte
aux var byte
cuenta var byte
CLEAR
Pause 500 ' Inicialización de LCD, 0.5 segundos.
'******************************************************
com: lcdouT $fe, 1 ' Limpia pantalla LCD
FOR i=0 to 15
lookup i,["cargando, espere.."],aux
LCDOUT aux
pause 200
next i
'*******************************************************
ini:
CLEAR
PORTC=0
CUENTA=0
LcdouT $fe, 1 ' Limpia pantalla LCD
pause 250
Lcdout "Presione las bcs" ' Despliega mensaje
pause 100
Lcdout $fe, $C0 ' Salta a segunda línea
lcdout "para llamar....."
TRISD.0=1
TRISD.1=1
count boton,4000,cuenta
pause 100
IF CUENTA=0 THEN
GOTO INI
ENDIF
llamando
LCDOUT $fe, 1
pause 250
lcdout "llamando........"
pause 100
lcdout $fe, $C0
lcdout "....espere......"
select case cuenta
case 1
high led4
pause 1000
low led4
pause 1000
high led4
pause 1000
low led4
pause 1000
GOTO contest
case 2
high led5
pause 1000
low led5
pause 1000
high led5
pause 1000
low led5
pause 1000
GOTO contest
case 3
high led6
pause 1000
low led6
pause 1000
high led6
pause 1000
low led6
pause 1000
GOTO contest
case 4
high led7
pause 1000
low led7
pause 1000
high led7
pause 1000
low led7
pause 1000
GOTO contest
end select
'pause 3000
contest
SELECT CASE contesta
case 0
lcdout $fe,1
'pause 250
lcdout "no disponible..."
pause 250
goto ini
CASE 1
pause 250
lcdout $fe,1
pause 250
lcdout "conectado......."
goto conectar
END SELECT
conectar
select case cuenta
case 1
high led0
goto loop
case 2
high led1
goto loop
case 3
high led2
goto loop
CASE 4
HIGH led3
GOTO loop
end select
loop
if contesta=1 then
goto loop
else
lcdout $fe,1
pause 250
lcdout "fin... adios"
pause 1000
goto ini
endif
end
-
Hola bueno primero que nada bienvenido, el uso de low y high quizas es lo que mas te genera esa perdida de memoria asi como el pause. Podrias quitar los LOW y HIGH y definir tu variable con 1 y 0 por ejemplo led1=1 o Led1=0 y las pausas que sean repetitivas haz una rutina de pausa y mandala llamar. Y nos cuentas que tal
-
Hola:
No entiendo a que te refieres con eso de que te sale un mensage que ocupa mucha memoria, lo he compilado y ocupa 1020 words de un total de 8192 words de las que dispone, te falta muchísimo para llenar la memoria.
Puedes depurar un poco el programa en los CASE, en todos en los que utilizas:
high led5
pause 1000
low led5
pause 1000
high led5
pause 1000
low led5
pause 1000
Puedes hacer un bucle y usar TOGGLE , para que te evites esas líneas de código.
TOGGLE Pin
Invert the state of the specified Pin. Pin is automatically made an output. Pin may be a constant, 0 - 15, or a variable that contains a number 0 - 15 (e.g. B0) or a pin name (e.g. PORTA.0).
Example
LOW 0 ' Start Pin0 as low
TOGGLE 0 ' Change state of Pin0 to high
-
gracias amigo lord por la ayuda,, pero dejo en claro q no sale mensaje de memoria llena, solo que pienso que 1022 palabras es mucho, y por eso queria saber si se podia hacer mas pequeño..
ahh y otra cosa como seria en el caso de proton+, he tratado de hacerlo y no me prende la lcd
-
lord lo que pasa es q esas lineas las he puesto xq ahi va un speaker que suena con un periodo de 500ms que sirve como aviso a la otra persona qe lo estan tratando de llamar, si al termino de ese tiempo no activa el sw del portd.1 salta y dice no disponible", entonces como utilizando el toggle puedo ree`mplazarlo??? :-)...
-
Hola:
El toggle cambia el estado de un pin, es lo mismo que haces con high y low, podrías cambiarlo por:
Low led5
for i=0 to 3
toggle led5
next i
en ese caso cambiaría el estado del led5 cuatro veces, primero, prende, luego apaga, luego prende y apaga.
Puedes probarlo así estaría un poco más optimizado, aunque tendrías que comilar para ver cuanta memoria ocupa.
Respecto al protón, pon el código para verlo.
-
lord solo lo he abierto el mismo archivo desde el pic basic plus y lo he complaido con el proton, no me genera ningun error en la compilacion y el ensamblado lo cual significa q esta bien??? supongo, lo he puesto el hex en el proteus en el mismo circuito y na, sale una especia de aviso como si el tiempo de sincronia entre el pic y el lcd no concordaran...
el xtal es de 4 y device 16f877a
-
Hola:
Son compiladores diferentes, hay algunas cosas que soporta proton respecto a PBP, pero no todo, mira solamente el encabezado, esto es la declaracion del pic, cristal y unas cuantas variables, no es lo mismo.
Device 18F452
XTAL 20
Declare LCD_TYPE 0
Declare LCD_DTPIN PORTC.0
Declare LCD_ENPIN PORTC.4
Declare LCD_RSPIN PORTC.5
Declare LCD_INTERFACE 4
Declare LCD_LINES 2
Dim num1 As Byte
Dim num2 As Byte
Dim unid As Byte
Dim dece As Byte
Dim tatal As Byte
Dim i As Byte
Dim Array[10] As Byte