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 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