Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

30/07/2015 #1


Conseguir un retardo de lectura adc en Mikrobasic
Saludos. Soy nuevo aquí y en la electrónica.
Tengo un código para hacer un termómetro con el LM35 y un PIC16F88
El caso es, que tengo todo bien pero quisiera incluir un detalle, y es que necesito poner un delay al adc para evitar el salto de un grado a otro tan rápido que se pueda ver un parpadeo que de una lectura errónea.

Estoy usando mikroBasic Pro for PIC y el código lo encontré en Internet.
Código PHP:
program DigThermo

\'Programmer: Syed Tahmid Mahbub
\'Compiler: mikroBASIC PRO for PIC v3.20
\'Target PIC: 16F88 - 18pin DIP
\'Configuration: XT OSC, PWRTE OFF, WDT OFF, RA5 - MCLR OFF, BOR OFF, LVP OFF, CP OFF, CPD OFF, DEBUG OFF, CKMNE OFF, INTEXTSW OFF

dim data7, num7 as byte
dim temperature as longword
dim digit as byte[3]

sub procedure send7 (dim value, seven as byte) \'Common Anode Displays (2 7segments)
    PORTA = 0
    select case value
           case 0 data7 = $C0
           case 1 data7 = $F9
           case 2 data7 = $A4
           case 3 data7 = $B0
           case 4 data7 = $99
           case 5 data7 = $92
           case 6 data7 = $82
           case 7 data7 = $F8
           case 8 data7 = $80
           case 9 data7 = $90
    end select
    PORTB = data7 \'send temperature
    select case seven
           case 1 num7 = 2
           case 2 num7 = 4
           case 3 num7 = 8
    end select
    PORTA = num7 \'choose which 7segment
end sub

sub procedure GlobInit
    TRISA = 1
    TRISB = 0
    PORTA = 0
    PORTB = 0
    ANSEL = 1 \'AN0 analog
    CCP1CON = 0 \'PWM off
    CMCON = 7 \'Comparator off
end sub

sub procedure delay2ms
    delay_ms(2)
end sub

main:
     GlobInit
     while true
           temperature = (ADC_Read(0) * 500) >> 10
           digit[0] = temperature div 100
           digit[1] = (temperature div 10) mod 10
           digit[2] = temperature  mod 10
           send7(digit[0],1)
           delay2ms()
           send7(digit[1],2)
           delay2ms()
           send7(digit[2],3)
           delay2ms()
     wend
end 
30/07/2015 #2
Moderador

Avatar de D@rkbytes

Realiza la lectura del ADC usando el Timer 1.
Lo configuras para que desborde cada 500 ms o cada segundo.

De esa forma mejoras la transición y eso evita el parpadeo de los displays.
Igualmente puedes usar el Timer 0 para el mutiplexado de los displays y usas el bucle Main para otras tareas.
30/07/2015 #3

Avatar de Dr. Zoidberg

Con que leas el sensor de temperatura cada 5 minutos estas sobrado!!!
Si te hace sentir mal taaaanto tiempo, podes hacerlo cada minuto o cada dos minutos...
30/07/2015 #4


Disculpen, pero no se de programacion estoy aprendiendo un poco ahora, en este caso donde pondria ese timer para conseguir un tiempo antes de hacer otra lectura, recuerden que estoy usando mikrobasic
30/07/2015 #5
Moderador

Avatar de D@rkbytes

La rutina se coloca en el programa configurando un servicio de interrupción.

Yo no uso nada de mikroElektronika porque sus entornos se me hacen pésimos, si no, te pondría un ejemplo.

Otro problema es qué, si no tienes conocimientos de programación, difícilmente podrás comprender y adaptar ejemplos.
30/07/2015 #6


si ya veo, yo puse un delay luego de while true y consigo lo deseado pero me arroja otro error, que son dos digitos que estoy usando y el primer digito ejemplo tengo 30, el 3 empieza a encender y a apagar con ese delay
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.