Problema con rutina en Proton IDE

Hola foreros. Les cuento hace unas semanas atrás adapte un código de un medidor de nivel (que se posteó en neoteo por Mario Saco hace bastante tiempo) para hacer un vumetro estereo; en el cual repetí la rutina dos veces para leer el otro canal. Entonces puse otra rutina, usando SELECT CASE, para intentar hacer otra función si se pulsaba un boton y si se pulsaba de nuevo regresar al vumetro. Todo esto en Proton IDE.

Pero al momento de correrlo en un pic 16f877 real el vumetro funcionaba de lo mas bien, pero la 2da rutina no me respondia o lo hacía cuando queria, especialmente no me leia los botones de aumentar disminuir.

Eso mas que nada, que es lo que tengo que hacer para que el vumetro no me interrumpa otras rutinas?

El código de lo que intentaba hacer:
Código:
 Device = 16F877 'Usamos el pic16f877a
 Xtal = 4 'Con un cristal de 4 mhz
 
 'Definimos la conexión del lcd
 
 LCD_DTPin = PORTB.4
 LCD_RSPin = PORTB.0
 LCD_ENPin = PORTB.1
 LCD_Interface = 4 'Interface de 4 bit
 LCD_Lines = 2
 LCD_Type = 0
 
 'Definimos parámetros del A/D/C
 
 Adin_Res = 10 'Resolución de 10 bits
 Adin_Tad = frc 'RC osc
 Adin_Stime = 50 'Tiempo de muestreo de 50us
 
 'Declaramos variables
 
 Dim Estado As Byte 'Variable para controlar menús
 Dim Dato As Word 'Variable para almacenar el resultado
 Dim Dato2 As Word
 Dim Completos As Byte 'Caracteres completos a la izquierda de la barra
 Dim Completos2 As Byte
 Dim Muestra As Byte 'Resultado para mostrar en la barra
 Dim Muestra2 As Byte
 Dim Parcial As Byte 'ASCII code para los caracteres en la barra parcial
 Dim Parcial2 As Byte
 Dim Pad As Byte 'Número de espacios vacios a la derecha de la barra
 Dim Pad2 As Byte
 Dim Graves As Byte
 
 'Conectamos la entrada analógica a porta.0 (RA0)
 
 TRISB.2 = 1 'RB2 como entrada
 TRISD.0 = 1
 TRISD.1 = 1
 TRISE = %11111111 'Todo el puerto es entrada
 ADCON1 = %10000010 'Seteo el puerto Analogico
 DelayMS 500 'Espero medio segundo
 
 'Cargamos los caracteres especiales en la CGRAM del lcd
 'El blanco a $0 hace que la gráfica trabaje más rápidamente
 
 Print $FE,64,Rep $0\8 'Cargo un caracter vacío
 Print $0,Rep $10\6,$0 'Cargo el caracter I
 Print $0,Rep $14\6,$0 'Cargo el caracter II
 Print $0,Rep $15\6,$0 'Cargo el caracter III
 
 Cls 'Limpio el display

 'Inicializamos las variables
 
 Estado = 1
 Graves = 30

 Lazo: 'Comienza el lazo de funcionamiento
 
 If PORTB.2 = 0 Then
  Estado = Estado + 1
  If Estado > 2 Then
   Estado = 1
  End If
 End If 

 Select Estado

  Case 1 
   Cls 'Limpio el display
   Dato = ADIn 6 'Leemos la entrada PORTE.1 y PORTE.2
   Dato2 = ADIn 7
 
   Dato = (Dato */ 500) >> 2 'Es lo mismo que (Dato * 500)/1024
   Dato2 = (Dato2 */ 500) >> 2
 
   Muestra = (Dato / 10.8) + 1 'Escala de 0-500 para 48(16*3) segmentos de la barra
   Muestra2 = (Dato2 / 10.8) + 1
   GoSub Barra 'Actualizamos la barra
   GoTo Lazo 'Cerramos el lazo

  Case 2
       If PORTD.0 = 1 Then
        Graves = Graves + 1
        If Graves > 59 Then
         Graves = 59
         Print At 1, 1, "   Graves Max"
         DelayMS 1000
        End If
        DelayMS 20
       End If
       If PORTD.1 = 1 Then
        Graves = Graves - 1
        If Graves < 0 Then
         Graves = 0
         Print At 1, 1, "   Graves Min"
         DelayMS 1000
        End If
        DelayMS 20
       End If 
   
       Print At 1, 1, "   Graves ", Dec2 Graves, " "
       Muestra = (Graves / 1.26) 'Escala de 0-500 para 48(16*3) segmentos de la barra
       GoSub Barra2 'Actualizamos la barra
       GoTo Lazo 'Cerramos el lazo
  
 End Select
 
 Barra:
 
 Completos = (Muestra Min 44) / 3 'Calculamos el número de caracteres completos (III)
 Completos2 = (Muestra2 Min 44) / 3 
 Parcial = (Muestra Min 44) // 3 'Calculamos el ASCII code para los caracteres parciales
 Parcial2 = (Muestra2 Min 44) // 3 
 Pad = 14 - Completos 'Número de espacios para mostrar (ancho)
 Pad2 = 14 - Completos2
 
 Print At 1,1, Rep $03\Completos, Parcial, Rep " "\Pad, "L" 'Mostrar la barra en la segunda línea
 Print At 2,1, Rep $03\Completos2, Parcial2, Rep " "\Pad2, "R"
 Return 'Regreso a donde salí
 
 Barra2:
 
 Completos = (Muestra Min 48) / 3 'Calculamos el número de caracteres completos (III)
 Parcial = (Muestra Min 48) // 3  'Calculamos el ASCII code para los caracteres parciales
 Pad = 15 - Completos 'Número de espacios para mostrar (ancho)
 Print At 2,1, Rep $03\Completos, Parcial, Rep " "\Pad 'Mostrar la barra en la segunda línea
 Return 'Regreso a donde salí

La página de donde saque el codigo de la barra:
HTML:
http://www.neoteo.com/indicador-de-nivel-con-lcd-vumetro

Adjunto el archivo si alguien lo quiere probar
Cualquier sugerencia se agradece
 

Adjuntos

  • Prueba barra.rar
    1.6 KB · Visitas: 44
¿Como nadie ha probado el codigo que deje de adjunto? eso es lo que necesito que alguien me diga si le pasa lo mismo que podemos mejorar.
 
hola,

El pic ejecuta lo que esta en la etiqueta lazo, ahora si cierras el lazo entonces el programa vuelve a empezar e ignorara el resto del programa. Ese Select Case no es necesario, con solo la sentencia IF tienes para leer los pulsadores y esta rutina debe estar dentro de la etiqueta Lazo, osea entre:

Lazo:
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
Goto lazo


Saludos.
 
Una buena técnica para probar lo realizado ya sea con protón o en assembler o cualquier otro lenguaje es utilzar el picide simulator, pasandole el archivo hex ya que permite inspeccionar y ver que sucede
 
hola,

El pic ejecuta lo que esta en la etiqueta lazo, ahora si cierras el lazo entonces el programa vuelve a empezar e ignorara el resto del programa. Ese Select Case no es necesario, con solo la sentencia IF tienes para leer los pulsadores y esta rutina debe estar dentro de la etiqueta Lazo, osea entre:

Lazo:
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
Goto lazo


Saludos.

Hola. La Función de select case la use porque me resultaba mas ordenado el programa. En todo caso el problema no esta en la funcion select case, el problema aparece cuando los pines analógicos del pic reciben señal que los excite y activan el conversor adc, en ese momento ,cuando estan con señal, el pic no me lee los botones que programe para aumentar y disminuir una variable distinta de la variable de resultado del adc. Pero esto no pasa cuando no hay señal en los pines analógicos, o sea el resultado del adc es 0 o cercano, el pic me lee los botones lo mas bien.

Una buena técnica para probar lo realizado ya sea con protón o en assembler o cualquier otro lenguaje es utilzar el picide simulator, pasandole el archivo hex ya que permite inspeccionar y ver que sucede

El problema es que en un pic real me sucede lo que le expuse arriba a Gerson strauss, en simulación en proteus me va de lo mas bien.

Lo que pretendo es que lo prueben y me digan lo que les pasa.

adjunto el archivo hex:
 

Adjuntos

  • Prueba barra.rar
    4.6 KB · Visitas: 73
Hola foreros. Les cuento hace unas semanas atrás adapte un código de un medidor de nivel (que se posteó en neoteo por Mario Saco hace bastante tiempo) para hacer un vumetro estereo; en el cual repetí la rutina dos veces para leer el otro canal. Entonces puse otra rutina, usando SELECT CASE, para intentar hacer otra función si se pulsaba un boton y si se pulsaba de nuevo regresar al vumetro. Todo esto en Proton IDE.

Pero al momento de correrlo en un pic 16f877 real el vumetro funcionaba de lo mas bien, pero la 2da rutina no me respondia o lo hacía cuando queria, especialmente no me leia los botones de aumentar disminuir.

Eso mas que nada, que es lo que tengo que hacer para que el vumetro no me interrumpa otras rutinas?

El código de lo que intentaba hacer:
Código:
 Device = 16F877 'Usamos el pic16f877a
 Xtal = 4 'Con un cristal de 4 mhz
 
 'Definimos la conexión del lcd
 
 LCD_DTPin = PORTB.4
 LCD_RSPin = PORTB.0
 LCD_ENPin = PORTB.1
 LCD_Interface = 4 'Interface de 4 bit
 LCD_Lines = 2
 LCD_Type = 0
 
 'Definimos parámetros del A/D/C
 
 Adin_Res = 10 'Resolución de 10 bits
 Adin_Tad = frc 'RC osc
 Adin_Stime = 50 'Tiempo de muestreo de 50us
 
 'Declaramos variables
 
 Dim Estado As Byte 'Variable para controlar menús
 Dim Dato As Word 'Variable para almacenar el resultado
 Dim Dato2 As Word
 Dim Completos As Byte 'Caracteres completos a la izquierda de la barra
 Dim Completos2 As Byte
 Dim Muestra As Byte 'Resultado para mostrar en la barra
 Dim Muestra2 As Byte
 Dim Parcial As Byte 'ASCII code para los caracteres en la barra parcial
 Dim Parcial2 As Byte
 Dim Pad As Byte 'Número de espacios vacios a la derecha de la barra
 Dim Pad2 As Byte
 Dim Graves As Byte
 
 'Conectamos la entrada analógica a porta.0 (RA0)
 
 TRISB.2 = 1 'RB2 como entrada
 TRISD.0 = 1
 TRISD.1 = 1
 TRISE = %11111111 'Todo el puerto es entrada
 ADCON1 = %10000010 'Seteo el puerto Analogico
 DelayMS 500 'Espero medio segundo
 
 'Cargamos los caracteres especiales en la CGRAM del lcd
 'El blanco a $0 hace que la gráfica trabaje más rápidamente
 
 Print $FE,64,Rep $0\8 'Cargo un caracter vacío
 Print $0,Rep $10\6,$0 'Cargo el caracter I
 Print $0,Rep $14\6,$0 'Cargo el caracter II
 Print $0,Rep $15\6,$0 'Cargo el caracter III
 
 Cls 'Limpio el display

 'Inicializamos las variables
 
 Estado = 1
 Graves = 30

 Lazo: 'Comienza el lazo de funcionamiento
 
 If PORTB.2 = 0 Then
  Estado = Estado + 1
  If Estado > 2 Then
   Estado = 1
  End If
 End If 

 Select Estado

  Case 1 
   Cls 'Limpio el display
   Dato = ADIn 6 'Leemos la entrada PORTE.1 y PORTE.2
   Dato2 = ADIn 7
 
   Dato = (Dato */ 500) >> 2 'Es lo mismo que (Dato * 500)/1024
   Dato2 = (Dato2 */ 500) >> 2
 
   Muestra = (Dato / 10.8) + 1 'Escala de 0-500 para 48(16*3) segmentos de la barra
   Muestra2 = (Dato2 / 10.8) + 1
   GoSub Barra 'Actualizamos la barra
   GoTo Lazo 'Cerramos el lazo

  Case 2
       If PORTD.0 = 1 Then
        Graves = Graves + 1
        If Graves > 59 Then
         Graves = 59
         Print At 1, 1, "   Graves Max"
         DelayMS 1000
        End If
        DelayMS 20
       End If
       If PORTD.1 = 1 Then
        Graves = Graves - 1
        If Graves < 0 Then
         Graves = 0
         Print At 1, 1, "   Graves Min"
         DelayMS 1000
        End If
        DelayMS 20
       End If 
   
       Print At 1, 1, "   Graves ", Dec2 Graves, " "
       Muestra = (Graves / 1.26) 'Escala de 0-500 para 48(16*3) segmentos de la barra
       GoSub Barra2 'Actualizamos la barra
       GoTo Lazo 'Cerramos el lazo
  
 End Select
 
 Barra:
 
 Completos = (Muestra Min 44) / 3 'Calculamos el número de caracteres completos (III)
 Completos2 = (Muestra2 Min 44) / 3 
 Parcial = (Muestra Min 44) // 3 'Calculamos el ASCII code para los caracteres parciales
 Parcial2 = (Muestra2 Min 44) // 3 
 Pad = 14 - Completos 'Número de espacios para mostrar (ancho)
 Pad2 = 14 - Completos2
 
 Print At 1,1, Rep $03\Completos, Parcial, Rep " "\Pad, "L" 'Mostrar la barra en la segunda línea
 Print At 2,1, Rep $03\Completos2, Parcial2, Rep " "\Pad2, "R"
 Return 'Regreso a donde salí
 
 Barra2:
 
 Completos = (Muestra Min 48) / 3 'Calculamos el número de caracteres completos (III)
 Parcial = (Muestra Min 48) // 3  'Calculamos el ASCII code para los caracteres parciales
 Pad = 15 - Completos 'Número de espacios para mostrar (ancho)
 Print At 2,1, Rep $03\Completos, Parcial, Rep " "\Pad 'Mostrar la barra en la segunda línea
 Return 'Regreso a donde salí

La página de donde saque el codigo de la barra:
HTML:
http://www.neoteo.com/indicador-de-nivel-con-lcd-vumetro

Adjunto el archivo si alguien lo quiere probar
Cualquier sugerencia se agradece


con adcon1 = %10000010 la señal es configurada portbe.7 es configurada como digital
si quieres puedes bajar manual del pic16f877 y verificar el registro adcon1



la configuración correcta de adcon1 = %10000000



otra inconsistencia que veo es el trise =%11111111
mas facil y certero es trise.7 = 1 el pin 7 del puerto e como entrada





ADCON1 REGISTER (ADDRESS 9Fh)
The ADRESH:ADRESL registers contain the 10-bit
result of the A/D conversion. When the A/D conversion
is complete, the result is loaded into this A/D result register
pair, the GO/DONE bit (ADCON0<2>) is cleared
and the A/D interrupt flag bit ADIF is set. The block diagram
of the A/D module is shown in Figure 11-1.
After the A/D module has been configured as desired,
the selected channel must be acquired before the conversion
is started. The analog input channels must
have their corresponding TRIS bits selected as inputs.
To determine sample time, see Section 11.1. After this
acquisition time has elapsed, the A/D conversion can
be started.
U-0 U-0 R/W-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0
ADFM — — — PCFG3 PCFG2 PCFG1 PCFG0
bit 7 bit 0
bit 7 ADFM: A/D Result Format Select bit
1 = Right justified. 6 Most Significant bits of ADRESH are read as ‘0’.
0 = Left justified. 6 Least Significant bits of ADRESL are read as ‘0’.
bit 6-4 Unimplemented: Read as '0'
bit 3-0 PCFG3:pCFG0: A/D Port Configuration Control bits:
Note 1: These channels are not available on PIC16F873/876 devices.
2: This column indicates the number of analog channels available as A/D inputs and
the number of analog channels used as voltage reference inputs.
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
- n = Value at POR ’1’ = Bit is set ’0’ = Bit is cleared x = Bit is unknown
A = Analog input D = Digital I/O
PCFG3:pCFG0
AN7(1)/RE2 AN6(1)/RE1 AN5(1)/RE0 AN4/RA5 AN3/RA3 AN2/RA2 AN1/RA1 AN0/ RA0
0000 A A A A A A A A
0001 A A A A VREF+ A A A
0010 D D D A A A A A
0011 D D D A VREF+ A A A RA3 VSS 4/1
0100 D D D D A D A A VDD VSS 3/0
0101 D D D D VREF+ D A A RA3 VSS 2/1
011x D D D D D D D D VDD VSS 0/0
1000 A A A A VREF+ VREF- A A RA3 RA2 6/2
1001 D D A A A A A A VDD VSS 6/0
1010 D D A A VREF+ A A A RA3 VSS 5/1
1011 D D A A VREF+ VREF- A A RA3 RA2 4/2
1100 D D D A VREF+ VREF- A A RA3 RA2 3/2
1101 D D D D VREF+ VREF- A A RA3 RA2 2/2
1110 D D D D D D D A VDD VSS 1/0
1111 D D D D VREF+ VREF- D A RA3 RA2 1/2
 
Última edición:
Atrás
Arriba