Con la ampliación de la maqueta, me he metido de lleno a mejorar el tema de la electrónica y aprovechar al máximo los micro controladores, y se me ocurrió, que podría hacer algo parecido al sistema DCC pero en analógico. Para mi esto significa tener una central (Master) y los demás dispositivos auxiliares (Slaves).
De esta manera espero poder tener un control mucho más personalizado para cada circuito.
Nunca había caído en la cuenta de poder usar arrays para mejorar el código y estoy bastante contento ya que con ellos he podido resumir el código y hacerlo más compacto y espero que eficiente.
La velocidad esta controlada por el potenciómetro, que es común para todas las locomotora. Bueno no es lo más correcto llamarlas locomotoras, en realidad se refiere a cada circuito, ya que al ser analógico no alimento las locomotoras como en el sistema DCC, si no las vías.
Para entrar en el modo manual se pulsa 1, ya que en el montaje final la pantalla ira sobre el teclado. El modo PC aun no esta terminado así que ahora mismo no funciona.
Para seleccionar el circuito pulsaremos 1, 2 o 3 . Una vez dentro, aparecerá el número de circuito, la velocidad, y la dirección en la que va la locomotora situada en ese circuito. Para salir de ese circuito y volver al menú principal hay que pulsar "#"
Al menú de los desvíos se accede pulsando la tecla "*" y se llega desde cualquier parte del programa. Una vez en el menú de los desvíos, pulsaremos la tecla correspondiente al desvío que queramos. Por el momento solo he puesto 7 que son los que tengo yo, pero me gustaría hacer un menú para que el número de desvíos pueda ser variable.
Al pulsar sobre el número que queramos, nos aparecerá un mensaje indicando el estado del desvío.
Esto pertenece a la central, y aunque no esta terminado del todo, quiero poner unos menus para poder ampliar el numero de locomotoras y desvíos para poder añadir más o quitar, según la necesidad de cada maqueta. pero por el momento tengo escrito esto:
DEFINE LOADER_USED 1
DEFINE OSC 4
include "modedefs.bas" 'Activamos el modo de comunicación
'Ejemplo: serout portb.0,n2400,[x]
DEFINE ADC_BITS 10 ' Conversión A/D a 10 bits
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50 ' Tiempo de muestreo
DEFINE LCD_DREG PORTC 'Port de Data LCD
DEFINE LCD_BITS 4
DEFINE LCD_DBIT 0 'Datos LCD comenzando en BIT 0 o 4 "estos deben estar consecutivos"
DEFINE LCD_EREG PORTC3
DEFINE LCD_EBIT 4 ;
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 5
DEFINE LCD_COMANDUS 2000
DEFINE LCD_DATAUS 150
'Nombre de los pines para el teclado
Filauno var portb.0
Filados var portb.1
Filatres var portb.2
La var portb.3
Lb var portb.4
Lc var portb.5
Ld var portb.6
'-----Pines de TX y RX entre pics
Txmax var porta.5
RXmax var porta.4
'-----Variables presentación
X var byte
Y var byte
ABC var byte
Manpc var byte
'-----Variables potenciometros------
Dato1 var word 'Variable para el dato
Datof var byte[4]
Numloc var byte
dato1 = 0
Datof[1] = 0
Datof[2] = 0
Datof[3] = 0
'-----Variables para direcciones-----'
'Locoimg1 var byte
Dir var bit [4]
locoimg1 var bit [4]
Dir[1] = 0
Dir[2] = 0
Dir[3] = 0
------Variables para desvios-----
ID var byte
Desvio var bit 'Bit encargado del retorno a la pantalla de Desvios
Desv var byte[8]
Posdesv var byte
Numdesv var byte
Saledesv var bit
'-----Variable numeros de teclado
Numeral var byte
reenvio var byte
Datoentrada var byte
Slave var byte
PAUSE 500
LCDOUT 254, 64, 5, 8, 0, 23, 29, 31, 10
LCDOUT 254, 72, 20, 2, 0, 29, 23, 31, 10
ADCON1 =%10001110
GOSUB present
GOSUB mandavel
GOSUB menu1
'-----locomotoras
loco:
PAUSE 150 'Antirebote
IF filauno = 0 THEN GOTO loco
numeral = 254
ADCIN 0, Dato1 'Recibe datos ANALOGICOS y los almacena en la variable Dato1
Datof[numloc] = (Dato1 / 4)
'Muestra en el LCD velocidad y dirección
LCDOUT $FE, 1, $FE, 2, , #numloc, ": ", #datof[numloc], " ", locoimg1[numloc]
LCDOUT $FE, $C0, #datof[1], " ", #datof[2], " ", #datof [3]
PAUSE 50
GOSUB mandavel
GOSUB teclado
IF numeral = 1 THEN GOSUB direccion
IFnumeral = 3 THEN GOSUB direccion
IFnumeral = "#" THEN GOTO menu2
IFnumeral = "*" THEN GOSUB menu3
GOTO loco
Direccion:
IF numeral = 1 THEN
numeral = 254 : dir[numloc] = 0 : locoimg1[numloc] = 0 : endif
IF numeral = 3 THEN
numeral = 254 : dir[numloc] = 1 : locoimg1[numloc] = 1 : endif
RETURN
Mandavel:
SEROUT txmax,T9600,[ "A", numloc, datof[numloc], dir[numloc]]
RETURN
teclado:
LOW La : HIGH Lb
HIGH Lc : HIGH Ld
if filauno = 0 then Numeral = 1 'Control del teclado 4X3
if filados = 0 then Numeral = 2 Funo Fdos Ftres
if filatres = 0 then Numeral = 3
' La -- 1 2 3
' Lb --4 5 6
high La : low Lb
' Lc -- 7 8 9
high Lc : high Ld ' Ld -- * 0 #
if filauno = 0 then Numeral = 4
if filados = 0 then Numeral = 5
if filatres = 0 then Numeral = 6
high La : high lb
low lc : high ld
if filauno = 0 then Numeral = 7
if filados = 0 then Numeral = 8
if filatres = 0 then Numeral = 9
high la : high lb
high lc : low ld
if filauno = 0 then Numeral = "*"
if filados = ;0 then Numeral = 0
if filatres = 0 then numeral = "#"
RETURN
PCmode:
pause 100
LCDOUT $FE,1, $FE, 2, "A", #numeral
GOTO pcmode
'---------------Presentación-------
present:
LCDOUT $FE,1
FOR x = 0 TO 13
lookup x,["Infotronikblog"],abc
LCDOUT, abc
PAUSE 100
NEXT
PAUSE 100
LCDOUT $FE, $C0
FOR y = 0 TO 8
lookup Y,["Presenta:"],ABC
LCDOUT, ABC
PAUSE 100
NEXT
PAUSE 250
RETURN
'----------Opciones PC o Manual
Menu1:
LCDOUT $FE,1, $FE,2, " Elige opcion "
LCDOUT $FE, $C0,"*Manual *PCmode"
pause 150
low La : high lb
high lc : high ld
if filauno = 0 then
MANPC = 0 : goto Menu2 : ENDIF
if filatres = 0 then
MANPC = 1 : goto Pcmode : ENDIF
GOTO Menu1
'----- Menu para seleccionar locomotora
Menu2:
LCDOUT $FE,1, $FE,2, "Elige locomotora "
LCDOUT $FE,$C0,"Loc1 Loc2 Loc3"
PAUSE 200
GOSUB teclado
IF numeral = 1 THEN
numeral = 254 : numloc = 1 : goto loco : ENDIF
IF numeral = 2 THEN
numeral = 254 : numloc = 2 : goto loco :ENDIF
IF numeral = 3 THEN
numeral = 254 : numloc = 3 : goto loco :ENDIF
IF numeral = "*" THEN
numeral = 254 : gosub menu3 : ENDIF
GOTO menu2
'------Menu para seleccionar desvíos
Menu3:
ID = 10
numeral = 254
LCDOUT $FE,1, $FE,2, "Elige desvío: "
LCDOUT $FE, $C0, " 1 2 3 4 5 6 7 "
PAUSE 200
numeral = 254
gosub teclado
numdesv = numeral
IF(numeral >0) AND (numeral < 10) then gosub selecdesv
IF numeral = "#" THEN saledesv = 1
IF saledesv = 1 THEN
saledesv = 0 : numeral = 254 : return : endif
GOTO menu3
Selecdesv:
if desv[numdesv] = 0 then
gosub Desvlcdon
ELSE
gosub desvlcdoff
ENDIF
RETURN
Desvlcdon:
desv[numdesv] = 1
LCDOUT $FE,1, $FE, 2, "Desv ", #numdesv, ": ABIERTO"
FOR posdesv = 1 TO 5
SEROUT Txmax,T9600, ["A", ID, numdesv, desv[numdesv]]
next
PAUSE 1000
saledesv = 1
RETURN
Desvlcdoff:
desv[numdesv] = 0
LCDOUT $FE,1, $FE,2, "Desv ", #numdesv,": CERRADO"
FOR posdesv = 1 TO 5
SEROUT Txmax,T9600, ["A", ID, numdesv, desv[numdesv]]
NEXT
PAUSE 1000
saledesv = 1
RETURN
No hay comentarios :
Publicar un comentario