[Tutorial] y manejo de Proton IDE

Ok, amigo.
Aunque es codigo en ediitor de programa para picaxe, que esta escrito el código.
Asi...Read b0, valsine, donde b0, hace alusión a la primera posicion de memoria "0" de la EEprom, y deja el dato almacenado en valsine segun he podido entender en el manual Picaxe.
 
Que tal con todos, me podrían por favor aclarar lo siguiente?...estoy usando un pic 16F870 para medir voltaje por el A.0 y temperatura por A.1,...mediante los 2 ejemplos que estaban publicados en página 20, entiendo que con el registro ADCON1 se configuran que entradas del puerto "A" serán Analógicas y cuales Digitales, entonces quedaria como ADCON1=%10000000 (se activan todos los adc)...pero mi duda radica que cuando uso una resolución de 10 bits( Declare ADIN_RES = 10) se usan este otro de comando: ADCON2.7 = 1 y cuando uso una resolución de 8 bits, ya no aparece ADCON2.7 = 1...por que es necesario ese comando en la resolución de 10 bits?...de antemano gracias por contestar mi duda...
 
Si estoy en esa parte del Datasheet del 16F870....pero a diferencia del 18F4550, el pic con el que estoy trabajando tiene solo regsitros ADCON0 y ADCON1...supongo
 
Entonces, con el regristro ADCON0 puedo controlar la operación de control A/D ,...es decir controlar la frecuencia de reloj, el bit 2 me dice si empiezo la conversión (ADCON0.2=1) y lo que me interesa a mi...elegir el canal de entrada al conversor. Mientras que el registro ADCON1 sirve para configurar los terminales del puerto A, cuales seran analógicas y cuades E/S digitales:
El registro ADCON0 tiene 8 bits y cada grupo controla una función del ADC, estoy poniendo ADCON0=%01000001:

01: Voy usar una frecuencia de Fosc/8
000: Voy usar el puerto A.0 como entrada para el conversor
0: Aún no inicia la conversión
0: lee como cero, no se puede cambiar este bit
1: El conversor A/D está operativo

Modifique la programación de esta manera; talvez es correcta?

Código:
Device = 16F870
XTAL = 20
LCD_TYPE = 0
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
LCD_LINES = 2

Declare ADIN_RES = 10  ;resolución de 10 bits     
Declare ADIN_TAD = FRC      
Declare ADIN_STIME = 50 
ADCON1=%10000000   ;se activan todos los adc
TRISA=%11111111    ;todo el puerto A como entrada 
TRISC=0            ;salidas al relé del ventilador
TRISB=0            ;salidas al LCD 16x2
Dim A As Word 
Dim B As Word
Dim C As Float 
Dim D As Float 
Cls
Print At 2,1,"Fuente 0V a 25V"
DelayMS 1000
Cls

inicio:
ADCON0=%01000001 ;selecciono el canal A.0 con Fosc/8, no inicio la conversión pero el conversor esta activo
DelayMS 50
ADCON0.2=1  ;inicia la conversión
DelayMS 50
A=ADRESH

ADCON0=%01001001;selecciono el canal A.1 con Fosc/8, no inicio la conversión pero el conversor esta activo
DelayMS 50
ADCON0.2=1  ;inicia la conversión
DelayMS 50
B=ADRESH

Print At 1,1,"Temp.(",223,"C):"
Print At 2,1,"Voltaje(V):"
C=(A*25)/1023   ;conversión para 25v en el LCD
D=(B*150)/307   ;Conversión de temperatura con referencia de 5voltios
Print At 1,11,DEC1 D
Print At 2,12,"-",DEC1 C
DelayMS 170
GoTo inicio
 

End
 
Registro ADCON0
Bits <7:6> (ADCS1:ADCS0) = Selección del reloj para el conversor.
Bits <5:3> (CHS2:CHS0) = Selección del canal. <AN7:AN0>
Bit 2 (GO/DONE) = Bit de estado de la conversión. (Flag)
Bit 1 = No implementado, será leído como 0
Bit 0 = (ADON) Si está en 1 se inicia la conversión.

Registro ADCON1
Bit 7 = (ADFM) Formato de la conversión.
1 = Justificación a la derecha. Los 6 bits más significativos de ADDRESH serán leídos como 0.
0 = Justificación a la izquierda. Los 6 bits menos significativos de ADDRESL serán leídos como 0.
Bit 6 (ADCS2) Registro espejo de ADCON0 <ADCS1:ADCS0>)
Bits <5:4> = No implementados, serán leídos como 0.
Bits <3:0> = Selección del modo de operación de los conversores AD. y su vRef.
En éstos últimos bits se selecciona que pines serán análogos y cuales digitales. (Conforme a la tabla de <PCFG3:pCFG0>)

De esa forma está mal ese programa.
En Proton puedes únicamente configurar el registro ADCON1 y lo demás lo haces con las instrucciones nativas.
Así, por ejemplo:
PHP:
Device = 16F870
Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, WRT_OFF
XTAL = 20

Declare LCD_TYPE = 0
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
Declare LCD_LINES = 2

Declare Create_Coff = On

Declare ADIN_RES    = 10
Declare ADIN_TAD    = FRC      
Declare ADIN_STIME  = 50 

Inicio:
    Dim Valor_ADC   As  Word
    Dim Voltaje     As Float
    Dim Temperatura As Float
    
    ADCON1 = %10000000  ; Justificación a la derecha.
    
Programa:
    Valor_ADC = ADIn 0
    
    Voltaje = ((Valor_ADC * 5) / 1024)
    
    If PORTB.3 = 1 Then
        Temperatura = (Voltaje * 100)
    Else
        Temperatura = ((Valor_ADC *150) / 308)
    End If
    
    Print At 1,1,Dec2 Voltaje, " V"
    Print At 2,1,Dec2 Temperatura," ",0xDF,"C"
    DelayMS 500
    
    GoTo Programa
    
    End
PD:
Si quieres realizar el programa utilizando únicamente los registros, obviamente también se puede.
 
Última edición:
Me salieron unas dudas en el ejemplo que me estas describiendo, realizas las 2 lecturas ADC solo por el puerto A.0??? y porque utilizas el PORTB.3 si ya esta siendo usado como Enable de la LCD??
 
Es una sola lectura con tres tipos de conversión y por un solo canal. (RA0/AN0)
Lo del pin RB3 fue un error al escribir el programa, tuvo que ser PORTC.3

Saludos.
 
Listopp...ya le entiendo lo que estas haciendo, pero lo que quiero hacer es tener mediciones de 2 magnitudes diferentes por 2 canales diferentes, es decir: Voltaje por el RA0 y Temperatura(usando el LM35) por el RA3....esto lo puedo lograr mediante el comando ADin ?

Código:
Device = 16F870
XTAL = 20
LCD_TYPE = 0
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
LCD_LINES = 2

Declare ADIN_RES = 10  ;resolución de 10 bits     
Declare ADIN_TAD = FRC      
Declare ADIN_STIME = 50 
ADCON1=%10000000   ;se activan todos los adc
TRISA=%11111111    ;todo el puerto A como entrada 
TRISC=0            ;salidas al relé del ventilador
TRISB=0            ;salidas al LCD 16x2
Dim A As Word 
Dim B As Word

inicio:
A=ADIn 0    ;lectura A.0
DelayMS 50
B=ADIn 4    ;lectura A.1
DelayMS 50

Print At 1,1,"Temp.(",223,"C):"
Print At 2,1,"Voltaje(V):"

Print At 1,11,DEC2 B
Print At 2,12,DEC2 A
DelayMS 170
GoTo inicio
 

End
 
Si se puede, pero por lo que mencionas, tu programa es contradictorio.
Dices querer usar el pin RA3, (RA3 = AN3/VRef+)
Entonces debes usar; ADIn 3, No ADIn 4 que corresponde al pin RA5.

También te faltan las fórmulas de conversión a voltaje y temperatura.
En la forma en que lo estás haciendo, únicamente vas a obtener la lectura de bits del ADC.
Y no olvides agregar la palabra de configuración, o el microcontrolador no funcionará físicamente.
Eso lo puedes hacer al grabar el PIC, pero es mejor que lo hagas dentro del programa.
 
Amigos, necesito una ayuda.

He escrito un programa desde hace mucho en asm y estoy aprendiendo PIC Basic.
Estoy comenzando con el Proton Basic y conseguí el Mikro Basic. ¿Cuál es mejor?

Otra pregunta. ¿Cómo depuro programas con el Proton Basic?
He visto por allí que se puede hacer que el Proton Basic funcione a través del MPLAB, ¿pero también se puede depurar con el?

Disculpen mi ignorancia y gracias de antemano.
 
Última edición por un moderador:
Buenas,

Estuve leyendo este tema porque estoy teniendo problemas para leer un POT-LIN de 100K por medio de ADin, nunca utilice esta instrucción. Trataron diferentes problemas con diferentes microcontroladores.

Capaz que alguien tiene idea de como configurar bien el micro para la lectura del POT en un 18F4550 y no me siga tirando errores. Adjunto mi código y la simulación, tal ves pueden identificar fácilmente el problema.

Saludos.
 

Adjuntos

  • Pot18F4550 - ADin.rar
    45.6 KB · Visitas: 35
Para lograr que la pantalla funcione en el puerto B usando el canal 12 del mismo puerto, tienes que emplear un switch de control usando los registros .
La configuración de bits en ADCON1 para el canal 12, involucra también a <AN11:AN8>
O sea que mientras se lee el canal 12, los bits 8 al 11 serán análogos, y eso impedirá el funcionamiento de la pantalla.

Te adjunto un ejemplo empleando el control que te menciono.
Como es muy sencillo, también agregué la interrupción del Timer1 para controlar el bit 2 del puerto D.
 

Adjuntos

  • 18F4550 ADC AN12.rar
    41.7 KB · Visitas: 47
Gracias D@rkbytes.

Si quiero que el oscilador interno funcione a 1MHz, se modifica algo mas del código? ademas de la configuración del reloj interno que ente caso esta para 4MHz.

El código funciona igual pero cambian los tiempos de operación ? Ej: con 4Mhz un tiempo de 500us, tarda menos si esta a 1Mhz.
 
Desafortunadamente, Proton no permite usar una frecuencia de 1 MHz.
Así que el programa se ejecutará a 4 MHz, ya que no permite frecuencias inferiores.
 
Ok. Gracias.

Que sucede si no utilizo el Timer1 ? porque estoy teniendo problema con los otros puertos. Por ejemplo el puerto C 0 y 1 (PortC.0 ; PortC.1) no me fuciona como I/O.

Puedo cambiarle la configuracion a los otros puertos y utlizarlos como I/O ?
 
Si hablas del ejemplo que subí, no pasa nada, sólo fue un relleno opcional de código.
Todos los pines que puedan ser entradas o salidas, deben funcionar, incluso los dedicados al USB.
Únicamente necesitas establecer una correcta configuración y no debes tener problemas.

Lee la hoja de datos, ahí encontrarás toda la información sobre el funcionamiento y configuración de registros.
 
Si me refería al ejemplo que subiste. Estuve leyendo y entendí como que se podía no habilitar las interrupciones si no se configuraban.

Perfecto D@rkbytes.

Muchas gracias.
 
Hola nuevamente.

Intente leer 2 puertos por medio de la configuracion A/D que me daba la hoja de datos pero me devuelve un error en la simulacion (adjunto una foto con el error), pero me lee perfectamente los valores del canal 12 y el 5.

Se puede utilizar mas de un canal A/D a la vez ? como se puede configurar eso ?

A que se debe ese error ?

Código:
Dim Valor_ADC   As Word
    Dim valor_ADC2  As Word
     
    
    OSCCON = 0b01100000
    
    While OSCCONbits_IOFS = 0       ; Esperar hasta que el oscilador interno sea estable.
        Nop
    Wend
    
    ADCON0 = 0b00110001             ; Canal 12 y ADC = On
    ADCON2 = 0b10000011             ; Resultado de la conversión con justificación a la derecha.
    
    ADCON0 = 0b00010101             ; Canal 5 y ADC = On
    ADCON2 = 0b10000011             ; Resultado de la conversión con justificación a la derecha.
 
    Cls ; Limpia o inicializa la pantalla.

Programa:
    ADCON1 = 0b00000010             ; Activar el conversor para el canal 12
    
    Valor_ADC = ADIn 12           ; Leer el resultado de la conversión.  
    
    While ADCON0bits_GO = 1         ; Esperar a que esté lista la conversión.
        Nop
    Wend      

    ADCON1 = 0x0F                             ; Deshabilitar los conversores AD.
    ADCON1 = 0b00001001             ; Activar el conversor para el canal 12
    
    valor_ADC2 = ADIn 5           ; Leer el resultado de la conversión.  
    
    While ADCON0bits_GO = 1         ; Esperar a que esté lista la conversión.
        Nop
    Wend 
    
     ADCON1 = 0x0F                   ; Deshabilitar los conversores AD.     
    
    Print $Fe,$80, "Valor ADC: ",Dec4 Valor_ADC
    Print $Fe,$C0, "Valor ADC2: ",Dec4 valor_ADC2
    
    DelayMS 50                      ; Éste retardo se puede omitir.
    
    GoTo Programa

Gracias !!!!!!
 

Adjuntos

  • Sin título122.jpg
    Sin título122.jpg
    47.7 KB · Visitas: 7
Atrás
Arriba