Autor Tema: error en ejemplo de PSI  (Leído 7097 veces)

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: error en ejemplo de PSI
« Respuesta #15 en: 01 de Octubre de 2015, 21:25:45 »
Ok, no había entendido el problema, de todas formas he actualizado el programa para que muestre correctamente los números:

http://www.todopic.com.ar/foros/index.php?topic=14917.msg270069#msg270069

Ahora realizare las pruebas que comentas para verificar el error, si mi versión tira los mismos errores comunicare el error para que lo corrijan en futuras versiones.  ;-)
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: error en ejemplo de PSI
« Respuesta #16 en: 01 de Octubre de 2015, 21:39:10 »
Pues a mi me falla cuando pasa del 3999999999 + 1

Nota: he comunicado los errores, falla con números grandes tipo Long y Single.
« Última modificación: 02 de Octubre de 2015, 10:27:06 por dogflu66 »
Saludos desde Granada, España.

Desconectado WALTER ALEJANDRO

  • PIC12
  • **
  • Mensajes: 64
Re: error en ejemplo de PSI
« Respuesta #17 en: 02 de Octubre de 2015, 16:44:56 »
dogflu66 ese programa del enlace que publecaste lo corri y tambien falla... :(

Desconectado WALTER ALEJANDRO

  • PIC12
  • **
  • Mensajes: 64
Re: error en ejemplo de PSI
« Respuesta #18 en: 02 de Octubre de 2015, 16:54:42 »
lo voy a poner directamente en la plaqueta total ya la tengo armada.Despues te aviso como fue gracias

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: error en ejemplo de PSI
« Respuesta #19 en: 03 de Octubre de 2015, 04:39:59 »
Parece que no me expliqué bien, ya no es problema del programa, es un fallo interno del compilador que no maneja bien esas cantidades tan grandes.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: error en ejemplo de PSI
« Respuesta #20 en: 03 de Octubre de 2015, 08:08:49 »
Dejo el antiguo ejemplo con el modulo que controla el posicionado del cero a la izquierda que por algún error lo había omitido al pegar el código en el foro.

Define CONF_WORD = 0x2f50  '/* FUSES
Define CONF_WORD_2 = 0x3ffd  '*/
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj
'********************************************************
'FUNCION PARA IMPRIMIR UNA VARIABLE TIPO LONG EN EL LCD *
'NOMBRE: 16F88_PicEBasic_IMPRIMIR LONG POR EL LCD *******
'*************** 12/10/10 By COS ************************
'********************************************************
'----Puertos del LCD
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'Se usara el RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'Se usara el RB6 como E
Define LCD_COMMANDUS = 2000  'Tmp de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tmp de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '50  'Tmp de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'----ASIGNACION DE I/O y valores de inicio de las salidas. Configura ADC
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
ADCON1 = %11000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
'ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla E1)
TRISA.5 = 1  'Como entrada (RA5, tecla E2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1  'RB2 (Rx, RS232)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'----VARIABLES GLOBALES
Dim dato As Long
'---INICIO
Lcdinit  'Inicializa el lcd sin cursor
Lcdcmdout LcdClear  'Limpia lcd y cursor principio linea 1
'----Rutina principal
Lcdout "Print Long:"  'Imprime el texto en la primera linea display
dato = 4000009998  '4,294,967,295  'Dato a imprimir en el LCD
main:
   'WaitMs 200
   Lcdcmdout LcdLine2Home  'Curso a principio de linea 2
   Call longlcd(dato)  'Va a la funcion
   dato = dato + 1
Goto main
End                                               
'Imprime variable por el Lcd, hasta Long.
'Call longlcd(x), x es el numero a mostrar en el LCD.
'No devuelve datos
Proc longlcd(x As Long)  'Define funcion
   Dim word2 As Word  '/*Declaraciones de las variables
   Dim word1 As Word
   Dim word0 As Word
   Dim aux_x As Long  '*/
   aux_x = x / 1000000  'Se extrae parte más significativa del Long
   word2 = aux_x  'Se asigna los digitos más significativos del Long
   aux_x = aux_x * 1000000  '/* Calculo de la segunda tanda de digitos del Long
   x = x - aux_x
   aux_x = x / 1000  '*/
   word1 = aux_x  'Se asigna la segunda tanda de digitos
   aux_x = aux_x * 1000  'Ultima tanda de digitos
   word0 = x - aux_x  'Se asignan los ultimos digitos
   If word2 > 0 Then Lcdout #word2  'Filtra valor cero
   
   'Establece el cero a la izquierda
   If dato >= 1000000 And word1 >= 10 And word1 < 100 Then Lcdout "0"
   If dato >= 1000000 And word1 < 10 Then Lcdout "00"
   If word2 > 0 Or word1 > 0 Then Lcdout #word1  'Filtra valor cero
   If dato >= 1000 And word0 >= 10 And word0 < 100 Then Lcdout "0"
   If dato >= 1000 And word0 < 10 Then Lcdout "00"
   '-----------------
   
   Lcdout #word0  'Imprime
End Proc
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: error en ejemplo de PSI
« Respuesta #21 en: 03 de Octubre de 2015, 08:13:00 »
Es el mismo código pero con el control del cero:

   'Establece el cero a la izquierda
   If dato >= 1000000 And word1 >= 10 And word1 < 100 Then Lcdout "0"
   If dato >= 1000000 And word1 < 10 Then Lcdout "00"
   If word2 > 0 Or word1 > 0 Then Lcdout #word1  'Filtra valor cero
   If dato >= 1000 And word0 >= 10 And word0 < 100 Then Lcdout "0"
   If dato >= 1000 And word0 < 10 Then Lcdout "00"
   '-----------------

Si os apetece lo probáis y comentáis como va.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: error en ejemplo de PSI
« Respuesta #22 en: 03 de Octubre de 2015, 08:28:42 »
Pero recuerdo que el ejemplo solo a quedado como practica por que hoy en día una sola línea de código soluciona el problema:

   Lcdout #dato  'Imprime el valor de la variable en el LCD, ya este declarada como Byte, Word, Long o Single (Float).
Saludos desde Granada, España.

Desconectado WALTER ALEJANDRO

  • PIC12
  • **
  • Mensajes: 64
Re: error en ejemplo de PSI
« Respuesta #23 en: 06 de Octubre de 2015, 11:12:44 »
corri el programa en un circuito real hasta varios millones y parece que no se cuelga.
Por lo tanto doy por satisfecha mi consulta, gracias a todos por su aporte