Pues siguiendo con mis pequeños ejemplitos, ahora agrego el de juego de luces para mostrar el manejo de los arrays y del for mirandolo a incremento o decremento. Espero les sea útil :).HOLA AMIGUITA QUE TAL SE ME ACORRIO ALGO AVER SI SE PODRIA MODIFICAR LOS TIEMPOS DE ENCENDIDOS DE LEDS
Código:Código: Visual Basic
program juego_de_luces dim luces as byte [4] dim i as byte luces[0] = %10000001 luces[1] = %01000010 luces[2] = %00100100 luces[3] = %00011000 main: TRISB=0 P: i=0 for i=0 to 3 PORTB= luces [i] delay_ms (100) 'retardo de .1seg next i for i=2 to 0 step -1 PORTB= luces [i] delay_ms (100) next i goto P end.
el esquema que aplique es el mismo que use en el primer ejemplo.
program Adc_Test
dim temp_res as word
main:
ADCON1 = $80 ' Configurar entradas analogas
TRISA = $FF ' puerta a entrada
TRISB = $3F ' Pins RB7 y RB6 salida
TRISD = $0 ' PORTD salida
while TRUE
temp_res = Adc_Read(2)
PORTD = temp_res ' Enviar al puerto d PORTD
PORTB = word(temp_res >> 2) ' Enviar los dos bits mas significativos
wend
end..program AdcLectura
dim ValorAdc as word
dim txt as string [5]
main:
Trisb=0
Lcd_init(portb)
Lcd_Cmd(Lcd_cursor_off)
ADCON1= %10001110
while (true)
ValorAdc = Adc_Read(0)
WordToStr(ValorAdc,txt)
Lcd_out(1,1,txt)
delay_ms(500)
wend
end. program test
main:
setbit(trisb,0)
while (true)
setbit(portb,0)
delay_ms(1000)
clear_bit(portb,0)
delay_ms(portb,0)
wend
end. program test
main:
setbit(trisb,0)
while (true)
setbit(portb,0)
gosub retardo
clear_bit(portb,0)
gosub retardo
wend
retardo:
delay_ms(1000)
return
end.program lcdmicroe
main:
dim text as char[20]
TRISA = 0
TRISb = 0
ADCON1 = 6
text="hola"
Lcd8_Init(PORTB, 7, 6, 5, 4, 3, 2, 1, 0, PORTA, 0, 1, 2) 'en b estan los datos del 7 al 0 y en a va rs,rw,e
Lcd8_Cmd(Lcd_CURSOR_OFF)
Lcd8_Out(1, 1,text) ' Print text at LCD
end.program temp
'Lee Tres Señales Analogicas y muestra por LCD a 8 bits.
dim PT,Te,PDT as Word
dim Pres,Temp,PreD as string[5]
const Pr="PSI"
const Tem="°F"
const PD="'H2O"
main:
Adcon1=%10000100
TrisA=$3F
TrisB=0
TrisC=0
'en PortB estan los datos del 7 al 0 y en PortC va rs,wr,e
Lcd8_Init(PORTB, 7, 6, 5, 4, 3, 2, 1, 0, PORTC, 0, 1, 2)
lcd8_cmd (lcd_clear)
lcd8_cmd (Lcd_Blink_Cursor_On)
lcd8_out (1,1,"PT-TT-PDT")
Convert:
PT=Adc_read(0)
Te=Adc_read(1)
PDT=Adc_read(3)
'Se pasan a cadena
Wordtostr(PT,Pres)
Wordtostr(Te,Temp)
Wordtostr(PDT,PreD)
DELAY_MS(1000)
lcd8_cmd (lcd_clear)
lcd8_out (1,1,Pres)
lcd8_out (1,6,Pr)
lcd8_out (1,10,Temp)
lcd8_out (1,15,Tem)
lcd8_out (2,6,PreD)
lcd8_out (2,11,PD)
delay_ms (1000)
goto Convert
end.
program conter
const segmentos as byte[16] =(%11000000,
%11111001,
%10100100,
%10110000,
%10011001,
%10010010,
%10000010,
%11111000,
%10000000,
%10010000,
%10001000,
%10000011,
%10100111,
%10100001,
%10000110,
%10001110)
sub procedure saca(dim g0,g1,g2,g3 as byte)
portb=segmentos[g0]
setbit(porta,0)
delay_ms(10)
clearbit(porta,0)
delay_us(100)
portb=segmentos[g1]
setbit(porta,1)
delay_ms(10)
clearbit(porta,1)
delay_us(100)
portb=segmentos[g2]
setbit(porta,2)
delay_ms(10)
clearbit(porta,2)
delay_us(100)
portb=segmentos[g3]
setbit(porta,3)
delay_ms(10)
clearbit(porta,3)
delay_us(100)
end sub
main:
dim d3, d2, d1, d0 as byte
dim I as integer
portb=$ff porta=0 trisb=0 trisa=0 porta=0 d3=8 d2=8 d1=8 d0=8
while true
for I=0 to 10
saca(d0,d1,d2,d3)
next I
d0=d0+1
if d0=10 then
d0=0
d1=d1+1
if d1=10 then
d1=0
d2=d2+1
if d2=10 then
d2=0
d3=d3+1
if d3=10 then
d3=0
end if
end if
end if
end if
wend
end.
Lectura simple de un ADC en el LCD
Bueno aqui otro programilla, este si me costo trabajo. :D :DCódigo: FreeBasic
program adcMKB dim tiempo as word ' variable de almacenamiento del adc tiempot as string[5] ' variable para poder ver en el lcd el resultado main: ' canal RA0 como analogico ADCON1 = 142 ' canal de entrada TRISA.0 = 1 Lcd_Config(PORTD,3,2,1,0,PORTB,0,1,2) 'configuracion lcd Lcd_Cmd(LCD_CURSOR_OFF) Lcd_Cmd(LCD_CLEAR) ' lectura del adc RA0 tiempo = adc_read(0) ' Lo pasamos a cadena para LCD wordtostr(tiempo,tiempot) ' aqui lo desplegamos en el lcd lcd_out(1,3,tiempot) delay_ms(1000) goto main end.
(http://img336.imageshack.us/img336/9008/adc1nq9.jpg)
HOLA AMIGO PRIMERAMENTE GRACIAS POR ESTOS EJEMPLITOS ME HAN SEERVIDO DE GRAN AYUDA PARA MI INCORPORAMIENTO AL MUNDO DE MIKROBASIC Y ME HAN AYUDADO A REALIZAR MI PROYECTO DE GRADO, PERO ME GUSTARIA PEDIRTE UN FAVOR NECESITO DIGITALIZAR UNA SEÑAL ANALOGICA Y LUEGO EL VALOR DE ELLA ENVIARLA A TRAVEZ DE UN PUERTO RS232 USANDO LA LIBRERIA UART, REVISE TUS EJEMPLOS INDIVIDUALES Y SI PUDE REALIZARLOS PERO NO SE COMO HACER PARA QUE MI SEÑAL TOMADA DEL CANALA ANALOGICO LUEGO LA PUEDA ENVIAR POR LA UART
UNA DE MIS DUDAS ES QUE LA VARIABLE DE LA SEÑAL DIGITALIZADA ES DEL TIPO WORD MIENTRAS QUE LA QUE SE ENVIA POR EL UART ES TIPO BYTE, SI TIENEN UN EJEMPLO SENCILLO DE ESTO LES ESTARIA MUY AGRADECIDO, YO USO EL PIC 18F4520, PERO ME SIRVE UN EJEMPLO CON CUALQUIERA SOLO QUIERO VER LA ESTRUCTURA DEL PROGRAMA Y BUENO NO ESTARIA DE MAS EL DIAGRAMA REALIZADO EN PROTEUS...
MUCHAS GRACIAS Y SIGAN ASI, QUE REALMENTE NOS BRINDAN GRAN AYUDA A LOS AMANTES DE LA ELECTRONICA
program clave
dim kp,i,j,a as byte 'kp = valor de la tecla presionada
'i = contador de teclas presionadas
'j = contador de asteriscos mostrados
'a = contador de veces acertadas
sub procedure iniciar_Lcd() 'Configuar PORTB como data port
Lcd_Config(PORTB,7,6,5,4,PORTA,0,1,2) 'y PORTA como control port del LCD
Lcd_Cmd(LCD_CURSOR_OFF) 'Apaga Curcor del LCD
end sub
sub procedure Leer_teclado()
Lcd_Cmd(LCD_SECOND_ROW) 'Envia el cursor a Lin 2 Col 1
for j=1 to i
Lcd_Chr_CP("*") 'Imprime * al presionar Tecla
next j
kp=254
while kp=254 'Espera a que se presione una tecla y
kp=Keypad_Released-2 'guarda el dato al soltarla
wend
end sub
main:
Keypad_Init(PORTB)'Inicializa PORTB como controlador del Teclado
while 1
iniciar_Lcd
Lcd_Out_CP("Teclee Clave:") 'Imprime Clave en 1ra Linea
if i=4 then 'Al presionar 4 teclas correctas
Lcd_Cmd(LCD_SECOND_ROW) 'Evia el cursor en Lin 2 Col 1
if a=4 then 'si se aciertan 4 veces
if PORTA.3=1 then 'si esta activa la opcion renovar clave
for i=0 to 3
iniciar_Lcd 'se imprimira en linea1
Lcd_Out_CP("Nueva Clave:") 'nueva clave:
Leer_teclado 'y en linea2 los asteriscos
EEprom_write(i,kp) 'se reescribira la clave en EEPROM
next i
iniciar_Lcd
Lcd_Out_CP("Clave Guardada.") 'Luego se Imprimira Clave Guardad.
else 'si no se activa la opcion renovar clave
Lcd_Out_CP("Exito!!") 'se imprimira Exito
end if
else 'de lo contrario se imprimira
Lcd_Out_CP("Error!!") 'Error
end if
delay_ms(1000) 'este retardo es para visualizar lo anterior
i=0 'luego se inicializan las variables contadoras
a=0
continue
end if
Leer_teclado
if EEprom_read(i)=kp then 'si el dato leido en la EEPROM es igual al tecleado
a=a+1 'se incrementara a
end if
i=i+1 'incrementa i
wend
end.Hola amigo primeramente gracias por estos ejemplitos me han servido de gran ayuda para mi incorporación al mundo de mikrobasic y me han ayudado a realizar mi proyecto de grado, pero me gustaría pedirte un favor necesito digitalizar una señal analógica y luego el valor de ella enviarla a través de un puerto RS232 usando la librería uart, revise tus ejemplos individuales y si pude realizarlos pero no se como hacer para que mi señal tomada del canal analógico luego la pueda enviar por la uart:-/
Una de mis dudas es que la variable de la señal digitalizada es del tipo Word mientras que la que se envía por el uart es tipo byte, si tienen un ejemplo sencillo de esto les estaría muy agradecido, yo uso el PIC 18f4520, pero me sirve un ejemplo con cualquiera solo quiero ver la estructura del programa y bueno no estaría de mas el diagrama realizado en proteus...
Muchas gracias y sigan así, que realmente nos brindan gran ayuda a los amantes de la electrónica
Hola.
Habría que escribir el valor de la nueva clave en la EEPROM del micro.
Hola "bigluis", tengo algo de tiempo trabajando con MKB pero nunca me había topado con un programa que empleara la sentencia "continue"
' continue salta aqui
for i = ...
...
continue
...
next i
' continue salta aquí
while condition
...
continue
...
wend
do
...
continue
...
' continue salta aquí
loop until condition
Inicio del Lazo
...
break
...
Fin del Lazo
'break salta aquí
program EJEM1
Dim LCD_RS As sbit At RB4_bit
Dim LCD_EN As sbit At RB5_bit
Dim LCD_D4 As sbit At RB0_bit
Dim LCD_D5 As sbit At RB1_bit
Dim LCD_D6 As sbit At RB2_bit
Dim LCD_D7 As sbit At RB3_bit
Dim LCD_RS_Direction As sbit At TRISB4_bit
Dim LCD_EN_Direction As sbit At TRISB5_bit
Dim LCD_D4_Direction As sbit At TRISB0_bit
Dim LCD_D5_Direction As sbit At TRISB1_bit
Dim LCD_D6_Direction As sbit At TRISB2_bit
Dim LCD_D7_Direction As sbit At TRISB3_bit
Dim dato As word ' Dato donde se guardara la conversion A/D
Dim datostr As string[4] ' Variable para conversion datos.
Dim voltaje As Float
Dim VoltajeStr As string[4]
Dim datoflt As float
main: 'Programa principal
TRISB = %00000000
TRISA = %11111111
ADCON1 = %10000010
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Delay_ms(500)
While (true)
dato = Adc_Read(0) ' Carga el resultado de 10 bits en la variable
datoflt = dato
FloatToStr(dato,datostr)
LCD_Out(1, 1,datostr)
voltaje = datoflt * 0.0049
FloatToStr(voltaje,VoltajeStr)
LCD_Out(2, 1,VoltajeStr)
Delay_ms(1000)
Wend
end.program EJEMPLO_SERIAL
'--- Area de declaración:
Dim Datos_RX As Byte[10] ' Arreglo de variables para almacenar los datos.
acumulador As Byte ' Variable para condicional "loop Until..."
X As Byte ' Variable para lazo For-Next.
Dim mandar as char[20]
' Configuración de pines de control y datos de la pantalla LCD:
Dim LCD_RS As sbit At RB4_bit
LCD_EN As sbit At RB5_bit
LCD_D4 As sbit At RB0_bit
LCD_D5 As sbit At RB1_bit
LCD_D6 As sbit At RB2_bit
LCD_D7 As sbit At RB3_bit
LCD_RS_Direction As sbit At TRISB4_bit
LCD_EN_Direction As sbit At TRISB5_bit
LCD_D4_Direction As sbit At TRISB0_bit
LCD_D5_Direction As sbit At TRISB1_bit
LCD_D6_Direction As sbit At TRISB2_bit
LCD_D7_Direction As sbit At TRISB3_bit
' Fin de la configuración de conexiones
main: ' Programa Principal
UART1_Init(2400) ' Inicializamos el módulo UART a 2400 bps.
Delay_ms(100) ' Pausa de 100 milisegundos para estabilización.
LCD_Init() ' Inicializa la pantalla LCD
LCD_Cmd(_LCD_CLEAR) ' Limpia la pantalla LCD
LCD_Cmd(_LCD_CURSOR_OFF) ' Apaga el cursor en la pantalla
Lcd_Out(1, 1, "Datos: ") ' Se imprime "Datos: " en la primera línea
' de la pantalla.
mandar = "ejemploamandar"
' continúa cargando caracteres.
For X = 1 To 9 ' For-Next para enviar los datos desde
' la primera variable hasta la última cargada.
UART1_Write(mandar[X]) ' Enviamos el dato cargado en la variable.
Next X
Lcd_Out(2, 1, "Mostrando Datos!") ' Mensaje de estado del Buffer.
For X = 1 To 9 ' For-Next para presentar los datos desde
' la primera variable hasta la última cargada.
Lcd_Chr(1, 8, mandar[X]) ' Mostramos el equivalente ASCII del valor cargado
' en la variable "Datos_RX"
Delay_ms(1000) ' Retardo de 1 segundo.
Next X
Lcd_Out(2, 1, " Fin ") ' Mensaje de finalización del proceso.
End.Este compilador no tiene una funcion especial que haga eso (CCS si la tiene), por lo tanto debes crear una rutina para hacerlo.
Puedes utilizar estoCódigo: FreeBasic
sub procedure imprime_Hexadecimal(num) dim i,nibble_inferior as byte 'declaramos el byte nibble_inferior for i=0 to 2 'hacemos que haga esto 2 veces asm 'inicio del bloque ensamblador swap num,1 'intercambiamos los nibbles del numero end asm 'fin del bloque ensamblador nibble_inferior=num and 00001111 'extraemos el nibble inferior del numero if(nibble_inferior<10) 'si el nibble inferior es menor a 10 nibble_inferior=nibble_inferior+'0' 'guardamos valor ascii del numero else 'de lo contrario nibble_inferior=nibble_inferior+55 'guardamos valor ascii de la letra (A=65) end if Lcd_Chr_CP(nibble_inferior) 'imprime el nibble inferior next i end sub
Si imprime 3 caracteres debes poner el limite del for en 1.
:-/ suerte.
Perdonen pero que significa ASG lo he visto en varios programas
Amigo.
Ya que estas en esto del mokrobasic, como creo una libreria propia
tengo un que no se acopla a los tradicionales ks0108 y demas :oops: :oops:
Gracias por tu ayuda :-/ :-/ :oops:
Hola a todos estoy haciendo una rutina en la que necesito visualizar en 4 display 7 segmentos cátodo común un valor de una variable “microsegundos” por el momento dispongo de esta rutina, pero no muestra decimales y no me secuencia el PORTB. Que es lo que estoy haciendo mal??
dim shifter, portc_index as byte ' Variables shifter y portc_index son de tipo byte
dim microsegundos as byte ' Definir la variable microsegundos como un byte
digit, number as word ' Variables digit y number son de tipo word
portc_array as word[4] ' Matriz portc_array tiene 4 miembros de tipo word
sub function mask (dim num as Word) as Word ' Subrutina para enmascarar
select case num ' utilizada para convertir
case 0 result = $3F ' números binarios en la
case 1 result = $06 ' combinación de bits apropiada
case 2 result = $5B ' que se visualizará en el LED
case 3 result = $4F
case 4 result = $66
case 5 result = $6D
case 6 result = $7D
case 7 result = $07
case 8 result = $7F
case 9 result = $6F
end select ' Final de la sentencia Case
end sub ' Final de la subrutina
sub procedure interrupt ' Inicio de la rutina de interrupción
PORTB = 0 ' Apagar todos los visualizadores de 7 segmentos
PORTC = portc_array [portc_index] ' Enviar el valor apropiado al puerto PORTD
PORTB = shifter ' Encender el visualizador apropiado de 7 segmentos
shifter = shifter << 1 ' Mover shifter al siguiente dígito
if (shifter > 8 ) then
shifter = 1
end if
Inc(portc_index) ' Incrementar portc_index
if (portc_index > 3) then
portc_index = 0 ' Encender el primero, apagar el cuarto visualizador de 7 segmentos
end if
TMR0 = 0 ' Reiniciar el valor del TIMER0
T0IF_bit = 0 ' Borrar la bandera de interrupción del Timer0
end sub ' Final de la rutina de interrupción
main: ' Inicio del programa
OPTION_REG = $80 ' Configuración del Timer0 (Timer0 funciona como temporizador
' con el pre-escalador)
digit = 0 ' Valor inicial de la variable digit
portd_index = 0 ' Encender el primer visualizador LED
shifter = 1 ' Valor inicial de la variable shifter
TMR0 = 0 ' Borrar el Timer0
INTCON = $A0 ' Habilitar interrupción con los bits GIE y T0IE
PORTB = 0 ' Borrar el PORTB
TRISB = 0 ' Configurar el PORTB como salida
PORTC = 0 ' Borrar el PORTC
TRISD = 0 ' Configurar el PORTD como salida
number = microsegundos*0.012288
number= 0.05/ number ' Valor en el visualizador LED
while TRUE ' Bucle infinito
digit = number / 1000 ' Extraer miles
portc_array[3] = mask(digit) ' y almacenarlo en la matriz PORTC
digit = (number / 100) mod 10 ' Extraer centenas
portc_array[2] = mask(digit) ' y almacenarlo en la matriz PORTC
digit = (number / 10) mod 10 ' Extraer decenas
portc_array[1] = mask(digit) ' y almacenarlo en la matriz PORTC
digit = number mod 10 ' Extraer unidades
portc_array[0] = mask(digit) ' y almacenarlo en la matriz PORTC
Delay_ms(10000) ' Retardo de un segundo
wend
end. ' Final de programa
La mejor opción como te indica MLO es trabajar con variable tipo Float y utilizar las funciones para trabajar con cadenas, pero si el lenguaje no tiene Float o funciones para cadenas, o simplemente el micro es tan chico que el uso de Float o funciones se come la memoria de programa, entonces se usa el método que estás usando (el de toda la vida). Para trabajar como lo haces lo primero que tienes que hacer es eliminar los decimales de los números y esto se hace multiplicándolos por x10 tantas veces como haga falta, después operas normalmente y luego aplicas el método que estas utilizando para extraer la parte entera y la parte decimal. Dicho de esta manera parece difícil pero en realidad es muy simple y ocupa muy poca memoria de programa.
number = microsegundos*12288
number= 5/ number ' Valor en el visualizador LED
Aquí tienes ejemplos de cómo trabajar con decimales mediante el uso de números enteros.
http://www.todopic.com.ar/foros/index.php?topic=14917.0
program adcMKB
dim tiempo as word ' variable de almacenamiento del adc
tiempot as string[5] ' variable para poder ver en el lcd el resultado
main: ' canal RA0 como analogico
ADCON1 = 142 ' canal de entrada
TRISA.0 = 1
Lcd_Config(PORTD,3,2,1,0,PORTB,0,1,2) 'configuracion lcd
Lcd_Cmd(LCD_CURSOR_OFF)
Lcd_Cmd(LCD_CLEAR)
' lectura del adc RA0
tiempo = adc_read(0) ' Lo pasamos a cadena para LCD
wordtostr(tiempo,tiempot)
' aqui lo desplegamos en el lcd
lcd_out(1,3,tiempot)
delay_ms(1000)
goto main
end. Bueno aquí van mis dudas porque la verdad no entiendo nada del adc...Saludos a todos...ya rato no entraba aquí...y ahora entro porque tengo una duda...tome un curso de mikrobasic y pues ahora que vi que es fácil quiero hacer un proyecto y necesito saber lo de adc....vi un ejemplo aquí en este tema y quisiera saber algunas cosas...Código: [Seleccionar]program adcMKBBueno aquí van mis dudas porque la verdad no entiendo nada del adc...
dim tiempo as word ' variable de almacenamiento del adc
tiempot as string[5] ' variable para poder ver en el lcd el resultado
main: ' canal RA0 como analogico
ADCON1 = 142 ' canal de entrada
TRISA.0 = 1
Lcd_Config(PORTD,3,2,1,0,PORTB,0,1,2) 'configuracion lcd
Lcd_Cmd(LCD_CURSOR_OFF)
Lcd_Cmd(LCD_CLEAR)
' lectura del adc RA0
tiempo = adc_read(0) ' Lo pasamos a cadena para LCD
wordtostr(tiempo,tiempot)
' aqui lo desplegamos en el lcd
lcd_out(1,3,tiempot)
delay_ms(1000)
goto main
end.
1.que es eso de adcon0 y adcon1 y para quede usan??
2.como saben que 142 es el canal análogo de RA0, cada canal tiene su numero o codigo??
La verdad he visto el datasheet del pic16f887 que es el que uso y busco la parte adc pero la verdad no entiendo nada...quisiera que me explicaran de la forma mas clara porque si me ha dado duro esto del adc...les agradecería muchísimo su ayuda...de antemano muchas gracias
TRISA.0 = 1 'seleccionas pin A0 como entrada
ANSEL.0 = 1 'seleccionas pin A0 como entrada analogico