martes, 25 de diciembre de 2012

Control locomotoras 16F876A modelismo ferroviario HO parte 2

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 caido 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 potenciometro, 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 circuiro 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 desvios 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 gustaria hacer un menú para que el número de desvios pueda ser variable.
Al pulsar sobre el número que queramos, nos aparecera 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 deven 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 del 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 presentacion
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, "Loco",#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
IF numeral = 3    THEN GOSUB direccion
IF numeral = "#" THEN GOTO menu2
IF numeral = "*" 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