Autor Tema: PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)  (Leído 860058 veces)

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #645 en: 07 de Mayo de 2010, 04:51:34 »


hola amigos estoy programando el pic12f675 para controlar la potencia de un lampara de 230 v 0%      a  100% con un potenciometro que esta conectado a la pata 1 del micro12f675 ...cruce por zero pata2    pata0 conectada al optotriac despues del optotriac tenemos triac entonces jugamos del desparo del traic


Define ADC_CLOCK = 3  'Set clock source (3=rc)
Define ADC_SAMPLEUS = 50  'Set sampling time in uS

TRISIO = %00000110
ADCON0 = 0x0e
TRISIO.1 = 1
TRISIO.2 = 1
TRISIO.0 = 0
Dim t2400 As Word
Const con = 396
Dim adval As Byte
Dim voltatge As Word
Dim angle2 As Word
Dim k As Byte
Symbol triac = GP0
ADCON0.7 = 1
ANSEL = %00000010
CMCON = 7

inici: Adcin 1, adval
voltatge = (adval * 500) / 1023  'Equates to: (adval * 500)/1024

If GP2 = 1 And voltatge = 50 Then
GP0 = 1
Endif

   


            Select Case 32

angle2 = angle2 - 960
If angle2 < 0 Then
angle2 = 0
Endif
   
               Select Case 33

angle2 = angle2 + 960
If angle2 > 9000 Then
angle2 = 9000
Endif



Goto inici

End                                              

_______________________________________

Hola messi1980, no entiendo la consulta, de todos modos así creo que queda mejor el código.

Código: vb.net
  1. Define ADC_CLOCK = 3  'Set clock source (3=rc)
  2. Define ADC_SAMPLEUS = 50  'Set sampling time in uS
  3.  
  4. ADCON0.7 = 1
  5. ANSEL = %00000010
  6. CMCON = 7
  7. TRISIO = %00000110
  8. ADCON0 = 0x0e
  9. TRISIO.1 = 1
  10. TRISIO.2 = 1
  11. TRISIO.0 = 0
  12.  
  13. Symbol triac = GP0
  14. Const con = 396
  15. Dim t2400 As Word
  16. Dim adval As Byte
  17. Dim voltatge As Word
  18. Dim angle2 As Word
  19. Dim k As Byte
  20.  
  21. inici:
  22.         Adcin 1, adval
  23.         voltatge = (adval * 500) / 1023  'Equates to: (adval * 500)/1024
  24.  
  25.         If GP2 = 1 And voltatge = 50 Then GP0 = 1
  26.  
  27.         Select Case voltatge  '???????????????, variable a comparar
  28.                 Case 32
  29.                         angle2 = angle2 - 960
  30.                         If angle2 < 0 Then angle2 = 0
  31.  
  32.                 Case 33
  33.                         angle2 = angle2 + 960
  34.                         If angle2 > 9000 Then angle2 = 9000
  35.         EndSelect
  36. Goto inici
  37. End
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #646 en: 10 de Mayo de 2010, 17:45:02 »
Hola dogflu:

Mira estoy intentando ver si puedo incluir unas temporizaciones largas en mi programa y me ´he basasdo un poco en la funcion de 3 bases de tiempos con el timer1 que publicaste en el post 5767.

Al no funcionarme he ido eliminando cosas y al final me he quedado solo con el ejemplo de la funcion publica y su correspondiente ejemplo de llamada a esa funcion en el ejemplo 577. y cual es mi sorpresa que al compilar me da error en la linea del "include" de la llamada a esa funcion.
¿cual crees que puede ser la causa?
No adjunto mi fichero, por que ahora solo tengo tu ejemplo y no lo compila.
Gracias de antemano

fermin
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #647 en: 11 de Mayo de 2010, 05:05:32 »
Hola, he copiado el ejemplo desde el foro por si me equivoque al pegar el código y, me compila correctamente. Lo único que te puedo decir es que te asegures que tienes una versión del PSI que permita los “Include” y, que te acuerdes de guardar el código de la función que inserta el “Include”, con el mismo nombre que busca este. Y mismo directorio del programa principal para que lo encuentre.
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #648 en: 11 de Mayo de 2010, 06:03:24 »
Gracias por la pronta respuesta don Carlos

Los ficheros los tengo en el mismo directorio y lo mas probable es que no me permita el include.
Creo que tengo la ultima version demo y quizas sea por eso.

El siguente paso va a ser el comprar la licencia.

F.
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #649 en: 27 de Mayo de 2010, 19:31:37 »
Dejo un antiguo programita de ejemplo para practicar con la EEProm interna del PIC18F1320.
Para saber más sobre este tema leer en el índice del hilo sobre el Ejemplo 17 para Pic16F88.

Código: vb.net
  1. Define CONFIG1L = 0x00
  2. Define CONFIG1H = 0x08
  3. Define CONFIG2L = 0x0e
  4. Define CONFIG2H = 0x00
  5. Define CONFIG3L = 0x00
  6. Define CONFIG3H = 0x00
  7. Define CONFIG4L = 0x80
  8. Define CONFIG4H = 0x00
  9. Define CONFIG5L = 0x03
  10. Define CONFIG5H = 0xc0
  11. Define CONFIG6L = 0x03
  12. Define CONFIG6H = 0xe0
  13. Define CONFIG7L = 0x03
  14. Define CONFIG7H = 0x40
  15. Define CLOCK_FREQUENCY = 8
  16. '************************************************************************************************
  17. 'NOMBRE:18F1320_PicEBasic_LCD_ADC_EEProm, Ejemplo 17
  18. 'MICRO: PIC18F1320/8Mhz reloj interno
  19. 'By dogflu66, 5/10
  20. 'Uso de la EEProm para llevar la cuenta de veces que Arranca/Reset la placa
  21. 'Configuración del LCD con bus de datos a 4Bit y sin pin de RW
  22. 'Configuracion del módulo ADC
  23. '************************************************************************************************
  24. '-------------------------------------Puertos del LCD---------------------------------------------
  25. Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
  26. Define LCD_DREG = PORTA  'El bus de datos sera el puerto A
  27. Define LCD_DBIT = 0  'El bus de datos seran los 4 bit menos significativos del puerto A
  28. Define LCD_RSREG = PORTB  'El bit de control RS sera del puerto B
  29. Define LCD_RSBIT = 7  'Se usara el RB7 como RS
  30. Define LCD_EREG = PORTB  'El bit de control E sera del puerto B
  31. Define LCD_EBIT = 6  'Se usara el RB6 como E
  32. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  33. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  34. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  35. '------------------------------------------------------------------------------------------------------
  36. 'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  37. '--Configura el modulo UART--
  38. Hseropen 4800
  39. '------------------------------------Definicion de puertos------------------------------------------
  40. ADCON1 = %1101111  'Configuracion pin, 1= digitales, 0 = analogicos (AN4)
  41. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  42. TRISA = 0x00  'Configuracion puerto A como salidas
  43. TRISB = %00000001  'Puerto B como salidas, AN4 input
  44. ADCON0 = %00010001  'Vref = AVdd y AVss, CH4, ADC ON
  45. ADCON2 = %10101101  '10Bit, 11Tad, Fosc/16 (8Mhz=1Tad=2uSeg.)
  46. 'ADCON2 = %10101110  '10Bit, 11Tad, Fosc/64 (20Mhz=1Tad=3.2uSeg.)
  47. 'Variables globales
  48. Dim _getadc As Word
  49. '------------------------------------Inicio------------------------------------------------------------
  50. Lcdinit  'Inicializa el lcd sin cursor
  51. WaitMs 500  'Pausa para estabilizar
  52. '************* Rutina del programa ***************************************
  53. Gosub actualiza_eeprom  'actualiza la eeprom, salto con retorno
  54. RA7 = 0  'salida led amarillo
  55. RB0 = 0  'salida led verde
  56. WaitMs 5000  'espera 5 Seg.
  57. main:  'comienza la rutina principal
  58.         RA7 = 1  'salida led amarillo
  59.         RB0 = 1  'salida led verde
  60.         WaitMs 500  'espera 0,5 Seg.
  61.         RB0 = 0  'salida led verde
  62.         WaitMs 500  'espera 0,5 Seg.
  63.         RA7 = 0  'salida led amarillo
  64.         WaitMs 500  'espera 0,5 Seg.
  65. Goto main  'impide que termine la rutina main
  66. End                                              
  67. actualiza_eeprom:  'comprueba si la eeprom fue escrita, si no la inicializa y comienza el contaje
  68.         Dim nn As Byte
  69.         Dim dato_eeprom(10) As Byte
  70.         For nn = 0 To 4  'bucle para recorrer las primeras posiciones de memoria
  71.                 Read nn, dato_eeprom(nn)  'se asigna de la direccion "nn" el dato a la variable dato_eeprom(n)
  72.         Next nn  'acota el bucle For
  73.  
  74.         Hserout "Datos Arranque: ", #dato_eeprom(0), " ", #dato_eeprom(1), " ", #dato_eeprom(2)  '*/Envia las tres
  75.                                                                                                                 'primeras posiciones al puerto serie*/
  76.         Hserout " ", #dato_eeprom(3), "-", #dato_eeprom(4), CrLf  '/*Envia las 2 ultimas
  77.                                                                                    'posiciones al puerto serie*/
  78.         If dato_eeprom(0) <> 0 Or dato_eeprom(1) <> 1 Or dato_eeprom(2) <> 2 Then  '/*Comprueba si la eeprom
  79.                                                                                                         'fue inicializada y si no fue asi la inicializa*/
  80.                 For nn = 0 To 2  'Escribe los tres primeros caracteres de control
  81.                         Write nn, nn  'Escribe en la eeprom
  82.                 Next nn  '_____________
  83.                 Write 3, 1  'Inicializa el primer contador
  84.                 Write 4, 0  'Inicializa el segundo contador que nos indica las veces que reboso el primer contador
  85.         Else  'Si lo anterior no es cierto entonces esto otro
  86.                 dato_eeprom(3) = dato_eeprom(3) + 1  'Incrementa el primer contador
  87.                 Write 3, dato_eeprom(3)  'Escribe el nuevo valor para el primer contador
  88.                 If dato_eeprom(3) = 255 Then  'Si reboso el primer contador
  89.                         dato_eeprom(4) = dato_eeprom(4) + 1  'Se incrementa el segundo contador
  90.                         Write 4, dato_eeprom(4)  'Se escribe el valor del segundo contador
  91.                 Endif
  92.         Endif
  93.  
  94.         For nn = 0 To 4  'Bucle para recorrer las primeras posiciones de memoria
  95.                 Read nn, dato_eeprom(nn)  'se asigna de la direccion "nn" el dato a la variable dato_eeprom(n)
  96.         Next nn  'Acota el bucle For
  97.         Hserout "Nuevos Datos:   ", #dato_eeprom(0), " ", #dato_eeprom(1), " ", #dato_eeprom(2)  '/*Envia las tres
  98.                                                                                                                 'primeras posiciones al puerto serie*/
  99.         Hserout " ", #dato_eeprom(3), "-", #dato_eeprom(4), CrLf  '/*Envia las 2 ultimas
  100.                                                                                     'posiciones al puerto serie*/
  101. Return                                            
  102. 'End

El que esté trabajando con la serie 18F y su EEProm interna y, le funcione en el simulador pero no en la realidad, puede utilizar la configuración de este programa para lograr que le funcione y luego poco a poco ir modificando la configuración hasta conseguir la que necesita. Esto también se puede aplicar a cualquier otro tipo de práctica. No pongo la configuración con cristal de cuarzo porque no tengo ningún PIC18F trabajando actualmente con este tipo de oscilador.

PD. No es necesario preguntarme sobre temas de electrónica o programación mediante el correo o el privado del foro, por aquí es más rápido y de esta forma también puede contestar más gente, aparte de que el tema no queda solo para dos.
« Última modificación: 27 de Mayo de 2010, 20:04:38 por dogflu66 »
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #650 en: 17 de Junio de 2010, 06:51:08 »
Hola de nuevo, si a alguien le interesa esta es la configuracion que tengo en un PIC18F2550 a 20Mhz con cristal externo

Código: [Seleccionar]
'Programa: JEVO33
'Micro: PIC18f2550, cristal externo 20 MHz
'Version: 04

Define CLOCK_FREQUENCY = 20
Define CONFIG1L = %00100100  '0x24 %00100100 USBDIV =1 ;CPUDIV1:CPUDIV0 = 00 Postcaler del sistema no se divide ; PLLDIV2:PLLDIV0 =100 Se divide por 5
Define CONFIG1H = %00001100  '0x0c %00001100 IESO=0 ;FCMEN=0; _ _ ;FOC3:FOSC0=1100  Oscilador HS
Define CONFIG2L = %00111110  '0x3e %00111110 VREGEN=1 ;BORV1:BORV0 =11 ; BOREN1:BOREN0=11; PWRTEN= 0
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = %10000001  '0x83 %10000011 MCLRE=1;_ _ _ _ ;LPT1OSC= 0 ; PBADEN = 0;CCP2MX= 1 "CCP2 en RC1"
Define CONFIG4L = %10000000  '0x80 %10000000
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40


Una pregunta que seguramente sera basica, si tengo un PWM iniciado en un port, ¿puedo poner el port fijo mediante p.e. PWMduty 2, 0 y PORTC.1=1 ?, ¿o tengo que parar primero el PWM ?

Tambien tengo un problemilla con una variable que me va flotando durante toda la ejecucion del programa, he intentado cambiarla de nombre, añadir una mas para que la cargue en una direccion de memoria diferente (a pasado de 0x43 a 0x45 pero me sigue variando), pero con todo y con ello me sigue variando todo el programa, ¿alguna idea?

Saludos

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #651 en: 24 de Junio de 2010, 04:33:37 »
A la primera pregunta ya me respondo yo, no se puede conectar el mismo port del PWM si este esta activado

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #652 en: 30 de Julio de 2010, 19:57:19 »
El amigo Berroa me ha enviado este código y descripción para que lo comparta en el foro, dejo el mensaje exactamente como me lo envió, exceptuando un pequeño retoque en el código para suprimir el “goto” (no se recomienda su uso en lenguajes de alto nivel).

CITO:
Por Berroa:

A la hora de dar soluciones a problemas técnicos ( ya sean industriales, u otros ) muchas veces nos encontramos con la necesidad de contar con dispositivos electronicos los cuales sean capaces de comunicarse con un host, con el objetivo no solo de obtener información de diferentes parámetros, sino, de intervenir directamente sobre la regulación de esos parámetros. La solución presentada a continuación tiene un valor práctico, porque nos permite localizar y guardar en localidades de memória interna todos los dispositivos 1wire "colgados' en una red de este entorno (1Wire).

Teniendo en cuenta la AN187 de MAXIM, y el método descrito allí, brindo mi solución al problema de busqueda (SEARCH, 0xF0) de dispositivos 1-wire a través del PSI.
Recomiendo leer la aplicación. El flujo del programa descrito es importante para entender lo que sucede en el programa.
Estoy convencido de que el programa se puede optimizar, luego entoces bienvenida será toda sugerencia
Espero que sea de utilidad para todos, saludos Francisco.

El proceso de búsqueda está definida por 3 pasos fundamentales:

1°.  Iniciar el bus
2°.  Leer el bit deceado y su conplemento (Por favor, leer el porqué en la application note)
3°.  Mandar el bit deceado.

Una vez que el ( ó los ) dispositivos que contenga el bit deceado sea reconocido por el dipositivo, el mismo continuará participando en el proceso de búsqueda,  los demás se pondrán en una estado de espera hasta que el BUS lo reiniciemos. Este es un proceso BIT by BIT.

Es importante tener en cuenta, que no solo se puede usar el comando search 0xF0, sino tambien podemos usar el comando de busqueda de dispositivos en alarma 0xEC el cuál nos permitirá agilizar el proceso de busqueda y darle servicio a prioridades.

El calculo de la integridad del valor leído se hace a través del último byte ( CRC ). La idea de este proceso la obtuve del foro del PIC BASIC PRO luego las gracias para ellos y en especial para el senor que brinda solución al problema. Debajo está el link  .

Los comentarios los he tratado de hacer en inglés



Calculo del CRC:

'Adapted from the 1wire CRC8 calculation in the official
'PBP forum, many thanx to them!!!!!
'Adaptado del calculo de CRC8 en dispositivos 1wire del foro
'oficial del PICBasic Pro. Gracias!!!!!

'http://www.picbasic.co.uk/forum/showthread.php?t=1672

Código: Visual Basic
  1. AllDigital
  2.  
  3. Dim testbit As Bit  'CRC8
  4. 'Dim testbyte As Byte  'CRC8AL
  5. Dim crcdata As Byte  'CRC8 & CRC8LU & CRC8AL
  6. Dim crc As Byte  'CRC8 & CRC8LU & CRC8AL
  7. Dim i As Byte  'CRC8 & CRC8AL
  8. Dim j As Byte
  9.  
  10. Dim rom_type As Byte  'Device TYPE 1 Byte
  11.  
  12. Dim rom_1_id As Byte  'Device ID 6 Byte
  13. Dim rom_2_id As Byte
  14. Dim rom_3_id As Byte
  15. Dim rom_4_id As Byte
  16. Dim rom_5_id As Byte
  17. Dim rom_6_id As Byte
  18.  
  19. Dim rom_crc As Byte  'Device CRC 1 Byte
  20.  
  21. Dim test_data(7) As Byte  'holds variable to be tested
  22.  
  23. 'real data from a DS1820+
  24. rom_type = 16
  25. rom_1_id = 254
  26. rom_2_id = 89
  27. rom_3_id = 245
  28. rom_4_id = 1
  29. rom_5_id = 8
  30. rom_6_id = 0
  31. rom_crc = 209
  32.  
  33. test_data(0) = rom_type
  34. test_data(1) = rom_1_id
  35. test_data(2) = rom_2_id
  36. test_data(3) = rom_3_id
  37. test_data(4) = rom_4_id
  38. test_data(5) = rom_5_id
  39. test_data(6) = rom_6_id
  40.  
  41. crc = 0
  42.  
  43. main:
  44.         For j = 0 To 6
  45.                 crcdata = test_data(j)
  46.                 Gosub crc8
  47.         Next j
  48.         'En esta parte si observamos el Watch Variable
  49.         'veremos que el resultado crc = rom_crc
  50.         'otra opcion seria integrar en el calculo el valor rom_crc
  51.         'y el valor de crc en este caso debera ser cero (0)
  52.         Break
  53. End                                              
  54. crc8:
  55.         For i = 0 To 7  'Do for all 8 bits in data byte
  56.                 testbit = crc.0 Xor crcdata.0  'XOR bit0 of data byte and crc
  57.                 crcdata = ShiftRight(crcdata, 1)  'Position data byte for next bit test
  58. 'If testbit = 0 Then Goto shift  'If test bit not set, just shift CRC
  59.                 If testbit <> 0 Then crc = crc Xor 0x18  'If set, account for EXOR feedback
  60. 'shift:  'Shift right the CRC byte
  61.                 crc = ShiftRight(crc, 1)  'CRC bit 0 to bit bucket
  62.                 crc.7 = testbit  'Test bit rotates into CRC bit 7
  63.         Next i
  64. Return

El programa completo:

Modificado:
   Sangrado y eliminadas lineas en blanco.

Código: Visual Basic
  1. AllDigital
  2. Define 1WIRE_REG = PORTD  'define the pin where
  3. Define 1WIRE_BIT = 2  '1wire device is connected
  4. Dim presence As Bit  'precense bit
  5. Dim rom_type As Byte  'Device TYPE 1 Byte
  6. Dim rom_1_id As Byte  'Device ID 6 Byte
  7. Dim rom_2_id As Byte
  8. Dim rom_3_id As Byte
  9. Dim rom_4_id As Byte
  10. Dim rom_5_id As Byte
  11. Dim rom_6_id As Byte
  12. Dim rom_crc As Byte  'Device CRC 1 Byte
  13. Dim id_bit As Bit
  14. Dim cmp_id_bit As Bit
  15. Dim search_temp As Byte
  16. Dim ee_location As Byte
  17. 'Dim i As Byte
  18. Dim bit_write As Bit
  19. 'Dim finish As Bit  'Variables for temp measure and control
  20. 'Dim temp As Byte
  21. 'Dim temp2 As Bit
  22. 'Dim sign As Byte
  23. Dim last_device_flag As Bit  'Flag to indicate previus search was the last device
  24. Dim id_bit_number As Byte  'The ROM bit number (1-64) currently being searched
  25. Dim last_zero As Byte  'bit position of the last zero written where there was a discrepancy
  26. Dim last_discrepancy As Byte  'bit index that identifies from which bit the ( NEXT ) search discrepancy check shoud start
  27. Dim search_direction As Bit  'bit value indicating the direction of the search. All devices with this bit stay in the search and the rest go into a wait statefor a 1-wire reset
  28. Dim last_family_discrepancy As Byte  'bit index that identifies the last_discrepancy within the first 8-bit family code of ROM number
  29. Dim device_count As Byte  'Number of devices
  30. 'Define GLCD_DREG = PORTB  '-defines the port where data lines are connected To(it has To be a full 8 - pins port)
  31. 'Define GLCD_RSREG = PORTD  '- defines the port where RS line is connected To
  32. 'Define GLCD_RSBIT = 4  '- defines the pin where RS line is connected To
  33. 'Define GLCD_EREG = PORTD  '- defines the port where E line is connected To
  34. 'Define GLCD_EBIT = 3  '- defines the pin where E line is connected To
  35. 'Define GLCD_RWREG = PORTD  '- defines the port where R/W line is connected To
  36. 'Define GLCD_RWBIT = 5  '- defines the pin where R/W line is connected To
  37. 'Define GLCD_CS1REG = PORTD  '- defines the port where CS1 line is connected To
  38. 'Define GLCD_CS1BIT = 7  '- defines the pin where CS1 line is connected To
  39. 'Define GLCD_CS2REG = PORTD  '- defines the port where CS2 line is connected To
  40. 'Define GLCD_CS2BIT = 6  '- defines the pin where CS2 line is connected To
  41. 'WaitUs 100
  42. 'GLcdinit
  43. 'WaitMs 500
  44. device_count = 0
  45. last_discrepancy = 0
  46. last_family_discrepancy = 0
  47. last_device_flag = 0
  48. last_zero = 0
  49. '************************************************************************
  50. search_rom:
  51.         1wireInit presence  '1. The bus master begins the initialization sequence
  52.         If presence = 1 Then
  53.                 'GLcdposition 0, 0
  54.                 'GLcdwrite "No device(s)..."
  55.                 Goto search_rom
  56.         Endif
  57. '************************************************************************
  58.         'GLcdclear
  59.         If last_device_flag = 1 Then Goto reset_search  'if this bit is TRUE then goto reset_search
  60.         id_bit_number = 1  'initiate this byte
  61.         last_zero = 0  'initiate this byte, Discrepancy marker
  62. rom_search_procedure:
  63.         1wireSendByte 0xf0  '2. The bus master will then issue the Search ROM
  64.         '1. for 1 -> 64
  65. read_bit_and_complement:
  66.         1wireGetBit id_bit, cmp_id_bit  '3. The bus master reads a bit from the 1–Wire bus.
  67.         'and it's complement
  68.         search_temp.0 = id_bit
  69.         search_temp.1 = cmp_id_bit
  70.         Select Case search_temp
  71.                 Case 0  'binary ( 00 ) There are still devices attached which have conflicting bits in this position. Key to fix the problem is here
  72.                         Gosub conflict
  73.                 Case 1  'binary ( 01 ) All devices still coupled have a 0–bit in this Bit position.
  74.                         search_direction = 1
  75.                 Case 2  'binary ( 10 ) all devices still coupled have A 1–bit in this Bit position.
  76.                         search_direction = 0
  77.                 Case 3  'binary ( 11 ) There are no devices attached to the 1–Wire bus. Atypical situation
  78.                         last_discrepancy = 0
  79.         EndSelect
  80.         'Set id_bit_number bit in ROM_NO to search_direction and send to 1-wire bus
  81.         1wireSendBit search_direction
  82.         bit_write = search_direction
  83.         Gosub write_rom_bit_value
  84.         ASM:        incf id_bit_number,f
  85.         If id_bit_number <= 64 Then Goto read_bit_and_complement
  86.         If id_bit_number > 64 Then last_discrepancy = last_zero
  87.         If last_discrepancy = 0 Then last_device_flag = 1
  88. '3.
  89. check_crc:
  90. 'crc computation
  91. 'if crc computation is diferent then we most solve the problem
  92. 'FUTURE feature......
  93. '***************************search finish****************************
  94. 'Here is stored all devices in 8 byte blocks
  95.         ee_location = device_count * 8
  96.         Write ee_location, rom_type
  97.         ee_location = ee_location + 1
  98.         Write ee_location, rom_1_id
  99.         ee_location = ee_location + 1
  100.         Write ee_location, rom_2_id
  101.         ee_location = ee_location + 1
  102.         Write ee_location, rom_3_id
  103.         ee_location = ee_location + 1
  104.         Write ee_location, rom_4_id
  105.         ee_location = ee_location + 1
  106.         Write ee_location, rom_5_id
  107.         ee_location = ee_location + 1
  108.         Write ee_location, rom_6_id
  109.         ee_location = ee_location + 1
  110.         Write ee_location, rom_crc
  111.         ASM:        incf device_count,f
  112.         If last_device_flag = 0 Then Goto search_rom  '1.
  113.         '2
  114. reset_search:
  115.         Write 256, device_count  'number of devices found, be carefully PIC18F4620 have 1024 bytes of EEPROM
  116.         'so, 32 devices are stored correct ( 256 / 8 = 32 )
  117.         last_discrepancy = 0
  118.         last_family_discrepancy = 0
  119.         last_device_flag = 0
  120. End                                              
  121. '******* This part is esential to solve the conflict problem ********
  122. conflict:
  123.         If id_bit_number = last_discrepancy Then
  124.                 search_direction = 1
  125.                 Return
  126.         Endif
  127.         If id_bit_number > last_discrepancy Then
  128.                 search_direction = 0
  129.                 last_zero = id_bit_number
  130.                 Return
  131.         Endif
  132.         'id_bit_number < last_discrepancy
  133.         Select Case id_bit_number  'last_discrepancy  'last_zero  'id_bit_number
  134.                 Case 1
  135.                         search_direction = rom_type.0
  136.                 Case 2
  137.                         search_direction = rom_type.1
  138.                 Case 3
  139.                         search_direction = rom_type.2
  140.                 Case 4
  141.                         search_direction = rom_type.3
  142.                 Case 5
  143.                         search_direction = rom_type.4
  144.                 Case 6
  145.                         search_direction = rom_type.5
  146.                 Case 7
  147.                         search_direction = rom_type.6
  148.                 Case 8
  149.                         search_direction = rom_type.7
  150. '***************************** Device ID*****************************
  151. '*******************************byte2********************************
  152.                 Case 9
  153.                         search_direction = rom_1_id.0
  154.                 Case 10
  155.                         search_direction = rom_1_id.1
  156.                 Case 11
  157.                         search_direction = rom_1_id.2
  158.                 Case 12
  159.                         search_direction = rom_1_id.3
  160.                 Case 13
  161.                         search_direction = rom_1_id.4
  162.                 Case 14
  163.                         search_direction = rom_1_id.5
  164.                 Case 15
  165.                         search_direction = rom_1_id.6
  166.                 Case 16
  167.                         search_direction = rom_1_id.7
  168. '*******************************byte3********************************
  169.                 Case 17
  170.                         search_direction = rom_2_id.0
  171.                 Case 18
  172.                         search_direction = rom_2_id.1
  173.                 Case 19
  174.                         search_direction = rom_2_id.2
  175.                 Case 20
  176.                         search_direction = rom_2_id.3
  177.                 Case 21
  178.                         search_direction = rom_2_id.4
  179.                 Case 22
  180.                         search_direction = rom_2_id.5
  181.                 Case 23
  182.                         search_direction = rom_2_id.6
  183.                 Case 24
  184.                         search_direction = rom_2_id.7
  185. '*******************************byte4********************************
  186.                 Case 25
  187.                         search_direction = rom_3_id.0
  188.                 Case 26
  189.                         search_direction = rom_3_id.1
  190.                 Case 27
  191.                         search_direction = rom_3_id.2
  192.                 Case 28
  193.                         search_direction = rom_3_id.3
  194.                 Case 29
  195.                         search_direction = rom_3_id.4
  196.                 Case 30
  197.                         search_direction = rom_3_id.5
  198.                 Case 31
  199.                         search_direction = rom_3_id.6
  200.                 Case 32
  201.                         search_direction = rom_3_id.7
  202. '*******************************byte5********************************
  203.                 Case 33
  204.                         search_direction = rom_4_id.0
  205.                 Case 34
  206.                         search_direction = rom_4_id.1
  207.                 Case 35
  208.                         search_direction = rom_4_id.2
  209.                 Case 36
  210.                         search_direction = rom_4_id.3
  211.                 Case 37
  212.                         search_direction = rom_4_id.4
  213.                 Case 38
  214.                         search_direction = rom_4_id.5
  215.                 Case 39
  216.                         search_direction = rom_4_id.6
  217.                 Case 40
  218.                         search_direction = rom_4_id.7
  219. '*******************************byte6********************************
  220.                 Case 41
  221.                         search_direction = rom_5_id.0
  222.                 Case 42
  223.                         search_direction = rom_5_id.1
  224.                 Case 43
  225.                         search_direction = rom_5_id.2
  226.                 Case 44
  227.                         search_direction = rom_5_id.3
  228.                 Case 45
  229.                         search_direction = rom_5_id.4
  230.                 Case 46
  231.                         search_direction = rom_5_id.5
  232.                 Case 47
  233.                         search_direction = rom_5_id.6
  234.                 Case 48
  235.                         search_direction = rom_5_id.7
  236. '*******************************byte7********************************
  237.                 Case 49
  238.                         search_direction = rom_6_id.0
  239.                 Case 50
  240.                         search_direction = rom_6_id.1
  241.                 Case 51
  242.                         search_direction = rom_6_id.2
  243.                 Case 52
  244.                         search_direction = rom_6_id.3
  245.                 Case 53
  246.                         search_direction = rom_6_id.4
  247.                 Case 54
  248.                         search_direction = rom_6_id.5
  249.                 Case 55
  250.                         search_direction = rom_6_id.6
  251.                 Case 56
  252.                         search_direction = rom_6_id.7
  253. '***************************** Device CRC****************************
  254. '*******************************byte8********************************
  255.                 Case 57
  256.                         search_direction = rom_crc.0
  257.                 Case 58
  258.                         search_direction = rom_crc.1
  259.                 Case 59
  260.                         search_direction = rom_crc.2
  261.                 Case 60
  262.                         search_direction = rom_crc.3
  263.                 Case 61
  264.                         search_direction = rom_crc.4
  265.                 Case 62
  266.                         search_direction = rom_crc.5
  267.                 Case 63
  268.                         search_direction = rom_crc.6
  269.                 Case 64
  270.                         search_direction = rom_crc.7
  271.         EndSelect
  272.         If search_direction = 0 Then last_zero = id_bit_number
  273. Return                                            
  274. write_rom_bit_value:
  275.         Select Case id_bit_number
  276. '***************************** Device Type***************************
  277. '*******************************byte1********************************
  278.                 Case 1
  279.                         rom_type.0 = bit_write
  280.                 Case 2
  281.                         rom_type.1 = bit_write
  282.                 Case 3
  283.                         rom_type.2 = bit_write
  284.                 Case 4
  285.                         rom_type.3 = bit_write
  286.                 Case 5
  287.                         rom_type.4 = bit_write
  288.                 Case 6
  289.                         rom_type.5 = bit_write
  290.                 Case 7
  291.                         rom_type.6 = bit_write
  292.                 Case 8
  293.                         rom_type.7 = bit_write
  294. '***************************** Device ID*****************************
  295. '*******************************byte2********************************
  296.                 Case 9
  297.                         rom_1_id.0 = bit_write
  298.                 Case 10
  299.                         rom_1_id.1 = bit_write
  300.                 Case 11
  301.                         rom_1_id.2 = bit_write
  302.                 Case 12
  303.                         rom_1_id.3 = bit_write
  304.                 Case 13
  305.                         rom_1_id.4 = bit_write
  306.                 Case 14
  307.                         rom_1_id.5 = bit_write
  308.                 Case 15
  309.                         rom_1_id.6 = bit_write
  310.                 Case 16
  311.                         rom_1_id.7 = bit_write
  312. '*******************************byte3********************************
  313.                 Case 17
  314.                         rom_2_id.0 = bit_write
  315.                 Case 18
  316.                         rom_2_id.1 = bit_write
  317.                 Case 19
  318.                         rom_2_id.2 = bit_write
  319.                 Case 20
  320.                         rom_2_id.3 = bit_write
  321.                 Case 21
  322.                         rom_2_id.4 = bit_write
  323.                 Case 22
  324.                         rom_2_id.5 = bit_write
  325.                 Case 23
  326.                         rom_2_id.6 = bit_write
  327.                 Case 24
  328.                         rom_2_id.7 = bit_write
  329. '*******************************byte4********************************
  330.                 Case 25
  331.                         rom_3_id.0 = bit_write
  332.                 Case 26
  333.                         rom_3_id.1 = bit_write
  334.                 Case 27
  335.                         rom_3_id.2 = bit_write
  336.                 Case 28
  337.                         rom_3_id.3 = bit_write
  338.                 Case 29
  339.                         rom_3_id.4 = bit_write
  340.                 Case 30
  341.                         rom_3_id.5 = bit_write
  342.                 Case 31
  343.                         rom_3_id.6 = bit_write
  344.                 Case 32
  345.                         rom_3_id.7 = bit_write
  346. '*******************************byte5********************************
  347.                 Case 33
  348.                         rom_4_id.0 = bit_write
  349.                 Case 34
  350.                         rom_4_id.1 = bit_write
  351.                 Case 35
  352.                         rom_4_id.2 = bit_write
  353.                 Case 36
  354.                         rom_4_id.3 = bit_write
  355.                 Case 37
  356.                         rom_4_id.4 = bit_write
  357.                 Case 38
  358.                         rom_4_id.5 = bit_write
  359.                 Case 39
  360.                         rom_4_id.6 = bit_write
  361.                 Case 40
  362.                         rom_4_id.7 = bit_write
  363. '*******************************byte6********************************
  364.                 Case 41
  365.                         rom_5_id.0 = bit_write
  366.                 Case 42
  367.                         rom_5_id.1 = bit_write
  368.                 Case 43
  369.                         rom_5_id.2 = bit_write
  370.                 Case 44
  371.                         rom_5_id.3 = bit_write
  372.                 Case 45
  373.                         rom_5_id.4 = bit_write
  374.                 Case 46
  375.                         rom_5_id.5 = bit_write
  376.                 Case 47
  377.                         rom_5_id.6 = bit_write
  378.                 Case 48
  379.                         rom_5_id.7 = bit_write
  380. '*******************************byte7********************************
  381.                 Case 49
  382.                         rom_6_id.0 = bit_write
  383.                 Case 50
  384.                         rom_6_id.1 = bit_write
  385.                 Case 51
  386.                         rom_6_id.2 = bit_write
  387.                 Case 52
  388.                         rom_6_id.3 = bit_write
  389.                 Case 53
  390.                         rom_6_id.4 = bit_write
  391.                 Case 54
  392.                         rom_6_id.5 = bit_write
  393.                 Case 55
  394.                         rom_6_id.6 = bit_write
  395.                 Case 56
  396.                         rom_6_id.7 = bit_write
  397. '***************************** Device CRC****************************
  398. '*******************************byte8********************************
  399.                 Case 57
  400.                         rom_crc.0 = bit_write
  401.                 Case 58
  402.                         rom_crc.1 = bit_write
  403.                 Case 59
  404.                         rom_crc.2 = bit_write
  405.                 Case 60
  406.                         rom_crc.3 = bit_write
  407.                 Case 61
  408.                         rom_crc.4 = bit_write
  409.                 Case 62
  410.                         rom_crc.5 = bit_write
  411.                 Case 63
  412.                         rom_crc.6 = bit_write
  413.                 Case 64
  414.                         rom_crc.7 = bit_write
  415.         EndSelect
  416. Return

« Última modificación: 05 de Agosto de 2010, 14:48:29 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #653 en: 31 de Julio de 2010, 07:38:50 »
Hola de nuevo, si a alguien le interesa esta es la configuracion que tengo en un PIC18F2550 a 20Mhz con cristal externo

Código: [Seleccionar]
'Programa: JEVO33
'Micro: PIC18f2550, cristal externo 20 MHz
'Version: 04

Define CLOCK_FREQUENCY = 20
Define CONFIG1L = %00100100  '0x24 %00100100 USBDIV =1 ;CPUDIV1:CPUDIV0 = 00 Postcaler del sistema no se divide ; PLLDIV2:PLLDIV0 =100 Se divide por 5
Define CONFIG1H = %00001100  '0x0c %00001100 IESO=0 ;FCMEN=0; _ _ ;FOC3:FOSC0=1100  Oscilador HS
Define CONFIG2L = %00111110  '0x3e %00111110 VREGEN=1 ;BORV1:BORV0 =11 ; BOREN1:BOREN0=11; PWRTEN= 0
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = %10000001  '0x83 %10000011 MCLRE=1;_ _ _ _ ;LPT1OSC= 0 ; PBADEN = 0;CCP2MX= 1 "CCP2 en RC1"
Define CONFIG4L = %10000000  '0x80 %10000000
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40


Una pregunta que seguramente sera basica, si tengo un PWM iniciado en un port, ¿puedo poner el port fijo mediante p.e. PWMduty 2, 0 y PORTC.1=1 ?, ¿o tengo que parar primero el PWM ?

Tambien tengo un problemilla con una variable que me va flotando durante toda la ejecucion del programa, he intentado cambiarla de nombre, añadir una mas para que la cargue en una direccion de memoria diferente (a pasado de 0x43 a 0x45 pero me sigue variando), pero con todo y con ello me sigue variando todo el programa, ¿alguna idea?

Saludos

La respuesta a la segunda pregunta es exactamente lo mismo que indicas que has realizado. Otra cosa que puedes hacer, es declarar los arrays de variables después de las variables normales, en el caso que uses arrays (arreglos de variables).

PD. Un poco tarde, pero se me paso.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #654 en: 14 de Septiembre de 2010, 00:25:34 »
Varias veces me preguntaron si se pueden tener arrays (vectores) de varias dimensiones en el Basic del PSI. Lo que es el lenguaje hasta ahora no lo tiene implementado, pero podemos construirnos una función que nos simule el proceso, no queda tan lucida como una función interna del sistema, ya que necesitamos una variable de paso e indicar si escribiremos o leeremos el array, pero el caso es que la función nos permite trabajar con array de dos dimensiones.

La rutina esta declarada en el ejemplo como array(2,5).

Código: Visual Basic
  1. 'Rutina para trabajar con array de dos dimensiones (Vectores)
  2. 'By dogflu66
  3. '********************************************************************
  4. Dim x As Byte
  5. Dim y As Byte
  6. Dim n As Byte
  7.  
  8. AllDigital
  9. TRISA = 0
  10. TRISB = 0
  11.  
  12. main:
  13.         n = 0
  14.         For x = 0 To 1
  15.                 For y = 0 To 4
  16.                         max = n  'Valor a guardar
  17.                         Call max(x, y, "W")  'Actualiza array
  18.                         n = n + 1  'Valor a guardar
  19.                 Next y
  20.         Next x
  21.         Serout RB0, 9600, CrLf  'Linea en blanco
  22.         For x = 0 To 1
  23.                 For y = 0 To 4
  24.                         Call max(x, y, "R")  'Lee array
  25.                         Serout RB0, 9600, "max(", #x, ",", #y, ")=", #max, CrLf  'Imprime valores
  26.                 Next y
  27.         Next x
  28. 'Goto main
  29. End                                              
  30. 'Rutina para trabajar con arrays de dos dimensiones
  31. 'max = variable de paso
  32. 'i1 = Primer indice del array
  33. 'i2 = Segundo indice del array
  34. 'rw = "W" o "w" o 1 => Escribe en array
  35. 'rw = "R" o "r" o 0 => Lee del array
  36. Function max(i1 As Byte, i2 As Byte, rw As Byte) As Byte
  37.         Const ind2 = 5  'Valor del indice2
  38.         Dim array(10) As Byte  'Se declara vector de longitud Indice1*indice2
  39.         Dim ind As Byte  'Indice del vector de trabajo
  40.         ind = i1 + i2 + (i1 * (ind2 - 1))  'Calcula indice array
  41.         If rw = "R" Or rw = "r" Or rw = 0 Then max = array(ind)  'Lee array
  42.         If rw = "W" Or rw = "w" Or rw = 1 Then array(ind) = max  'Escribe array
  43. End Function

Dejo la foto de la simulacion:


PD. He simplificado la función.
« Última modificación: 03 de Mayo de 2014, 14:37:41 por dogflu66 »
Saludos desde Granada, España.

Desconectado EA7LN

  • PIC10
  • *
  • Mensajes: 36
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #655 en: 30 de Septiembre de 2010, 12:19:06 »
Se puede operar con decimales con el basic del pic simulator?
Intento hacer una multiplicación con 0,036 y el valor es 0, en cambio por 36 si lo hace el pic.
Saludos
Cada dia aprendo algo nuevo. ¡Cuanto me queda por aprender!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #656 en: 30 de Septiembre de 2010, 19:35:42 »
No tiene funciones implementadas por el momento para trabajar con  números decimales, ni negativos, pero eso no quiere decir que no puedas, busca "DECIMALES"  en el índice del hilo y veras varios ejemplos.


Nota: Actualmente si permite trabajar con decimales (04/11)
« Última modificación: 23 de Abril de 2011, 11:31:39 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #657 en: 04 de Octubre de 2010, 19:49:12 »
El índice del hilo ha crecido considerablemente, lo estoy actualizando.......
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #658 en: 05 de Octubre de 2010, 20:50:47 »
El índice del hilo ha crecido nuevamente, lo estoy actualizando.......

El índice queda actualizado a dia de hoy.

Queda pendiente añadir los enlaces a consultas y a los ejemplos de los amigos.
« Última modificación: 06 de Octubre de 2010, 20:43:10 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #659 en: 12 de Octubre de 2010, 13:34:44 »
El lenguaje no permite (no permitia) imprimir de forma directa en el LCD las variables tipo Long, así que dejo un par de  funciones que lo hacen posible.

Código: vb.net
  1. Define CONF_WORD = 0x2f50  '/* FUSES
  2. Define CONF_WORD_2 = 0x3ffd  '*/
  3. Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj
  4. '********************************************************
  5. 'FUNCION PARA IMPRIMIR UNA VARIABLE TIPO LONG EN EL LCD *
  6. 'NOMBRE: 16F88_PicEBasic_IMPRIMIR LONG POR EL LCD *******
  7. '*************** 12/10/10 By COS ************************
  8. '********************************************************
  9. '----Puertos del LCD
  10. Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
  11. Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
  12. Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
  13. Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
  14. Define LCD_RSBIT = 7  'Se usara el RB7 como RS
  15. Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
  16. Define LCD_EBIT = 6  'Se usara el RB6 como E
  17. Define LCD_COMMANDUS = 2000  'Tmp de espera despues de ejecutar un comand del lcd en uSeg.
  18. Define LCD_DATAUS = 50  'Tmp de espera despues de enviar un dato al LCD en uSeg.
  19. Define LCD_INITMS = 5  '50  'Tmp de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  20. '----ASIGNACION DE I/O y valores de inicio de las salidas. Configura ADC
  21. ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
  22. CMCON = 0x07  'Comparador a off
  23. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  24. ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
  25. ADCON1 = %11000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
  26. 'ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  27. TRISA = 0x00  'Puerto A como salidas
  28. TRISB = 0x00  'Puerto B como salidas
  29. TRISA.4 = 1  'Como entrada (RA4, adc)
  30. TRISA.6 = 1  'Como entrada (RA6, tecla E1)
  31. TRISA.5 = 1  'Como entrada (RA5, tecla E2)
  32. 'TRISB.5 = 0 'RB5(Tx, RS232)
  33. TRISB.2 = 1  'RB2 (Rx, RS232)
  34. PORTB.3 = 1  'Luz lcd a on (RB3)
  35. PORTA.7 = 1  'Led amarillo a off
  36. PORTB.0 = 1  'Led verde a off
  37. '----VARIABLES GLOBALES
  38. Dim dato As Long
  39. '---INICIO
  40. Lcdinit  'Inicializa el lcd sin cursor
  41. Lcdcmdout LcdClear  'Limpia lcd y cursor principio linea 1
  42. Lcdout "Print Long:"
  43. '----Rutina principal
  44. dato = 995
  45. main:
  46.         Lcdcmdout LcdLine2Home  'Cursor a principio de linea 2
  47.         Call _putlcd32(dato)  'Va a la funcion
  48.         dato = dato + 1
  49. Goto main
  50. End                                              
  51. '***************************************************
  52. 'Retorna valor: Byte
  53. 'Extrae el digito indicado, hasta 10 digitos
  54. 'numero = Cifra a descomponer
  55. 'digito = Digito a extraer de 0 a 9
  56. 'Los digitos se nombras de derecha a izquierda, cero es el primero
  57. '_getdig32, retorna el digito.
  58. Function _getdig32(_numero As Long, _digito As Byte) As Byte
  59.         'Descompone el numero a mostrar en digitos
  60.         Dim _n As Byte
  61.         For _n = 1 To _digito  'Recorre el número hasta digito
  62.                 _numero = _numero / 10  'Selecciona el digito
  63.         Next _n
  64.         _numero = _numero Mod 10  'Extrae el digito
  65.         _getdig32 = _numero  'Asigna y devuelve el digito
  66. End Function                                      
  67. 'No retorna valor
  68. 'Envia una variable al LCD
  69. Proc _putlcd32(_numero As Long)
  70.         Dim i As Byte
  71.         Dim digito As Byte
  72.         Dim flag As Byte
  73.         flag = 0  'Elimina los ceros a la izquierda
  74.         For i = 9 To 0 Step -1  'Recorre el número
  75.                 digito = _getdig32(_numero, i)  'Asigna digito
  76.                 If digito > 0 Then flag = 1  'Permite que se imprima el digito
  77.                 If flag > 0 Then Lcdout #digito  'Imprime el digito
  78.         Next i
  79.         If flag > 0 Then Lcdout "0"
  80. End Proc

Nota: Actualmente si permite imprimir las variables de tipo Long (4 Bytes) y Single (Float de 4 Bytes) directamente en el LCD o GLCD (menos tipo bit) (04/11).
Nota: Programa corregido y actualizado (10/2015).
« Última modificación: 03 de Octubre de 2015, 10:54:59 por dogflu66 »
Saludos desde Granada, España.