Autor Tema: Comenzando con Mikrobasic  (Leído 293541 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Comenzando con Mikrobasic
« Respuesta #360 en: 26 de Octubre de 2016, 06:12:55 »
Estuve revisando el manual del mikrobasic y no he encontrado nada que permita hacerlo, incluso revisando los foros hay gente que tiene el mismo problema y sin resultados. Té pongo un pequeño código que da formato con un decimal a los datos de tipo float. He intentado realizarlo en mikrobasic pero será que es una versión demo la que tengo y solo me tira errores.
Así que te la pego en versión de mi lenguaje Basic.

'Formateando los datos de tipo Float con 1 decimal
'By COS, Basic PSI
Hseropen 4800  'Abre puerto serie por hardware
main:
   Dim _float As Single  'Declara float
   Dim _txt As String  'Declara cadena
   _float = 0.123  'Asiga valor al float
   _txt = #_float  'Pasa a cadena el float

   Dim x As Byte  'Indice cadena
   Dim flag As Bit  'Control
   x = 0
   flag = 0
   While flag = 0  'Control bucle
      Hserout _txt(x)  'Parte entera al puerto serie
      If _txt(x) = "." Then flag = 1  'Flag de control
      x = x + 1  'Indice cadena
      If flag = 1 Then Hserout _txt(x)  'Parte decimal al puerto serie
   Wend
End

Con un poco más de tiempo se puede realizar una función que incluso permita indicar el numero de decimales que se desea mostrar.
« Última modificación: 26 de Octubre de 2016, 11:12:00 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Comenzando con Mikrobasic
« Respuesta #361 en: 26 de Octubre de 2016, 11:13:05 »
La versión con función y selección de numero de decimales:

'Función que da formato a los datos tipo Float
'By COS, Basic PSI
Hseropen 4800  'Abre puerto serie por hardware
main:
   Dim float As Single  'Declara float
   float = 0.1234  'Asiga valor al float
   Call floatformat(float, 2)  'Pasa a cadena con x decimales
   Hserout floatformat
   WaitMs 10

End                                               
'Da formato a los datos tipo Float
'Entrada: Float y numero de decimales
'Salida: Cadena
Function floatformat(_float As Single, _decimales As Byte) As String
   Dim x As Byte  'Indice cadena
   Dim flag As Bit  'Control
   x = 0
   flag = 0
   floatformat = #_float  'Pasa a cadena
   While flag = 0  'Control bucle
      If floatformat(x) = "." Then flag = 1  'Flag de control
      x = x + 1  'Indice cadena
      If flag = 1 Then
         x = x + _decimales
         floatformat(x) = 0  'Se marca fin de cadena
      Endif
   Wend
End Function 
Saludos desde Granada, España.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Comenzando con Mikrobasic
« Respuesta #362 en: 26 de Octubre de 2016, 21:57:48 »
Si amigo he investigado tambien, y mas o menos encontre algo parecido pero no lo habia probado.......dejame ver ese codigo y te aviso mil gracias por el aporte
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Comenzando con Mikrobasic
« Respuesta #363 en: 04 de Diciembre de 2016, 00:39:20 »
buenas noches amigo traigo otro problemita con esto de los decimales.............el programa que muestro abajo es para mostrar en una LCD las revoluciones de un PAP con una caja de reduccion  tiene un boton para subir y otro para bajar las revoluciones con un paso de 0.1 en el programa uso 2 maneras de manejar los decimales pero ambas no funcionan muy bien en la primera linea del LCD uso una rutina basada en la variable tlong uso 2 enteros y un decimal............pero no se ven los decimales solo el cero, el segundo uso la conversion de floar a string pero despues del punto decimal muestas varios decimales.........pero si se aprecia el salto de 0.1 alguien puede darme una ayudita????

program ArribaAbajo

dim Cont_H, Cont_L, oldstate_a, oldstate_b,TEA, TEB, Ret, SLCD, ch as byte

    txt as char[7]

    VR, Valor as word

    RPM, RPS, FE, RR, NPPG, NPPP as float

    tlong   as  longint

' Configuracion de los pines de LCD
sub procedure Interrupt()
       Cont_H = Hi(VR)          ' Valor alto del TMR0
       TMR0H = Cont_H
       Cont_L = Lo(VR)          ' Valor Bajo del TMR0
       TMR0L = Cont_L
       INTCON.TMR0IF = 0        ' Limpia la bandera de interrupcion del TMR0
       PORTC.0 = 1              ' Activa el Pin C.0 para controlar el PAP
       for Ret = 0 to 3
       next Ret
       PORTC.0 = 0              ' Apaga el Pic C.0 para quenerar un pulso
end sub

main:
' Datos para calcular el valor del TMR0
  FE = 16000000                 ' Frecuencia de trabajo de Entrada
  NPPP = 16                     ' Numero de Pulsos Por Pulso
  NPPG = 200                    ' Numero de Pulsos Por Giro
  RR = 15.3                     ' Relacion de Reduccion
 
' Datos para calcular el valor del TMR0
  TEA = 0
  TEB = 0
  oldstate_a = 0
  oldstate_b = 0
  ANSEL  = 0                    ' Configura los AN como I/O Digitales
  ANSELH = 0
  TRISB = $F0                   ' Configuracion del PORTB
  PORTB = $0F                   ' Configuracion de salida del PORTB
  TRISC.0 = 0                   ' El Puerto C es Digital
  PORTC.0 = 0                   ' Initialize PORTB
  RPM = 0                       ' Valor de inicializacion del TMR0
  INTCON = %11100000            ' Activacion del TMRO
  T0CON = %10001000             ' Configuracion de la entrada del
                                ' TMRO y el PRESCALER (Se desactivo el Pres)
  Lcd_Init(PORTC)
  Delay_ms(2)
 
  LCD_Cmd(LCD_CLEAR)            ' lear display
  Delay_ms(2)
 
  LCD_Cmd(LCD_CURSOR_OFF)       ' turn cursor off
  Delay_ms(2)
 
  Lcd_Out(1, 1,"RPM:" )
  Delay_ms(2)

  while TRUE

  tlong = RPM * 100
     
  ch = (tlong / 1000) mod 10    ' extract 10 digit
  LCD_Chr(1,7,48+ch)            ' write ASCII digit at 2nd row, 9th column

  ch = (tlong / 100) mod 10     ' extract 1 digit
  LCD_Chr_CP(48+ch)             ' write ASCII digit at cursor point

  LCD_Chr_CP(".")

  ch = (tlong / 10) mod 10      ' extract .1 digit
  LCD_Chr_CP(48+ch)             ' write ASCII digit at cursor point

  FloatTostr(RPM, txt)          ' Transforma el Conteo de RPM en String
  Lcd_Out(2, 7, txt)            ' Muestra RPM en el LCD

' Rutina para Subir y bajar el valor de contador
' Boton de bajar el valor de las RPM, Si se mantiene pulsada
' por mas de un segundo incrementa 0.5 en cada paso

  if Button(PORTB, 4, 1, 1) then
     oldstate_a = 1
     if TEA >= 60 then          ' Si se mantiene pulsado por mas de un segundo
        Delay_ms(300)           ' activa una rutina de Icrementos de 0.5 a la Vez
        RPM = RPM + 0.5
        if RPM >= 70.0 then
           RPM = 70.0
        end if
    else
        Delay_ms(1)
        TEA = TEA + 1
    end if
  end if
  if oldstate_a and Button(PORTB, 4, 1, 0) then
     if TEA <= 59 then          ' Si se suelta el boton antes de segundo
        RPM = RPM + 0.1         ' no hace ninguno incremento
     end if
     if RPM >= 70.0 then
        RPM = 70.0
     end if                     ' Se reinicia la deteccion de tecla pulsada
     TEA = 0
     oldstate_a = 0
  end if

' Boton de bajar el valor de las RPM, Si se mantiene pulsada
' por mas de un segundo incrementa 0.5 en cada paso

  if Button(PORTB, 5, 1, 1) then
     oldstate_b = 1
     if TEB >= 60 then
        Delay_ms(300)
        RPM = RPM - 0.5
        if RPM <= 0.1 then
           RPM = 0.1
        end if
    else
        Delay_ms(1)
        TEB = TEB + 1
    end if
  end if
  if oldstate_b and Button(PORTB, 5, 1, 0) then
     if TEB <= 59 then
        RPM = RPM - 0.1
     end if
     if RPM <= 0.1 then
        RPM = 0.1
     end if
     TEB = 0
     oldstate_b = 0
  end if
 
' Calculo de las RPS
 
  RPS = RPM / 60
 
' Calculo del valor del TMR0 para Dividir La Frecuencia
' de salida para el Driver de PAP

  VR = 65536 - ( FE / ( NPPP * NPPG * RPS * RR ))
 
  wend
end.
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Comenzando con Mikrobasic
« Respuesta #364 en: 04 de Diciembre de 2016, 21:26:28 »
¿Qué micro estas usando?.
Saludos desde Granada, España.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Comenzando con Mikrobasic
« Respuesta #365 en: 05 de Diciembre de 2016, 14:43:43 »
Huy disculpen uso el 18F25K20.............
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Comenzando con Mikrobasic
« Respuesta #366 en: 06 de Diciembre de 2016, 08:33:30 »
Pues a mi me sale como en la imagen:

Creo que tienes algún error en las funciones del LCD, te recomiendo que hagas pruebas con la rutina de los enteros + decimal fuera del programa.
Saludos desde Granada, España.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Comenzando con Mikrobasic
« Respuesta #367 en: 06 de Diciembre de 2016, 10:16:55 »
Explicame que hciste????
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Comenzando con Mikrobasic
« Respuesta #368 en: 06 de Diciembre de 2016, 16:00:08 »
No he hecho nada, solo la traducción a mi lenguaje que es muy similar al que usas.
Cambie los comandos para el manejo del LCD que son diferentes y pare el TMR0 para acelerar la simulación.
Por lo que se deduce que te fallan las funciones para el control del LCD.

'Program arribaabajo
Include "_Button.bas"
Define SIMULATION_WAITMS_VALUE = 1  'Acelera los delayms
'Configura LCD
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTC  'Bus de datos sera el puerto C
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto C
Define LCD_RSREG = PORTC  'Bit de control RS sera del puerto C
Define LCD_RSBIT = 7  'Se usara el RC7 como RS
Define LCD_EREG = PORTC  'Bit de control E sera del puerto C
Define LCD_EBIT = 6  'Se usara el RC6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.

Dim cont_h As Byte
Dim cont_l As Byte
Dim oldstate_a As Byte
Dim oldstate_b As Byte
Dim tea As Byte
Dim teb As Byte
Dim ret As Byte
Dim slcd As Byte
Dim ch As Byte

'Dim txt As String

Dim vr As Long  'word
Dim valor As Word

Dim rpm As Single
Dim rps As Single
Dim fe As Single
Dim rr As Single
Dim nppg As Single
Dim nppp As Single

Dim tlong As Long

main:
   'Datos para calcular el valor del TMR0
   fe = 16000000  'Frecuencia de trabajo de Entrada
   nppp = 16  'Numero de Pulsos Por Pulso
   nppg = 200  'Numero de Pulsos Por Giro
   rr = 15.3  'Relacion de Reduccion

   'Datos para calcular el valor del TMR0
   tea = 0
   teb = 0
   oldstate_a = 0
   oldstate_b = 0
   AllDigital  'TODAS LAS ENTRADAS COMO DIGITALES
   'ansel = 0  'Configura los AN como I/O Digitales
   'anselh = 0

   TRISB = $f0  'Configuracion del PORTB
   TRISB.4 = 1
   PORTB = $0f  'Configuracion de salida del PORTB
   TRISC.0 = 0  'El Puerto C es Digital
   PORTC.0 = 0  'Initialize PORTB
   rpm = 0  'Valor de inicializacion del TMR0
   'INTCON = %11100000  'Activacion del TMRO
   'T0CON = %10001000  'Configuracion de la entrada del tmro y el prescaler(se desactivo el pres)
   Lcdinit  'lcd_init(PORTC)
   WaitMs 2

   Lcdcmdout LcdClear  'lcd_cmd(lcd_clear)  'lear display
   WaitMs 2

   'lcd_cmd(lcd_cursor_off)  'turn cursor off
   WaitMs 2

   Lcdcmdout LcdLine1Pos(1)
   Lcdout "RPM:"
   WaitMs 2

   Dim _true As Byte

   While _true = _true
      tlong = rpm * 100

      ch = (tlong / 1000) Mod 10  'extract 10 digit
      Dim aux_ch As Byte
      aux_ch = 48 + ch
      
      Lcdcmdout LcdLine1Pos(7)
      Lcdout aux_ch  'write ASCII digit at 2nd row, 9th column

      ch = (tlong / 100) Mod 10  'extract 1 digit
      aux_ch = 48 + ch
      Lcdout aux_ch  'lcd_chr_cp(48 + ch)  'write ASCII digit at cursor point

      Lcdout "."  'lcd_chr_cp(".")

      ch = (tlong / 10) Mod 10  'extract .1 digit
      aux_ch = 48 + ch
      Lcdout aux_ch  'write ASCII digit at cursor point

      Lcdcmdout LcdLine2Pos(7)
      Lcdout #rpm  'lcd_out(2, 7, txt)  'Muestra RPM en el LCD

      'Rutina para Subir y bajar el valor de contador
      'Boton de bajar el valor de las RPM, Si se mantiene pulsada
      'por mas de un segundo incrementa 0.5 en cada paso

      If _button(port_b, 4, 1, 1) > 0 Then
         oldstate_a = 1
         If tea >= 5 Then  'Si se mantiene pulsado por mas de un segundo
            WaitMs 300  'activa una rutina de Icrementos de 0.5 a la Vez
            rpm = rpm + 0.5
            If rpm >= 70.0 Then rpm = 70.0
         Else
            WaitMs 1
            tea = tea + 1
         Endif
      Endif
      If oldstate_a > 0 And _button(port_b, 4, 1, 0) > 0 Then
         If tea <= 59 Then  'Si se suelta el boton antes de segundo
            rpm = rpm + 0.1  'no hace ninguno incremento
         Endif
         If rpm >= 70.0 Then
            rpm = 70.0
         Endif  'Se reinicia la deteccion de tecla pulsada
         tea = 0
         oldstate_a = 0
      Endif

      'Boton de bajar el valor de las RPM, Si se mantiene pulsada
      'por mas de un segundo incrementa 0.5 en cada paso

      If _button(port_b, 5, 1, 1) > 0 Then
         oldstate_b = 1
         If teb >= 60 Then
            WaitMs 300
            rpm = rpm - 0.5
            If rpm <= 0.1 Then
               rpm = 0.1
            Endif
         Else
            WaitMs 1
            teb = teb + 1
         Endif
      Endif
      If oldstate_b > 0 And _button(port_b, 5, 1, 0) > 0 Then
         If teb <= 59 Then
            rpm = rpm - 0.1
         Endif
         If rpm <= 0.1 Then
            rpm = 0.1
         Endif
         teb = 0
         oldstate_b = 0
      Endif

      'Calculo de las RPS

      rps = rpm / 60

      'Calculo del valor del TMR0 para Dividir La Frecuencia
      'de salida para el Driver de PAP

      vr = 65536 - (fe / (nppp * nppg * rps * rr))

   Wend
End                                               
'Configuracion de los pines de LCD
On Low Interrupt
   cont_h = vr.HB  'Valor alto del TMR0
   TMR0H = cont_h
   cont_l = vr.LB  'Valor Bajo del TMR0
   TMR0L = cont_l
   INTCON.TMR0IF = 0  'Limpia la bandera de interrupcion del TMR0
   PORTC.0 = 1  'Activa el Pin C.0 para controlar el PAP
   For ret = 0 To 3
   Next ret
   PORTC.0 = 0  'Apaga el Pic C.0 para quenerar un pulso
Resume
« Última modificación: 06 de Diciembre de 2016, 21:01:37 por dogflu66 »
Saludos desde Granada, España.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Comenzando con Mikrobasic
« Respuesta #369 en: 07 de Diciembre de 2016, 00:56:40 »
ok que lenguaje usas???
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Comenzando con Mikrobasic
« Respuesta #370 en: 07 de Diciembre de 2016, 05:18:37 »
Lenguaje Basic PSI (PicSimulatorIde).
Saludos desde Granada, España.


 

anything