-- Jal v2 Ejemplo LCD, ADC, EEPROM -- Programa creado por Juan (Yovani - (YO)) 10/07/011 -- ------------------------------------------------------------------ -- Este programa combina ejemplos de manejo de LCD, ADC, y EEPROM --- -- ------ incluye rutina de promediaciòn de valores del ADC ----- -- ------------------------------------------------------------------ -- Incluimos la librería del pic 16F877A include 16f877a pragma target OSC HS -- Usamos un cristal... pragma target clock 4_000_000 -- de 4 Mhz. pragma target WDT disabled -- No Perro guardian pragma target LVP disabled -- No programar en baja tensión ----------------------- Configuro los pines de E/S -------------------------- enable_digital_io() -- Todos los pines como I/O digitales -- ------- Declaro las variables a utilizar en el programa -------- var dword medicion -- Mediciòn actual var dword medicion1 -- Mediciòn anterior var dword Tension var byte espacio1 -- Para el LCD var byte espacio2 -- Para el LCD var dword max_med -- Para la mediciòn màxima (dato leìdo de EEPROM) var byte E -- Para la EEPROM (zona memoria = direcciòn) var dword sumatoria -- Para el promedio include delay -- Incluímos librería de retardos include pic_data_eeprom -- Incluìmos librerìa de EEPROM ----------------------- Configuro el LCD ------------------------------------- const byte LCD_ROWS = 2 -- LCD de 2 lineas const byte LCD_CHARS = 20 -- y 20 caracteres por linea alias lcd_en is pin_D7 -- Pin E del LCD alias lcd_rs is pin_D6 -- Pin RS del LCD alias lcd_dataport is portB_low -- 4 data pins portb_direction = 0x00 -- Todo el puerto B como salidas portD_direction = all_output -- Todo el puerto D como salidas -- (B0 al pin 11 del LCD, DB4) -- (B1 al pin 12 del LCD, DB5) -- (B2 al pin 13 del LCD, DB6) -- (B3 al pin 14 del LCD, DB7) -- -------------------------------------------------------------------------- -- Incluyo librerias e inicializo LCD: -- -------------------------------------------------------------------------- include lcd_hd44780_4 -- Incluyo la libreria del LCD lcd_init() -- e inicializo el controlador del LCD include print -- Rutinas para mostrar valores en el LCD ------------------ Cadenas a mostrar (Mensajes) ---------------- var byte line1[LCD_CHARS] = "HOLA FORO " var byte line2[LCD_CHARS] = "PRACTICAS CON JAL v2" var byte line3[LCD_CHARS] = "LCD, ADC y EEPROM " var byte line4[LCD_CHARS] = "Corriendo ejemplo: " var byte line5[LCD_CHARS] = "V.max= V.in= " -- En dir 1,0 -- -------------------- Configuramos el ADC ------------------------ -- Utilizamos el modo de baja resolución (8 bits) const bit ADC_HIGH_RESOLUTION = false -- ADC en 8 bits const byte ADC_NCHANNEL = 1 -- Usamos un solo canal de entrada -- No utilizamos la referencia externa const byte ADC_NVREF = ADC_NO_EXT_VREF -- Como volt referencia usamos -- la tension de la fuente include adc -- Incluímos la librería de control adc_init() -- Inicializamos el adc -- ----------------------------------------------------------- -- ----------------- Comenzamos el programa ------------ -- ----------------------------------------------------------- delay_100ms(30) -- --------------------------------------------------------------- -- -- En èsta secciòn jugaremos un poco con el LCD escribiendo --- -- -- desde los bordes en forma alternativa, primero una palabra - -- -- desde la izquierda y luego otra desde la derecha ----------- -- -- Luego, escribiremos las mìsmas palabras pero pondremos las - -- -- letras de cada una, en forma alternada y de cada lado ------ -- --------------------------------------------------------------- -- -------------- Colocamos mensaje de inicio ----------------- espacio1 = 0 espacio2 = 0 for 9 loop lcd_cursor_position(0,espacio1) lcd_write_char("A") delay_100ms(1) if espacio1 > 0 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 + 1 end if espacio1 = espacio1 + 1 end loop espacio1 = 0 espacio2 = 0 for 8 loop lcd_cursor_position(0,espacio1) lcd_write_char("L") delay_100ms(1) if espacio1 > 0 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 + 1 end if espacio1 = espacio1 + 1 end loop espacio1 = 0 espacio2 = 0 for 7 loop lcd_cursor_position(0,espacio1) lcd_write_char("O") delay_100ms(1) if espacio1 > 0 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 + 1 end if espacio1 = espacio1 + 1 end loop espacio1 = 0 espacio2 = 0 for 6 loop lcd_cursor_position(0,espacio1) lcd_write_char("H") delay_100ms(1) if espacio1 > 0 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 + 1 end if espacio1 = espacio1 + 1 end loop -- ----- espacio1 = 19 espacio2 = 19 for 10 loop lcd_cursor_position(0,espacio1) lcd_write_char("F") delay_100ms(1) if espacio1 < 19 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 - 1 end if espacio1 = espacio1 - 1 end loop espacio1 = 19 espacio2 = 19 for 9 loop lcd_cursor_position(0,espacio1) lcd_write_char("O") delay_100ms(1) if espacio1 < 19 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 - 1 end if espacio1 = espacio1 - 1 end loop espacio1 = 19 espacio2 = 19 for 8 loop lcd_cursor_position(0,espacio1) lcd_write_char("R") delay_100ms(1) if espacio1 < 19 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 - 1 end if espacio1 = espacio1 - 1 end loop espacio1 = 19 espacio2 = 19 for 7 loop lcd_cursor_position(0,espacio1) lcd_write_char("O") delay_100ms(1) if espacio1 < 19 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 - 1 end if espacio1 = espacio1 - 1 end loop delay_100ms(20) -- Ahora espero 2 segundos -- --------------------------- ---------- ----------------------- espacio1 = 0 espacio2 = 0 for 9 loop lcd_cursor_position(0,espacio1) lcd_write_char("A") delay_100ms(1) if espacio1 > 0 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 + 1 end if espacio1 = espacio1 + 1 end loop espacio1 = 19 espacio2 = 19 for 10 loop lcd_cursor_position(0,espacio1) lcd_write_char("F") delay_100ms(1) if espacio1 < 19 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 - 1 end if espacio1 = espacio1 - 1 end loop espacio1 = 0 espacio2 = 0 for 8 loop lcd_cursor_position(0,espacio1) lcd_write_char("L") delay_100ms(1) if espacio1 > 0 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 + 1 end if espacio1 = espacio1 + 1 end loop espacio1 = 19 espacio2 = 19 for 9 loop lcd_cursor_position(0,espacio1) lcd_write_char("O") delay_100ms(1) if espacio1 < 19 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 - 1 end if espacio1 = espacio1 - 1 end loop espacio1 = 0 espacio2 = 0 for 7 loop lcd_cursor_position(0,espacio1) lcd_write_char("O") delay_100ms(1) if espacio1 > 0 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 + 1 end if espacio1 = espacio1 + 1 end loop espacio1 = 19 espacio2 = 19 for 8 loop lcd_cursor_position(0,espacio1) lcd_write_char("R") delay_100ms(1) if espacio1 < 19 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 - 1 end if espacio1 = espacio1 - 1 end loop espacio1 = 0 espacio2 = 0 for 6 loop lcd_cursor_position(0,espacio1) lcd_write_char("H") delay_100ms(1) if espacio1 > 0 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 + 1 end if espacio1 = espacio1 + 1 end loop espacio1 = 19 espacio2 = 19 for 7 loop lcd_cursor_position(0,espacio1) lcd_write_char("O") delay_100ms(1) if espacio1 < 19 then lcd_cursor_position(0,espacio2) lcd_write_char(" ") espacio2 = espacio2 - 1 end if espacio1 = espacio1 - 1 end loop delay_100ms(20) -- Ahora espero 2 segundos -- --------------------------- ---------- ----------------------- for 3 loop lcd_clear_screen() -- Borro la pantalla lcd_cursor_position(0,6) -- Coloco el cursor para centrar el mensaje print_string(lcd, line1) -- Escribo el mensaje (HOLA FORO) lcd_cursor_position(1,0) -- Coloco el cursor para centrar el mensaje print_string(lcd, line2) -- Escribo el mensaje (PRACTICAS CON JAL V2) delay_100ms(10) -- Ahora espero 1 segundo lcd_clear_screen() -- Borro la pantalla lcd_cursor_position(1,0) -- Coloco el cursor para centrar el mensaje print_string(lcd, line2) -- Escribo el mensaje (PRACTICAS CON JAL V2) delay_100ms(5) -- Ahora espero 1/2 segundo end loop lcd_clear_screen() -- Borro la pantalla lcd_cursor_position(0,0) -- Coloco el cursor para centrar el mensaje print_string(lcd, line2) -- Escribo el mensaje (PRACTICAS CON JAL V2) lcd_cursor_position(1,0) -- Coloco el cursor para centrar el mensaje print_string(lcd, line3) -- Escribo el mensaje (Manejando el ADC) delay_100ms(40) -- Ahora espero 4 segundos lcd_clear_screen() -- Borro la pantalla lcd_cursor_position(0,0) -- Coloco el cursor para centrar el mensaje print_string(lcd, line4) -- Escribo el mensaje (Corriendo ejemplo:) lcd_cursor_position(1,0) -- Coloco el cursor para centrar el mensaje print_string(lcd, line3) -- Escribo el mensaje (Manejando el ADC) delay_100ms(30) -- Ahora espero 3 segundos medicion = 0 -- Ponemos en cero medicion1 = 0 -- Ponemos en cero max_med = 0 -- Ponemos en cero E = 0 -- La direcciòn a grabar datos en eeprom serà 0x00 sumatoria = 0 -- Ponemos en cero -- -------------------------------------------------------------------- -- -- Desde acà trabajaremos con la EEPROM guardando y sacando datos -- -- -------------------------------------------------------------------- forever loop --Bucle principal -- -- Ahora compararemos los valores de la ùltima mediciòn con la anterior -- -- ----------- y si es mayor, la guardamos en la EEPROM --------------------- if medicion1 < medicion then -- Si la mediciòn es mayor.... data_eeprom_write (E, medicion) -- Guardamos en EEPROM end if -- fin de la condiciòn lcd_clear_screen() -- Borro la pantalla lcd_cursor_position(0,0) -- Coloco el cursor para centrar el mensaje print_string(lcd, line4) -- Escribo el mensaje (Corriendo ejemplo) lcd_cursor_position(1,0) -- Coloco el cursor para centrar el mensaje print_string(lcd, line5) -- Escribo el mensaje (Vmax:.....) -- ----------------- Muestro en el lcd el valor màximo alcanzado --------------- max_med = data_eeprom (E) -- Cargamos el valor de la eeprom en max_med max_med = max_med * 196 / 100 -- convertimos el valor del adc a volt max_med = max_med +2 -- en 3 dìgitos y corregimos error -- -- Si no llegamos a 100 mv., agregamos "0,0" por delante del valor mostrado -- if max_med < 10 then -- Iniciamos la condicion, si no se cumple, -- salta a la otra condicion lcd_cursor_position(1,9) -- Coloco el cursor para ubicar la medición print_dword_dec(lcd, max_med) -- y muestro el valor (en un solo dìgito) lcd_cursor_position(1,8) -- Ahora colocamos el 0 del segundo dìgito lcd_write_char(0 + 48) -- y lo convertimos en ascii lcd_cursor_position(1,7) -- Colocamos la coma en su lugar lcd_write_char(",") lcd_cursor_position(1,6) -- Y agregamos el tercer dìgito lcd_write_char(0 + 48) end if -- Finalizamos la condicion -- -- Si no llegamos al volt, agregamos "0," por delante del valor mostrado -- if (max_med < 100 ) & (max_med >10) then -- Cambiamos la condiciòn lcd_cursor_position(1,8) -- Repetimos los pasos anteriores print_dword_dec(lcd, max_med) -- cambiando la ubicacion de la medicion lcd_cursor_position(1,7) -- Agregamos la coma lcd_write_char(",") lcd_cursor_position(1,6) -- Y el cero lcd_write_char(0 + 48) end if -- -- Si ya estamos en el rango de voltage, pisamos la unidad con la coma -- -- ------------ y reponemos la unidad delante de la coma ------------------- if (max_med > 99 )& (max_med < 200) then lcd_cursor_position(1,7) -- Coloco el cursor para ubicar la medición print_dword_dec(lcd, max_med) -- y muestro el valor en decimal. lcd_cursor_position(1,7) -- Antes que se vea, coloco la coma sobre lcd_write_char(",") -- el dìgito de la unidàd, borrando èste lcd_cursor_position(1,6) -- Y restituyo el dìgito por delante de lcd_write_char(1 + 48) -- la coma end if if (max_med > 199) & (max_med < 300) then lcd_cursor_position(1,7) -- A partir de acà, la posiciòn de print_dword_dec(lcd, max_med) -- escritura es siempre la misma lcd_cursor_position(1,7) lcd_write_char(",") lcd_cursor_position(1,6) lcd_write_char(2 + 48) -- Restituìmos el dìgito end if if (max_med > 299 )& (max_med < 400) then lcd_cursor_position(1,7) -- Coloco el cursor para ubicar la medición print_dword_dec(lcd, max_med) -- y muestro el valor en decimal. lcd_cursor_position(1,7) lcd_write_char(",") lcd_cursor_position(1,6) lcd_write_char(3 + 48) end if if (max_med > 399 )& (max_med < 500) then lcd_cursor_position(1,7) -- Coloco el cursor para ubicar la medición print_dword_dec(lcd, max_med) -- y muestro el valor en decimal. lcd_cursor_position(1,7) lcd_write_char(",") lcd_cursor_position(1,6) lcd_write_char(4 + 48) end if if (max_med > 499 )& (max_med < 600) then lcd_cursor_position(1,7) -- Coloco el cursor para ubicar la medición print_dword_dec(lcd, max_med) -- y muestro el valor en decimal. lcd_cursor_position(1,7) lcd_write_char(",") lcd_cursor_position(1,6) lcd_write_char(5 + 48) end if -- -------- En esta secciòn, mostramos en el display, la tensiòn ------------ -- ---------------------- que ingresamos en el ADC -------------------------- Tension = medicion * 196 / 100 -- convertimos el valor del adc a volt Tension = Tension + 2 -- en 3 dìgitos y corregimos error -- -- Si no llegamos a 100 mv., agregamos "0,0" por delante del valor mostrado -- if Tension < 10 then -- Iniciamos la condicion, si no se cumple, -- salta a la otra condicion lcd_cursor_position(1,19) -- Coloco el cursor para ubicar la medición print_dword_dec(lcd, Tension ) -- y muestro el valor (en un solo dìgito) lcd_cursor_position(1,18) -- Ahora colocamos el 0 del segundo dìgito lcd_write_char(0 + 48) -- y lo convertimos en ascii lcd_cursor_position(1,17) -- Colocamos la coma en su lugar lcd_write_char(",") lcd_cursor_position(1,16) -- Y agregamos el tercer dìgito lcd_write_char(0 + 48) end if -- Finalizamos la condicion -- -- Si no llegamos al volt, agregamos "0," por delante del valor mostrado -- if (Tension < 100 ) & (Tension >10) then -- Cambiamos la condiciòn lcd_cursor_position(1,18) -- Repetimos los pasos anteriores print_dword_dec(lcd, Tension ) -- cambiando la ubicacion de la medicion lcd_cursor_position(1,17) -- Agregamos la coma lcd_write_char(",") lcd_cursor_position(1,16) -- Y el cero lcd_write_char(0 + 48) end if -- -- Si ya estamos en el rango de voltage, pisamos la unidad con la coma -- -- ------------ y reponemos la unidad delante de la coma ------------------- if (Tension > 99 )& (Tension < 200) then lcd_cursor_position(1,17) -- Coloco el cursor para ubicar la medición print_dword_dec(lcd, Tension ) -- y muestro el valor en decimal. lcd_cursor_position(1,17) -- Antes que se vea, coloco la coma sobre lcd_write_char(",") -- el dìgito de la unidàd, borrando èste lcd_cursor_position(1,16) -- Y restituyo el dìgito por delante de lcd_write_char(1 + 48) -- la coma end if if (Tension > 199) & (Tension < 300) then lcd_cursor_position(1,17) -- A partir de acà, la posiciòn de print_dword_dec(lcd, Tension ) -- escritura es siempre la misma lcd_cursor_position(1,17) lcd_write_char(",") lcd_cursor_position(1,16) lcd_write_char(2 + 48) -- Restituìmos el dìgito end if if (Tension > 299 )& (Tension < 400) then lcd_cursor_position(1,17) -- Coloco el cursor para ubicar la medición print_dword_dec(lcd, Tension ) -- y muestro el valor en decimal. lcd_cursor_position(1,17) lcd_write_char(",") lcd_cursor_position(1,16) lcd_write_char(3 + 48) end if if (Tension > 399 )& (Tension < 500) then lcd_cursor_position(1,17) -- Coloco el cursor para ubicar la medición print_dword_dec(lcd, Tension ) -- y muestro el valor en decimal. lcd_cursor_position(1,17) lcd_write_char(",") lcd_cursor_position(1,16) lcd_write_char(4 + 48) end if if (Tension > 499 )& (Tension < 600) then lcd_cursor_position(1,17) -- Coloco el cursor para ubicar la medición print_dword_dec(lcd, Tension ) -- y muestro el valor en decimal. lcd_cursor_position(1,17) lcd_write_char(",") lcd_cursor_position(1,16) lcd_write_char(5 + 48) end if medicion1 = medicion -- Pasamos el valor de la mediciòn actual -- a la mediciòn anterior -- --------- Ahora tomamos la mediciòn del canal 0 del ADC ---------------- -- ---------------255 veces y hacemos un promedio ------------------------ for 255 loop medicion = adc_read_low_res(0) -- Tomamos el valor de la medición -- en el canal 0 sumatoria = sumatoria + medicion -- Sumamos las muestras..... end loop sumatoria = sumatoria / 255 -- y terminamos el promedio, el medicion = sumatoria -- resultado queda en mediciòn delay_100ms(7) -- Hacemos un retardo para que se vean los -- cambios de lectura antes de borrar la pantalla end loop -- Acà terminamos el loop -- Fin del programa