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

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

Desconectado klibert

  • PIC10
  • *
  • Mensajes: 3
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #60 en: 04 de Diciembre de 2009, 13:58:49 »
PROGRAMA CONTROL POR ORDENADOR NIVEL INDUSTRIAL para ESTUDIANTES


program PIC_LCD_PC
' CONECCIONE AL LCD
DIM LCD_RS AS SBIT AT RD2_BIT
    LCD_EN AS SBIT AT RD3_BIT
    LCD_D4 AS SBIT AT RD4_BIT
    LCD_D5 AS SBIT AT RD5_BIT
    LCD_D6 AS SBIT AT RD6_BIT
    LCD_D7 AS SBIT AT RD7_BIT

    LCD_RS_Direction as sbit at TRISD2_BIT
    LCD_EN_Direction as sbit at TRISD3_BIT
    LCD_D4_Direction as sbit at TRISD4_BIT
    LCD_D5_Direction as sbit at TRISD5_BIT
    LCD_D6_Direction as sbit at TRISD6_BIT
    LCD_D7_Direction as sbit at TRISD7_BIT
'FIN CONECCIOM LCD

DIM TXT1, TXT2, TXT3, TXT4, TXT5, TXT6, TXT7, TXT8 AS STRING[19]

    TEXTO AS STRING[17]
    UART_RD AS BYTE
    CONT AS BYTE
    ON_L1 AS BYTE

DIM TEXTO1, TEXTO2, TEXTO3, TEXTO4, TEXTO5, TEXTO6, TEXTO7, TEXTO8 AS STRING[43]

DIM    TECLA1, TECLA2, TECLA3, TECLA4, TECLA0 AS BIT
SUB PROCEDURE CLEARSCREEN()
DIM I AS BYTE
    FOR i = 0 TO  190
        UART1_Write(0X08)
    NEXT I
END SUB

SUB PROCEDURE SALTARLINEA()
     UART1_Write(0X0D)
     UART1_Write(0X0A)
END SUB

SUB PROCEDURE MENU()
     UART1_Write(0X0D)
     UART1_Write(0X0A)
     UART1_Write_Text("PRESIONAR UNA TECLA PARA ACTIVAR/DESACTIVAR")
     UART1_Write(0X0D)
     UART1_Write(0X0A)
     SALTARLINEA()
     IF TECLA1=1 THEN
       UART1_Write_Text(TEXTO5)
       ELSE
       UART1_Write_Text(TEXTO1)
     END IF
     UART1_Write(0X0D)
     UART1_Write(0X0A)
     IF TECLA2=1 THEN
       UART1_Write_Text(TEXTO6)
       ELSE
       UART1_Write_Text(TEXTO2)
     END IF
     UART1_Write(0X0D)
     UART1_Write(0X0A)
     IF TECLA3=1 THEN
       UART1_Write_Text(TEXTO7)
       ELSE
       UART1_Write_Text(TEXTO3)
     END IF
     UART1_Write(0X0D)
     UART1_Write(0X0A)
     IF TECLA4=1 THEN
       UART1_Write_Text(TEXTO8)
       ELSE
       UART1_Write_Text(TEXTO4)
     END IF
     UART1_Write(0X0D)
     UART1_Write(0X0A)
END SUB

MAIN:
TRISD = 0
PORTD = 0x00
TRISD = 0x00
TRISC = %10000001
PORTC = 0X00
UART1_INIT(4800)
DELAY_MS(100)

TECLA1=0
TECLA2=0
TECLA3=0
TECLA4=0
TECLA0=0

TXT1="FOCO ACTIVADO"
TXT2="FOCO DESACTIVADO"
TXT3="MOTOR ACTIVADO"
TXT4="MOTOR DESACTIVADO"
TXT5="VALVULA ACTIVADA"
TXT6="VALVULA DESACTIVADA"
TXT7="SISTEMA ACTIVADO"
TXT8="SISTEMA DESACTIVADO"


TEXTO1="TECLA # 1  ---- FOCO DESACTIVADO"
TEXTO2="TECLA # 2  ---- VALVULA DESACTIVADA"
TEXTO3="TECLA # 3  ---- MOTOR DESACTIVADO"
TEXTO4="TECLA # 4  ---- SISTEMA DESACTIVADO"

TEXTO5="TECLA # 1  ---- FOCO ACTIVADO"
TEXTO6="TECLA # 2  ---- VALVULA ACTIVADA"
TEXTO7="TECLA # 3  ---- MOTOR ACTIVADO"
TEXTO8="TECLA # 4  ---- SISTEMA ACTIVADO"

Lcd_init()
LCD_CMD(_LCD_CLEAR)
LCD_CMD(_LCD_CURSOR_OFF)
MENU()
while (TRUE)
                             ' Endless loop
                             
    WHILE PORTC.0 = 1
         PORTC.1 = 1
         LCD_CMD(_LCD_CLEAR)
         Lcd_Out(1,6,"ERROR")
         Lcd_Out(2,1,"ALARMA ACTIVADA")
         DELAY_MS(200)
    WEND
    PORTC.1 = 0

    if (UART1_Data_Ready() <> 0) then      ' If data is received,
      uart_rd = UART1_Read()               '   read the received data,
'---------------------------------------
      IF (UART_RD = "1") THEN
         TECLA1 = NOT TECLA1
         IF  TECLA1=1 THEN
             LCD_CMD(_LCD_CLEAR)
             Lcd_Out(1,1,TXT1)
             SETBIT(PORTC, 2)
             CLEARSCREEN()
             MENU()
         END IF
         IF TECLA1=0 THEN
            LCD_CMD(_LCD_CLEAR)
            Lcd_Out(1,1,TXT2)
            CLEARBIT(PORTC, 2)
             CLEARSCREEN()
             MENU()
         END IF
      END IF
'---------------------------------------
      IF (UART_RD = "2") THEN
         TECLA2 = NOT TECLA2
         IF  TECLA2=1 THEN
             LCD_CMD(_LCD_CLEAR)
             Lcd_Out(1,1,TXT3)
             SETBIT(PORTC, 3)
             CLEARSCREEN()
             MENU()
         END IF
         IF TECLA2=0 THEN
            LCD_CMD(_LCD_CLEAR)
            Lcd_Out(1,1,TXT4)
            CLEARBIT(PORTC, 3)
             CLEARSCREEN()
             MENU()
         END IF
      END IF
'---------------------------------------
'---------------------------------------
      IF (UART_RD = "3") THEN
         TECLA3 = NOT TECLA3
         IF  TECLA3=1 THEN
             LCD_CMD(_LCD_CLEAR)
             Lcd_Out(1,1,TXT5)
             SETBIT(PORTC, 4)
             CLEARSCREEN()
             MENU()
         END IF
         IF TECLA3=0 THEN
            LCD_CMD(_LCD_CLEAR)
            Lcd_Out(1,1,TXT6)
            CLEARBIT(PORTC, 4)
             CLEARSCREEN()
             MENU()
         END IF
      END IF
'---------------------------------------
'---------------------------------------
      IF (UART_RD = "4") THEN
         TECLA4 = NOT TECLA4
         IF  TECLA4=1 THEN
             LCD_CMD(_LCD_CLEAR)
             Lcd_Out(1,1,TXT7)
             SETBIT(PORTC, 5)
             CLEARSCREEN()
             MENU()
         END IF
         IF TECLA4=0 THEN
            LCD_CMD(_LCD_CLEAR)
            Lcd_Out(1,1,TXT8)
            CLEARBIT(PORTC, 5)
             CLEARSCREEN()
             MENU()
         END IF
      END IF
'---------------------------------------
    end if
  wend

end.

Desconectado klibert

  • PIC10
  • *
  • Mensajes: 3
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #61 en: 04 de Diciembre de 2009, 14:03:49 »
EL CODIGO ANTERIOR ESTA ECHO EN MIKROBASIC PRO FOR PIC 2009

Desconectado wicho1991

  • PIC10
  • *
  • Mensajes: 3
Re: analogico digital
« Respuesta #62 en: 13 de Mayo de 2010, 00:31:59 »
hola   a  todos   soy  nuevo en esto solo  quiero saber  cual es  el codigo en mickrobasic  para activar  la  entrada  analogica digital  y como  puedo hacer para  convertir el pulso de un microfono

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: analogico digital
« Respuesta #63 en: 13 de Mayo de 2010, 14:18:24 »
Tienes que configurar los registros ANSEL y ANSELH para los PIC16 para los PIC18 tienes que configurar los registros ADCON1 segun lo especifique la hoja de datos, luego debes utilizar la funcion ADC_Read(dim channel as byte) en la que mandaras a leer el canal especificado por la misma.

El ejemplo que se encuentra en la ayuda de MikroBasic es el siguiente.
Código: FreeBasic
  1. program ADC_on_LEDs
  2. DIM adc_rd AS word
  3.  
  4. main:
  5.     ANSEL  = 0x04           ' Configure AN2 pin as analog
  6.     TRISA  = 0xFF           ' PORTA is input
  7.     ANSELH = 0              ' Configure other AN pins as digital I/O
  8.     TRISC  = 0x3F           ' Pins RC7, RC6 are outputs
  9.     TRISB  = 0              ' PORTB is output
  10.  
  11.   WHILE (TRUE)
  12.     adc_rd = ADC_Read(2)    ' get ADC value from 2nd channel
  13.     PORTB = adc_rd          ' display adc_rd[7..0]
  14.     PORTC = Hi(adc_rd)      ' display adc_rd[9..8]
  15.   WEND
  16.  
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

Desconectado NORTEÑO

  • PIC10
  • *
  • Mensajes: 32
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #64 en: 09 de Junio de 2010, 10:27:59 »
Un saludo a todos.
Propongo un ejemplo Facil.
Un pulsador Biestable. Primera pulsacion enciende un led, segunda pulsacion apaga el led.

Mas adelante podriamos complicarlo

RECORDAD EN MIKROBASIC.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda lectura ADC y leerlo en LCD
« Respuesta #65 en: 04 de Agosto de 2010, 21:33:18 »
Saludos.

Estoy trabajando en MikroBasic.
Estoy realizando la lectura de variacion de voltaje que llega al AN0 del ADC del PIC877, por esa parte no tengo problemas.
configuré variables de tipo word para guardar lo convertido, de tipo float para operaciones con decimales.
Lo que no se es cómo hacerle para que me muestre solamente 2 decimales despues del punto (ej: 2.35), tambien, además ya como 3 días que estoy tratando de ver la informacion que quiero en la LCD de forma correcta, pero no lo logro, quiero mostrarlo en dos líneas, pero nada, todo se muestra en la línea 1, no pasa a la linea 2 del LCD.

El código es el siguiente:

Código: [Seleccionar]
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.

pusiera la imagen de la LCD en simulacion, pero no se cómo poner imágenes ni subir archivos.

Muchas gracias.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #66 en: 24 de Agosto de 2010, 12:13:04 »
Saludos, ya solucione el problema, ahora estoy teneiendo problemas con la TX serial (PIC a PC), no logro ahcer que funciones como se debe

Código: [Seleccionar]
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.

en el LCD muestra como debe ser, pero no logro que se haga la transmision.

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 646
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #67 en: 28 de Agosto de 2010, 12:04:24 »
Hola buenos dias, tengo una duda en MKB, les explico para ver si me hago entender tengo un pic16f877a el cual tengo conectada una lcd 16x2 en dicha lcd quiero mostrar valores que recibo por puerto serial es decir que me lo envio desde la pc y la idea es  mostrar esos valores en la lcd en hex es decir si envio 1E que en la lcd visualice 1E pero ya verdad nose como hacer la transformacion para que la liberia de las lcd me visualice eso yo lo hago pero muestro es el valor en decimal es decir envio 1E y veo 30 que es un valor en decimal como podria verlo en la lcd en hex.

Saludos y espero su valiosa colaboracion.

Atten.
Alexander Santana.
Venezuela-Barcelona
« Última modificación: 29 de Agosto de 2010, 10:47:37 por ASTROCAR »
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #68 en: 30 de Agosto de 2010, 00:02:22 »
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 esto

Código: FreeBasic
  1. SUB procedure imprime_Hexadecimal(num)
  2.   DIM i,nibble_inferior AS byte     'declaramos el byte nibble_inferior
  3.   FOR i=0 TO 2                      'hacemos que haga esto 2 veces
  4.     asm                             'inicio del bloque ensamblador
  5.       SWAP num,1                    'intercambiamos los nibbles del numero
  6.     END asm                         'fin del bloque ensamblador
  7.     nibble_inferior=num AND 00001111 'extraemos el nibble inferior del numero
  8.     IF(nibble_inferior<10)           'si el nibble inferior es menor a 10
  9.       nibble_inferior=nibble_inferior+'0'   'guardamos valor ascii del numero
  10.     ELSE                                    'de lo contrario
  11.       nibble_inferior=nibble_inferior+55    'guardamos valor ascii de la letra (A=65)
  12.     END IF
  13.     Lcd_Chr_CP(nibble_inferior)      'imprime el nibble inferior
  14.   NEXT i
  15. END SUB
  16.  

Si imprime 3 caracteres debes poner el limite del for en 1.

 :-/ suerte.
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

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 646
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #69 en: 30 de Agosto de 2010, 23:43:03 »
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 esto

Código: FreeBasic
  1. SUB procedure imprime_Hexadecimal(num)
  2.   DIM i,nibble_inferior AS byte     'declaramos el byte nibble_inferior
  3.   FOR i=0 TO 2                      'hacemos que haga esto 2 veces
  4.     asm                             'inicio del bloque ensamblador
  5.       SWAP num,1                    'intercambiamos los nibbles del numero
  6.     END asm                         'fin del bloque ensamblador
  7.     nibble_inferior=num AND 00001111 'extraemos el nibble inferior del numero
  8.     IF(nibble_inferior<10)           'si el nibble inferior es menor a 10
  9.       nibble_inferior=nibble_inferior+'0'   'guardamos valor ascii del numero
  10.     ELSE                                    'de lo contrario
  11.       nibble_inferior=nibble_inferior+55    'guardamos valor ascii de la letra (A=65)
  12.     END IF
  13.     Lcd_Chr_CP(nibble_inferior)      'imprime el nibble inferior
  14.   NEXT i
  15. END SUB
  16.  

Si imprime 3 caracteres debes poner el limite del for en 1.

 :-/ suerte.

Gracias por tu gentil respuesta en la brevedad lo pruebo y te comento de momento tiene mucha logica y hasta ya lo tenia en mente pero hacer toda la rutina en asm y agregarla al codigo que estoy haciendo.

Saludos.
Atten.
Alexander Santana.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 646
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #70 en: 31 de Agosto de 2010, 15:18:03 »
Hola buenas tardes, hoy experimentando nuevamente con el mkb le note utra deficiencia estaba declarando un arreglo  para tener un buffer y no me permite mas de 50 items lo que quieres decir es que se me dificulta a la hora de  tener un buffer para cargas valores de una eeprom.


Saludos y es sin menos preciar el mikrobasic pero son limitantes que hay que tenerlas encuenta a la hora de realizar aplicaciones con requerimientos como una variable buffer para cargas valores tipo byte una eeprom por ejemplo si quiero leer sus primeras 256 direcciones no puedo almacenar esos valores temporarmente.

Atten.
Alexander Santana.
Barcelona-Venezuela.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado marcelo2112

  • PIC12
  • **
  • Mensajes: 62
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #71 en: 01 de Octubre de 2010, 09:23:07 »
Borrar. Gracias
« Última modificación: 06 de Octubre de 2010, 14:47:25 por marcelo2112 »

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #72 en: 12 de Noviembre de 2010, 18:04:32 »
Perdonen pero que significa ASG   lo he visto en varios programas

Desconectado cosmic

  • PIC16
  • ***
  • Mensajes: 140
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #73 en: 09 de Abril de 2011, 18:40:49 »
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:

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Ejemplitos de Mikrobasic y Proteus
« Respuesta #74 en: 10 de Abril de 2011, 00:55:09 »
Perdonen pero que significa ASG   lo he visto en varios programas

Sería mejor que pongas una referencia de donde viste eso, ya que yo no he visto nunca eso, posiblemente se refiera a una variable o algo así.

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:

Para crear una nueva librería lo unico que tienes que hacer es crear un nuevo archivo *.bas y luego lo guardas en la carpeta del proyecto y finalmente lo mandas a llamar con la instrucción Include en el archivo principal.

Si lo que deseas es utilizar una librería hecha, lo más probable es que la encuentres para código C y por ello tendrás que adaptarla a MikroBasic.
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