TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Atomium en 29 de Diciembre de 2013, 15:03:44
-
Hola a todos,
Ante todo desearos un feliz año 2014.
Os explico, hace tiempo que no programo un PIC y ando de memoria algo mal.
Quiero hacer una cosa muy sencilla, pero... no me cuerdo como hacerlo, os lo explico, quiero con un solo pulsador encender 2 leds, pero si fuese solo eso seria muy facil. Quiero que al pulsar el pulsador conectado a RA0 se encienda y se apague 1 led conectado a RA1 y si pulso otra vez el mismo pulsador se encienda y se apague otro led conectado a RA2.
Esto seria para 1 led
Comienzo
If RA0 = 1 Then RA1 = 1
Goto led2
Led2
If RA0 = 1 Then RA2 = 1
Goto Comienzo
Saludos
-
Es relativamente facil:
AllDigital 'Todo el PortA como digital (I/O)
ConfigPin RA0 = Input 'Pin como entrada
ConfigPin RA1 = Output 'Pin como salida
ConfigPin RA2 = Output 'Pin como salida
RA1 = 0 'Pin a estado bajo, led1
RA2 = 0 'Pin a estado bajo, led2
Dim flag As Bit 'Bandera de control, establece el turno del led
flag = 0 'Bit a cero
'Rutina principal
void_main:
If RA0 = 1 And flag = 0 Then Gosub led1 'Si se cumple, salto con retorno a Led1
If RA0 = 1 And flag = 1 Then Gosub led2 'Si se cumple, salto con retorno a Led2
Goto void_main
End
'Rutina para el control del parpadeo led1
led1:
RA1 = 1 'Pin RA1 a estado alto
WaitMs 500 'Pausa de medio segundo
RA1 = 0 'Pin RA1 a estado bajo
WaitMs 500
Toggle flag 'Invierte bit
Return
'Rutina para el control del parpadeo led2
led2:
RA2 = 1
WaitMs 500
RA2 = 0
WaitMs 500
Toggle flag
Return
-
Buenas a todos,
Muchas gracias dogflu66.
LLevo al menos 6 años sin tocar un microcontrolador, me voy a poner las pilas de nuevo y a intentar recuperar un poco el tiempo perdido.
Gracias de nuevo
Feliz año nuevo
Saludos
-
Hola de nuevo dogflu66
Que compilador usastes ?
Saludos
-
Felices fiestas tambien para ti y para todos los que estan por aquí.
Uso el entorno de trabajo Pic Simulator IDE http://www.oshonsoft.com/
-
Buenas noches,
Gracias,
Mañana lo miraré, no utilicé nunca esa plataforma.
Si lei algo sobre sobre Oshon
Siempre usé Picbasic, Microcode Studio, Proton
Saludos
-
Buenas noches,
He programado el pic y no va,
RA1 siempre apagado y RA2 intermitente al rato sin tocar nada.
Saludos
-
¿Tienes bien la configuración en el pic sinulator? Tipo de micro, velocidad cristal, etc
-
Buenos dias,
Si , todo perfectamente configurado, compilado y grabado en el PIC y probado en una placa de ensayo.
Deberia de ir , lo que hace que encienda un led u otro es esto :
If RA0 = 1 And flag = 0 Then Gosub led1 'Si se cumple, salto con retorno a Led1
If RA0 = 1 And flag = 1 Then Gosub led2 'Si se cumple, salto con retorno a Led2
Pero... no va
Lo he vuelto ha hacer todo, hasta he cambiado de PIC.
Se pone el led conectado a RA2 intermitente y RA1 apagado siempre.
Saludos
-
wdt está habilitado?
-
Ya habia probado con el WDT habilitado y sin habilitar por si acaso
Uno de los leds lo tenia mal , lo he cambiado y estan los dos intermitentes, se apaga uno y se enciende el otro.
Saludos
-
Este lo he probado sobre la pic EBasic y funciona.
'**********************************************************************************
'Programa de ejemplo para trabajar con led y teclas
'Placa PicEBasic, 01/2014
'Basic Pic Simulator IDE (PSI), v6.96_04, Pic16F88
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8 'Oscilador a 8Mhz
'Define SIMULATION_WAITMS_VALUE = 1 'Activar para simulación
'-----------------------------------------
Call _setupebasic() 'Inicializa la placa entrenadora PicEBasic.
Hseropen 38400 'Inicializa puerto RS232 por hardware a 38400Baudios
Lcdinit 'Inicializa el LCD sin cursor
WaitMs 100 'Pausa de 100 mSeg.
Lcdout "Led y Teclas" 'Imprime el texto en el LCD
WaitMs 1000 'Pausa de 1 Seg.
'-----------------------------------------
Const ledon = 0 'Led encendido
Const ledoff = 1 'Led apagado
Const teclaon = 0 'Tecla pulsada
ledv = ledoff 'Led verde a Off
leda = ledoff 'Led ambar a Off
Dim flag As Bit 'Bandera de control, establece el turno del led
flag = 0 'Bit a cero
'Rutina principal
void_main:
If tecla2 = teclaon And flag = 0 Then Gosub led1 'Si se cumple, salto con retorno a Led1
If tecla2 = teclaon And flag = 1 Then Gosub led2 'Si se cumple, salto con retorno a Led2
Goto void_main
End
Include "_ProcSetUpEBasic.bas"
'Rutina para el control del parpadeo led1
led1:
ledv = ledon 'Pin RA1 a estado alto
WaitMs 500 'Pausa de medio segundo
ledv = ledoff 'Pin RA1 a estado bajo
WaitMs 500
Toggle flag 'Invierte bit
Return
'Rutina para el control del parpadeo led2
led2:
leda = ledon
WaitMs 500
leda = ledoff
WaitMs 500
Toggle flag
Return
-
Buenas noches,
Gracias, mañana lo grabaré en el pic 16F84 y haré la prueba.
Ya os comentaré que tal ha ido.
Saludos
-
Hola,
A ti te va el programa porque lo usas con la pic EBasic y tambien le incluyes :
Include "_ProcSetUpEBasic.bas"
Sin este fichero no va.
Saludos
-
Si, es la configuración de la placa, el include me permite simplificar el programa principal.
'****************************************************************************
'Configuración de la placa entrenadora Pic EBasic ***************************
'By COS, 01/14, 11/2013, Pic Simulator IDE v6.96_04 *************************
'Pic16F88 y LCD con linea de datos a 4 Bit sin Bit R/W **********************
'****************************************************************************
'Include "_ProcSetUpEBasic.bas"
Symbol ledv = RB0 'Etiqueta al led verde
Symbol leda = RA7 'Etiqueta al led amarillo
Symbol blcd = RB3 'Etiqueta al backlight del lcd
Symbol tecla1 = RA6 'Etiqueta a la tecla S1
Symbol tecla2 = RA5 'Etiqueta a la tecla S2
'Codigos Ascci de control del Hyperterminal
Const ff = 0x0c 'FF, Avance de pagina
Const bell = 0x07 'BELL, Señal sonora
Const sp = 0x20 'SP, Espacio
Const bksp = 0x08 'BKSP, Retroceso
Const cr = 0x0d 'CR, retorno de carro
'-----------------------------------------
Proc _setupebasic()
'Puerto del LCD ----------------------------------------------------------
Define LCD_BITS = 4 'Bus de datos del lcd, a 4bit
Define LCD_DREG = PORTA 'Bus de datos, puerto A
Define LCD_DBIT = 0 'Bus datos 4, bit menos significativos del puerto
Define LCD_RSREG = PORTB 'Bit de control RS, puerto B
Define LCD_RSBIT = 7 'RB7 como RS
Define LCD_EREG = PORTB 'Bit de control E, puerto B
Define LCD_EBIT = 6 'RB6 como E
Define LCD_COMMANDUS = 2000 'Espera despues de cada comando
Define LCD_DATAUS = 100 'Espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Espera inicialización del Display
'Configuración Placa Pic EBasic -----------
AllDigital
ANSEL = 0x00 'Los pin I/O digitales
CMCON = 0x07 'Comparador a off
OSCCON = 0x7e 'Reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'Puerto B como salidas
TRISA.4 = 1 'Como entrada (RA4, adc)
TRISA.6 = 1 'Como entrada (RA6, tecla S1)
TRISA.5 = 1 'Como entrada (RA5, tecla S2)
TRISB.5 = 0 'Como salida(RB5,Tx RS232)
TRISB.2 = 1 'Como entrada (RB2, Rx RS232)
TRISB.4 = 1 'Como entrada (RHT03 inicio)
PORTB.3 = 1 'Luz lcd a ON (RB3)
PORTA.7 = 1 'Led amarillo a OFF
PORTB.0 = 1 'Led verde a OFF
PORTB.1 = 0 'LED RHT03 a OFF
'-----------------------------------------
'Lcdinit
End Proc
-
He quitado el Include del SeUp de la placa EBbasic.
Se le ha eliminado la configuración del display y del puerto serie.
Solo he dejado la configuración de los pin I/O y del reloj interno.
Como el micro no es el mismo que el tuyo tienes que reconfigurar los fuses, los pin de entrada y los de salida.
Y si cambias los pin en las etiquetas (symbol) no tienes que tocar el resto del programa.
'**********************************************************************************
'Programa de ejemplo para trabajar con led y teclas
'Placa PicEBasic, 01/2014
'Basic Pic Simulator IDE (PSI), v6.96_04, Pic16F88
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8 'Oscilador a 8Mhz
'Define SIMULATION_WAITMS_VALUE = 1 'Activar para simulación
'-----------------------------------------
AllDigital 'Los pin I/O digitales
OSCCON = 0x7e 'Reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'Puerto B como salidas
TRISA.6 = 1 'Como entrada (RA6, tecla S1)
TRISA.5 = 1 'Como entrada (RA5, tecla S2)
'-----------------------------------------
WaitMs 1000 'Pausa de 1 Seg.
'-----------------------------------------
Symbol ledv = RB0 'Etiqueta al led verde
Symbol leda = RA7 'Etiqueta al led amarillo
Symbol tecla1 = RA6 'Etiqueta a la tecla S1
Symbol tecla2 = RA5 'Etiqueta a la tecla S2
Const ledon = 0 'Led encendido
Const ledoff = 1 'Led apagado
Const teclaon = 0 'Tecla pulsada
ledv = ledoff 'Led verde a Off
leda = ledoff 'Led ambar a Off
Dim flag As Bit 'Bandera de control, establece el turno del led
flag = 0 'Bit a cero
'Rutina principal
void_main:
If tecla2 = teclaon And flag = 0 Then Gosub led1 'Si se cumple, salto con retorno a Led1
If tecla2 = teclaon And flag = 1 Then Gosub led2 'Si se cumple, salto con retorno a Led2
Goto void_main
End
'Rutina para el control del parpadeo led1
led1:
ledv = ledon 'Pin RA1 a estado alto
WaitMs 500 'Pausa de medio segundo
ledv = ledoff 'Pin RA1 a estado bajo
WaitMs 300
Toggle flag 'Invierte bit
Return
'Rutina para el control del parpadeo led2
led2:
leda = ledon
WaitMs 500
leda = ledoff
WaitMs 300
Toggle flag
Return
-
Hola,
Primero dar las gracias a dogflu66 por su ayuda, sin su ayuda me habria sido imposible hacerlo.
Haciendole unos cambios me ha llegado a funcionar el el Real Pic Simulator:
Aqui pongo el codigo con los cambios efectuados por si lo necesita alguien:
'**********************************************************************************
'Programa de ejemplo para trabajar con led y pulsador
' Pic16F84 a 4 Mhz
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CLOCK_FREQUENCY = 4 'Oscilador a 4Mhz
'-----------------------------------------
AllDigital 'Los pin I/O digitales
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'Puerto B como salidas
TRISA.0 = 1 'Como entrada (RA6, tecla S1)
'-----------------------------------------
WaitMs 1000 'Pausa de 1 Seg.
'-----------------------------------------
Symbol ledv = RA1 'Etiqueta al led verde
Symbol leda = RA2 'Etiqueta al led amarillo
Symbol tecla1 = RA0 'Etiqueta a la tecla S1
Const ledon = 0 'Led encendido
Const ledoff = 1 'Led apagado
Const teclaon = 0 'Tecla pulsada
ledv = ledoff 'Led verde a Off
leda = ledoff 'Led ambar a Off
Dim flag As Bit 'Bandera de control, establece el turno del led
flag = 0 'Bit a cero
'Rutina principal
void_main:
If tecla1 = teclaon And flag = 0 Then Gosub led1 'Si se cumple, salto con retorno a Led1
If tecla1 = teclaon And flag = 1 Then Gosub led2 'Si se cumple, salto con retorno a Led2
Goto void_main
End
'Rutina para el control del parpadeo led1
led1:
ledv = ledoff 'Pin RA1 a estado bajo
WaitMs 500 'Pausa de medio segundo
ledv = ledon 'Pin RA1 a estado alto
WaitMs 300
Toggle flag 'Invierte bit
Return
'Rutina para el control del parpadeo led2
led2:
leda = ledoff
WaitMs 500
leda = ledon
WaitMs 300
Toggle flag
Return
-
Felicidades; me alegró saber que te ha funcionado. ((:-))