Autor Tema: Ejemplitos de Mikrobasic y Proteus  (Leído 168687 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado cosmic

  • PIC16
  • ***
  • Mensajes: 175
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #75 en: 13 de Abril de 2011, 14:55:46 »
Veguepic amigo.
una preguntita. Como hago para usar cualquier puerto como bus de 8bits para lcd.
he intentado usar el portb del pic 16f873a, pero me da error
lcd8_Init (PORTB,7,6,5,4,3,2,1,0, PORTC,7,6,5). ESTO EN LA VERSION 7.0.02
Graciasa por tu ayuda

Desconectado banistelrroy

  • PIC10
  • *
  • Mensajes: 29
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #76 en: 11 de Mayo de 2011, 01:50:35 »
una consulta tengo instalado micro code estudio hay conflicto si instalo mikrobasic

Desconectado jorge_613

  • PIC10
  • *
  • Mensajes: 19
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #77 en: 11 de Mayo de 2011, 15:45:10 »
Hola estoy aprendiendo a utilizar este lenguaje, y por el momento me va d eperlas,
Trao de hacer un  Pulsado que cada vez que lo pulse este se me vaya sumnado y me muestre el numero de pulsaciones en un display.

este EJEMPLO muestra algo que yo quiero, pero no se como hacerlo en el proteus, hasta ahora intento de esta forma, pero sigue sin funcionar, alguna idea, por favor?

En el Adjunto la Imagen.

Desconectado duaiber

  • PIC10
  • *
  • Mensajes: 1
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #78 en: 14 de Septiembre de 2011, 18:01:52 »
buenas tardes estoy trabajando en un data logger ya tengo las rutinas para leer una memoria sd y escribirla pero tengo un problema que estare guardando datos float en realidad no se como almacenarlos en una memoria serial o EEPROM interna ya q este coniene 4bytes y pues sino se como guardarlo imaginenc leerlo por separado y encriptarlo si alguien tiene algun proyecto de guardado de variable flotante en mkb le agradezco de antemano

Desconectado intimdq

  • PIC10
  • *
  • Mensajes: 15
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #79 en: 15 de Diciembre de 2011, 00:03:00 »
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

Desconectado intimdq

  • PIC10
  • *
  • Mensajes: 15
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #80 en: 17 de Diciembre de 2011, 00:10:35 »
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



He solucionado el problema de visualizacion, el problema estaba en que en Proteus ISIS me faltaba ponerle unas resistencias a los catodos del display. El problema que me queda es que no puedo ver decimales. como puedo solucionar eso??? Gracias...



Desconectado intimdq

  • PIC10
  • *
  • Mensajes: 15
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #81 en: 22 de Diciembre de 2011, 12:11:32 »

Hola... hay alguien aquí???  :(

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #82 en: 22 de Diciembre de 2011, 21:17:21 »
Hola

se nada de basic. Pero si quieres decimales, es mejor que primero hagas la operacion y guardes el resultado en una variable float, y luego conviertas esa float a string.

Saludos
El papel lo aguanta todo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #83 en: 24 de Diciembre de 2011, 10:04:08 »
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
« Última modificación: 24 de Diciembre de 2011, 10:07:25 por dogflu66 »
Saludos desde Granada, España.

Desconectado intimdq

  • PIC10
  • *
  • Mensajes: 15
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #84 en: 26 de Diciembre de 2011, 18:00:03 »
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



Gracias por tu comentario, pero no me quedo del todo claro, digamos, si trabajo la variable number de la siguiente forma:
number = microsegundos*12288   
number=  5/ number   ' Valor en el visualizador LED
el resultado se me va ver alterado. Digamos si microsegundos es igual a 10entonces:

10*0,012288 =0,12288 y
0,05/0,12288 = 0,4069

de la forma en que usted propone seria:

10*12288 =122880 y
5/122880 = 0,00004069
 tenemos una diferencia de una multiplicación por 10000

digamos , luego tendría que multiplicarlo por 10000 para obtener el mismo resultado??
y como hago para que se vea el punto decimal solo con dos decimales ? en display 7 segmentos.
El programa que uso es Mikrobasic y el PIC es el 16F876
Desde ya muchas gracias...

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #85 en: 27 de Diciembre de 2011, 04:47:27 »

En la instrucción

Lcd_Config(PORTA,3,2,1,0,PORTB,0,1,2)

RW es el PORTB.1 pero si yo quiero poner RW en la LCD a tierra cómo se modifica la instrucción para que no lo tenga en cuenta ?

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #86 en: 27 de Diciembre de 2011, 05:41:37 »
Tienes que poner ceros en el termino que haga falta para suprimir los decimales.
5000000/122880
y si solo necesitas 2 decimales no es necesario realizar las operaciones con tantos decimales, así eliminas ceros. Es cuestión de probar en un papel hasta afinar el calculo y luego pasarlo al código fuente ya optimizado. En el índice  al que te lleva el enlace que puse anteriormente tienes varios ejemplos que usan el sistema.

Casi en todos los Basic existe una función del sistema en la que se indica la posición del digito de una variable y lo extrae de forma individual, se suele llamar “DIG”.

No uso Microbasic y mi lenguaje no tiene “DIG” ni Lcd_Config, por lo que a preguntas concretas sobre como se realiza alguna operación con funciones especiales para Microbasic no te puedo ayudar.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #87 en: 27 de Diciembre de 2011, 05:46:14 »
En algunos lenguajes, en los comandos del preprocesador  un determinado valor que no se usa se suele omitir y el compilador entiende que no se usa. Prueba a dejar las comillas juntas en el lugar de ese parámetro a ver que pasa, mientras que alguien que use tu mismo lenguaje te pueda contestar.
Saludos desde Granada, España.

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #88 en: 19 de Noviembre de 2012, 00:11:09 »
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 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...
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

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #89 en: 19 de Noviembre de 2012, 11:57:53 »
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 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...
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

Hola Jumu, adcon0 y adcon1 son los registros de control del ADC estos varian en dependecncia del PIC que desees utilizar.

el 142 se deduce a partir de la hoja de datos del pic, exactmente no se porque utilizaron ese valor ya que 142 en binario es 1000 1110, y como se objerva en la pagina 105 del datasheet los 4 bits menos significativos de ADCON1 son unimplemented, esto significa que no importa el valor que les asignes.

Por eso creo que debes cambiar esa linea por la siguiente

Código: [Seleccionar]
TRISA.0 = 1   'seleccionas pin A0 como entrada
ANSEL.0 = 1   'seleccionas pin A0 como entrada analogico

una vez hecho eso puedes seleccionar que pin utilizaras simplemente utilizando la funcion ADC_Read(0).
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA


 

anything