[Tutorial] y manejo de Proton IDE

Estando un pin sin conexión cualquier carga estática lo cargará con un voltaje parásito.
Siempre es necesario que el pin tenga una conexión externa a algo.
Es una prueba absurda medir el voltaje en un pin configurado como entrada análoga.
Hasta en una que sea digital lo sería, siempre y cuando no esté configurada alguna resistencia pull-up interna.

Si, pero el problema es que por ejemplo ingreso un voltaje de 3v en la entrada AN1 y el PIC lo que mide es 1.4v. Si mido el voltaje con el pin conectado no hay 3v sino 1.4v. Con un PIC 12F683 si funciona (el mismo programa y el pin mide 0v en lugar de 1.4v...osea bien). Lo que quiero es usar el voltaje de referencia interno 1.024v que no lo tiene el 12f683.
 
Dependiendo de la configuración del ADC y de la fórmula usada, podrá decir cualquier cosa.
El cómo estás realizando la conversión, no lo sabemos.
 
Dependiendo de la configuración del ADC y de la fórmula usada, podrá decir cualquier cosa.
El cómo estás realizando la conversión, no lo sabemos.

Lo que estoy haciendo es intentar migrar un programa que funciona bien en un 12f683 a un 12f1822 ¿por que? porque quiero usar el voltaje de referencia interno (1.024) de ese PIC.

¿Para que? para mejorar la resolución del ADC. En el 12F683 el VREF esta conectado a VDD (3v) ...entonces tengo pasos de 3mv en el ADC.
Si usara el 12f1822 con VREF interno de 1.024v ... tendría pasos de 1mv en el ADC. No puedo usar VREF externo porque todos los pines están ocupados. El voltaje máximo que ingresa al ADC es de 800mv aprox.

¿Cual es el problema? en el PIC 12F1822 aparece un voltaje parásito de 0.6v en AN0 y 1.4v en AN1 con los pines al aire; esto hace funcionar mal todo el programa. Todo ese problema no ocurre en el 12f683.

¿Por que no subo el programa? porque es de un circuito comercial (más de 300 unidades vendidas) entonces cualquiera lo tendría ... y adiós ingresos!
 
Bueno, el hecho de que sea un programa comercial no es para que no puedas publicar únicamente lo solicitado.
Pero viendo que se te complica, para mí no es ningún inconveniente subir un ejemplo.
Esto es con el fin de que le pueda servir a varias personas.

No hay dificultad alguna para lograr que un microcontrolador funcione correctamente, todo está en la hoja de datos.

PD: En este Foro he publicado cientos de ejemplos que usan partes de mis programas comerciales. ;)
 

Adjuntos

  • 12F1822 ADC_VREF.rar
    20.9 KB · Visitas: 43
Bueno, el hecho de que sea un programa comercial no es para que no puedas publicar únicamente lo solicitado.
Pero viendo que se te complica, para mí no es ningún inconveniente subir un ejemplo.
Esto es con el fin de que le pueda servir a varias personas.

No hay dificultad alguna para lograr que un microcontrolador funcione correctamente, todo está en la hoja de datos.

PD: En este Foro he publicado cientos de ejemplos que usan partes de mis programas comerciales. ;)

Finalmente encontré el problema. Probé su programa y ocurrió lo mismo (voltaje parásito en AN0 y AN1) ... ya cansado de todo, empece a sospechar
de la fuente de alimentación (es casera pero nunca había dado problemas) coloque una batería de 9v y puse una resistencia de 100 ohm para alimentar un zener de 2.7v y llevar ese voltaje al PIC. Medí y esta vez todo funciono correctamente; las entradas analógicas ya miden 0.00v y el programa funciona bien.

CONCLUSIÓN: El problema es la fuente de alimentación (es como si la tierra no estuviera o esta de forma parcial) ¿?
El programa siempre estuvo bien, pues mire la datasheet muchas veces (cada registro) la verdad hice muchas cosas
antes de preguntar aquí. La migración del 12f683 al 12f1822 fue un éxito, después de muchas horas de pruebas.

Gracias por su ayuda D@rkbytes ... y lamento mucho lo de "circuito comercial" se que hiere muchas susceptibilidades en este foro.
Solo quería proteger mi esfuerzo y pues es una lastima que se entienda de otra manera.
 
Solo quería proteger mi esfuerzo y pues es una lastima que se entienda de otra manera.
El problema es precisamente ese: vos queres proteger tu esfuerzo a costa del esfuerzo "gratuito" de quienes colaboran en el foro. Te parece correcto???

Lo lógico sería que contrataras a alguien que resolviera tu problema con un convenio de confidencialidad de por medio...y claro...pagando lo que sea que cobre.
Así trabajan las empresas para las que yo he brindado servicios, y nadie se pone mal ni se ofende: negocios son negocios....pero para todos.
 
El problema es precisamente ese: vos queres proteger tu esfuerzo a costa del esfuerzo "gratuito" de quienes colaboran en el foro. Te parece correcto???

Lo lógico sería que contrataras a alguien que resolviera tu problema con un convenio de confidencialidad de por medio...y claro...pagando lo que sea que cobre.
Así trabajan las empresas para las que yo he brindado servicios, y nadie se pone mal ni se ofende: negocios son negocios....pero para todos.

Pero si yo hice el programa y solo tenia una duda y ademas mostré la parte en donde considere que estaba el problema ... y al final yo encontré la solución sin ayuda de nadie. No crees que eres algo exagerado en la apreciación de las cosas?

No busques problemas donde no los hay ... jamas exijo que alguien me de una respuesta. Si D@rkbytes regala sus códigos, es decisión de el.
 
Si no le importa entonces para que se mete.
Por que no violo ninguna regla y por que me gusta armar despelote exponiendo a los "vivos" del foro. Está mal???

Para que el que quiera y por su propia voluntad responda.
Aaaahhhhhh.....y por eso no decis nada de lo "comercial" ni mostras nada del problema y los que quieren colaborar tienen que adivinar ??
No entiendo...
 
Por que no violo ninguna regla y por que me gusta armar despelote exponiendo a los "vivos" del foro. Está mal???
Yo vivo y usted loco ... ahhhh!!
Aaaahhhhhh.....y por eso no decis nada de lo "comercial" ni mostras nada del problema y los que quieren colaborar tienen que adivinar ??
No entiendo...
No busque que fuera comercial, solo lo instale en mi carro y luego a otros le gustaron... y si puedo ganar dinero pues no tiene nada de malo.
Yo no pedí que me hicieran un programa para vender; yo lo hice solo ... luego tuve una duda y consulte. No veo el problema.
El foro también es comercial porque tiene publicidad y gana dinero con los temas creados por los miembros.
 
No. En el PIC16F887, los registros involucrados para definir que un pin debe ser análogo, son los registros ANSEL y ANSELH.
(Y esto es nada más para los puertos con ADC)
Colocando un 1 en el bit 7 de ADCON1, lo que se hace es declarar una justificación hacia la derecha en el resultado de la conversión.

Ejemplo:
PHP:
Device 16F887
; Palabra de configuración
Reminders = Off
Config1 INTOSCIO,LVP_OFF,FCMEN_OFF,IESO_OFF,PWRTE_ON,WDTE_OFF
Config2 WRT_OFF,BOR21V
Reminders = On

Xtal 8MHz

Declare Create_Coff On              ; Crear el archivo para depuración (.cof)

; Declaración de variables
Dim Valor_ADC   As Word
Dim Temperatura As Float

Inicio:
    OSCCON = %01110001              ; Configurar el oscilador interno a 8MHz.
; Configuración del ADC
    ADCON1bits_ADFM = 1             ; Resultado con justificación a la derecha
    Declare Adin_Res    = 10        ; Resultado ADC a 10 bits
    Declare Adin_Tad    = FRC       ; Reloj del ADC (FRC = Interno)
    Declare Adin_Stime  = 50        ; Tiempo de muestreo en uS
    ANSEL = 1                       ; Canal 0 análogico
    ANSELH = 0                      ; Puerto B Digital I/O (En vez de All_Digital)
; Configuración de la pantalla
    Declare LCD_Type    Alpha       ; Alfanumérica
    Declare LCD_DTPin   PORTD.4     ; Bus de datos de RD4 a RD7
    Declare LCD_RSPin   PORTD.3     ; Pin RS en RD3
    Declare LCD_ENPin   PORTD.2     ; Pin E en RD2
    Declare LCD_Interface   4       ; Modo a 4 Bits
    Declare LCD_Lines   2           ; Pantalla de dos líneas
   
    Cls                             ; Inicializar o limpiar la pantalla.
    Print At 1,1, "Temperatura LM35"

Programa:
    Valor_ADC = ADIn 0              ; Se lee el canal 0 y se guarda el valor en "Valor_ADC"
    Temperatura = (150 * Valor_ADC) / 308; (308 = Valor que tendrá el ADC a 150 °C "1.5V")
    ; Mostrar el resultado en pantalla
    Print At 2,1, Dec2 Temperatura, " ", 0xDF, "C  "
    GoTo Programa
   
    End
Hola D@rkbytes,
¿Puede convertirlo de PIC16F887 a cómo usar PIC16F877A? Lo que necesito cambiar.

 
Si lo hago yo, no vas a aprender, pero si lees la hoja de datos, sí que lo harás.
Hola,
El principal problema para mí y podría ser para todos aquí no es un experto como tú, no es muy hábil para leer una hoja de datos, así que lo que quiero decir, espero que puedas explicar aquí los detalles sobre el ADC del procesador PIC16F877A, lo veré como lo describe Así que de ti o aquí podría ser, lo entiendo.
 
Hola a todos, tengo un problema y la verdad no consigo solucionarlo, os cuento.
He realizado un programa para leer los datos de un gps ( solo altitud y longitud) y mostrarlo en una lcd.
Está realizado en un 18f4550 ( adjunto programa y simulación en Proteus).
El problema es que lo quiero pasar a un 18f2550 y no soy capaz (dejo tambien programa y simulación en Proteus)

Código del 4550
Código:
        Device = 18F4520

        Xtal = 4

 All_Digital = true

Declare Hserial_Baud  = 9600         
Declare Hserial_RCSTA = %10010000     
Declare Hserial_TXSTA = %00100100     
Declare Hserial_Clear = On             

Declare LCD_Type = 0     
Declare    LCD_DTPin        PORTB.0
Declare    LCD_RSPin        PORTB.4
Declare    LCD_ENPin        PORTB.5
Declare LCD_Lines        2
Declare LCD_Interface    4

TRISB = 0

Dim latitud As String *8
Dim longitud As String *9
Dim valido As String *1
Cls

DelayMS 10

    inicio:
    Cls
    DelayMS 100
    Print At 1,1,"    buscado"
    Print At 2,1,"    satelite"
    HSerIn [Wait( "$GPGGA" ),skip 37 ,Str valido]
    If Val(valido,Dec)<>1 Then GoTo inicio

    programa:

    DelayMS 100
    'Espera hasta Recibir $GPGGA lo que venga detras es guardado en las variables: latitud,longitud
    HSerIn [Wait( "$GPGGA" ),skip 12 ,Str latitud,skip 3 ,Str longitud]

    Print At 1,1,Str latitud,"  Latitud"
    Print At 2,1,Str longitud," Longitud"
    
    DelayMS 100     

    GoTo programa
Código del 2550
Código:
Device = 18F2550

Xtal 4

Config_Start
 PLLDIV = 1    ;No prescale (4 MHz oscillator input drives PLL directly)
 CPUDIV = OSC4_PLL6    ;[Primary Oscillator Src: /1][96 MHz PLL Src: /2]
 USBDIV = 1    ;USB clock source comes directly from the primary oscillator block with no postscale
 FOSC = XT_XT    ;HS oscillator (HS)
 FCMEN = OFF    ;Fail-Safe Clock Monitor disabled
 IESO = OFF    ;Oscillator Switchover mode disabled
 PWRT = OFF    ;PWRT disabled
 BOR = OFF    ;Brown-out Reset disabled in hardware and software
 VREGEN = OFF    ;USB voltage regulator disabled
 WDT = OFF    ;WDT disabled (control is placed on the SWDTEN bit)
 PBADEN = OFF    ;PORTB<4:0> pins are configured as digital I/O on Reset
 LPT1OSC = OFF    ;Timer1 configured for higher power operation
 MCLRE = OFF    ;RE3 input pin enabled; MCLR pin disabled
 STVREN = OFF    ;Stack full/underflow will not cause Reset
 LVP = OFF    ;Single-Supply ICSP disabled
 XINST = OFF    ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
 Debug = OFF    ;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End

    All_Digital = true

Declare Hserial_Baud  = 9600         
Declare Hserial_RCSTA = PORTC.7     
Declare Hserial_TXSTA = PORTC.6     
Declare Hserial_Clear = On             

Declare LCD_Type = 0     
Declare    LCD_DTPin        PORTB.0
Declare    LCD_RSPin        PORTB.4
Declare    LCD_ENPin        PORTB.5
Declare LCD_Lines        2
Declare LCD_Interface    4

TRISB = 0
'trisc = 1

Dim latitud As String *8
Dim longitud As String *9
Dim valido As String *1

Cls

DelayMS 100

inicio:
Cls

DelayMS 500

Print At 1,1,"    buscado"
Print At 2,1,"    satelite"

HSerIn [Wait( "$GPGGA" ),skip 37 ,Str valido]

If Val(valido,Dec)<>1 Then GoTo inicio

programa:
DelayMS 500
    'Espera hasta Recibir $GPGGA lo que venga detras es guardado en las variables: latitud,longitud
HSerIn [Wait( "$GPGGA" ),skip 12 ,Str latitud,skip 3 ,Str longitud]

Print At 1,1,Str latitud,"  Latitud"
Print At 2,1,Str longitud," Longitud"

DelayMS 500     

GoTo programa
Gracias.
 

Adjuntos

  • gps_18f2550.rar
    83.3 KB · Visitas: 9
  • gps_18f4550.rar
    46.7 KB · Visitas: 9
Está realizado en un 18f4550 ( adjunto programa y simulación en Proteus).
El problema es que lo quiero pasar a un 18f2550 y no soy capaz (dejo tambien programa y simulación en Proteus)
El PIC18F2550 es idéntico en hardware al PIC18F4550, solo que no tiene el puerto D ni el E y tampoco SPP, pero no lo estás usando.
Así que solo es cuestión de usar los puertos disponibles, porque en fuses y registros internos es igual.
Features.jpg
 
El PIC18F2550 es idéntico en hardware al PIC18F4550, solo que no tiene el puerto D ni el E
Así que solo es cuestión de usar los puertos disponibles, porque en fuses y registros internos es igual.
Sí, efectivamente verifique eso porque probé y realmente en la simulación no funciona la comunicación por el puerto serie( para poder colaborar).

Realmente no se si es un problema del Ares en la simulación o realmente hay algo que se me escapa...se queda esperando en lazo en la linea

Código:
 HSerIn [Wait( "$GPGGA" ),skip 37 ,Str valido]

Como si nunca recibiera dicha cadena de caracteres pese a que la terminal virtual recibe perfectamente y la simulación con el 18F4520 también funciona perfectamente.

Como decimos por aquí "un real ministerio" :)

Saludos.
 
Atrás
Arriba