Proyecto dos (libre)
MICROCONTROLADORES
Título del Proyecto
RELOJ DIGITAL DE 24
HORAS CON PIC 16F877A
Objetivo General
Objetivo Específico
- Hacer uso del lenguaje c para la programación del pic 16f877A
- Aprender a usar entradas y salidas analógicas del pic 16f877A
Justificación
Este proyecto tiene
por finalidad mejorar a programar, y poner en práctica a través de un reloj
digital, haciendo uso de lo aprendido y utilizando el pic 16F877A.
también este proyecto es viable porque no utilizamos una lógica cableada sino una lógica de programación que nos permite modificar su estructura fácilmente acorde al avance tecnológico.
esta dirigido aquellas áreas como molles,bibliotecas,estadios,centros históricos y en general lugares donde concurrentes donde se necesita saber la hora
también este proyecto es viable porque no utilizamos una lógica cableada sino una lógica de programación que nos permite modificar su estructura fácilmente acorde al avance tecnológico.
esta dirigido aquellas áreas como molles,bibliotecas,estadios,centros históricos y en general lugares donde concurrentes donde se necesita saber la hora
Diagrama de Bloques
Hardware propuesto utilizando Proteus.
PARTE 1
Temas de investigación.
¿Timers?
Un timer no es más que un contador cuya entrada está conectada al reloj del sistema. De hecho, la mayoría de los timers pueden reconfigurarse como contadores. En ese caso, en lugar de contar pulsos de reloj cuentan los pulsos que llegan a un determinado pin.
Por defecto la señal que van a contabilizar los timers corresponde a la frecuencia del oscilador dividida por cuatro. Por lo tanto en realidad cuentan ciclos máquina, no ciclos de reloj. Con un reloj de 20 Mhz tendríamos una frecuencia de ciclos máquina de 20/4 = 5 MHz, por lo que un ciclo máquina corresponde a 0.2 usec. En principio, el contador del timer se incrementará cada 0.2 microsegundos o 5 veces en 1 usec
¿Qué ventajas tiene usar las
Interrupciones y los Timers?
Una
interrupción es un aviso provocado por un módulo del PIC, por un cambio en el
estado de un pin o un recordatorio de que ha pasado un cierto tiempo. Como su nombre indica este
aviso interrumpirá la tarea que se este haciendo en ese momento y pasaremos a
ejecutar una rutina de servicio o gestión de la interrupción.
CIRCUITO DS 1307
CIRCUITO DS 1307
El DS1307 de Maxim/Dallas es un circuito integrado reloj en tiempo real (RTC) capaz de almacenar y llevar la cuenta de la fecha y hora de manera autónoma, además disponemos de unos cuantos bytes de memoria RAM no volátil (NVRAM)para almacenar datos arbitrarios. En esta entrada, exploraremos las ventajas y operaciones básicas del circuitoDS1307 instalado en el módulo TinyRTC, también explicaremos su funcionamiento en conjunto con una placa arduino para aquellas aplicaciones que requieren un control preciso del tiempo.
El módulo Tiny RTC, además de todo el circuito de soporte para el DS1307, incluye también una memoria EEPROM I2C para almacenar datos en ella y un zócalo para soldar de manera opcional un sensor de temperatura DS18B20 (one-wire), sin embargo en esta ocasión trataremos únicamente el uso del DS1307; el uso de la memoria EEPROM y el sensor quedarán de tarea para el lector.
AVANCE DEL PROYECTO
Exlicacion del programa
https://www.youtube.com/watch?v=xJOrmtBj-Jk&feature=youtu.be
>>Programación del proyecto en CCS Compiler:
________________________________________________________________________
#include <16f877A.h>
#fuses hs
#use delay(clock=20M)
#include <DS1307.c>
#define lcd_data_port getenv("sfr:portd")
#define lcd_enable_pin pin_d3
#define lcd_rs_pin pin_d2
#define lcd_rw_pin pin_A0
#define lcd_data4 pin_d4
#define lcd_data5 pin_d5
#define lcd_data6 pin_d6
#define lcd_data7 pin_d7
#include <LCD.c>
void estadoUno();
void seleccion();
void mostrarSeleccion();
void programacion();
void cambioEstado();
int sec=50,min=59,hora=23,dia=2, mes=10,anio=17,dow=0,estado,eleccion;
char fecha[5];
void main(){
estado=1;
port_b_pullups(true);
lcd_init();
//ds1307_init(DS1307_OUT_1_HZ);
ds1307_set_date_time(dia,mes,anio,dow,hora,min,sec);
ds1307_get_date(dia,mes,anio,dow); /// se obtiene la fecha
ds1307_get_time(hora,min,sec); /// se obtiene la hora
ds1307_get_day_of_week(fecha);
while(true)
{
while(estado==1){//ejecución
estadoUno();
cambioEstado();
}
while(estado==2){//Seleccion
seleccion();
mostrarSeleccion();
cambioEstado();
}
while(estado==3){//Ajuste
programacion();
ds1307_set_date_time(dia,mes,anio,dow,hora,min,sec);
mostrarSeleccion();
cambioEstado();
}
}
}
void programacion(){
if(input(PIN_A1)){
switch(eleccion){
case 0:
if(hora < 23 ){
hora +=1;
delay_ms(200);
}
else{
hora =0;
delay_ms(200);
}
break;
case 1:
if(min < 59 ){
min +=1;
delay_ms(200);
}
else{
min =0;
delay_ms(200);
}
break;
case 2:
if(sec < 59 ){
sec +=1;
delay_ms(200);
}
else{
sec =0;
delay_ms(200);
}
break;
case 3:
if(dia <31 ){
dia +=1;
delay_ms(200);
}
else{
dia =1;
delay_ms(200);
}
break;
case 4:
if(mes <12 ){
mes +=1;
delay_ms(200);
}
else{
mes =1;
delay_ms(200);
}
break;
case 5:
anio+=1;
delay_ms(200);
break;
}
}
if(input(PIN_A2)){
switch(eleccion){
case 0:
if(hora > 0 ){
hora -=1;
delay_ms(200);
}
else{
hora =23;
delay_ms(200);
}
break;
case 1:
if(min > 0 ){
min -=1;
delay_ms(200);
}
else{
min =59;
delay_ms(200);
}
break;
case 2:
if(sec >0 ){
sec -=1;
delay_ms(200);
}
else{
sec =59;
delay_ms(200);
}
break;
case 3:
if(dia >1 ){
dia -=1;
delay_ms(200);
}
else{
dia =31;
delay_ms(200);
}
break;
case 4:
if(mes >1 ){
mes -=1;
delay_ms(200);
}
else{
mes =12;
delay_ms(200);
}
break;
case 5:
if(anio >1 ){
anio-=1;
delay_ms(200);
}
break;
}
}
}
void cambioEstado(){
if(input(PIN_A3)){
estado+=1;
delay_ms(500);
printf(lcd_putc,"\f");
if(estado == 4){
estado=1;
}
}
}
void estadoUno(){
ds1307_get_date(dia,mes,anio,dow); /// se obtiene la fecha
ds1307_get_time(hora,min,sec); /// se obtiene la hora
ds1307_get_day_of_week(fecha);
lcd_gotoxy(1,1);
printf(lcd_putc,"%s %02u/%02u/20%02u",fecha,dia,mes,anio);
lcd_gotoxy(5,2);
printf(lcd_putc, "%02u:%02u:%02u",hora, min, sec);
//delay_ms();
}
void seleccion(){
if(input(PIN_A1)){
delay_ms(200);
if(eleccion<5)
eleccion+=1;
}
if(input(PIN_A2)){
delay_ms(200);
if(eleccion>0)
eleccion-=1;
}
}
void mostrarSeleccion(){
if(estado==2)
printf(lcd_putc," ");
lcd_gotoxy(1,1);
switch(eleccion){
case 0:
printf(lcd_putc,"* ");
break;
case 1:
printf(lcd_putc," * ");
break;
case 2:
printf(lcd_putc," * ");
break;
case 3:
printf(lcd_putc,"* ");
break;
case 4:
printf(lcd_putc," * ");
break;
case 5:
printf(lcd_putc," * ");
break;
}
lcd_gotoxy(1,2);
if(eleccion<=2)
printf(lcd_putc,"%02d:%02d:%02d\n",hora,min,sec);
else
printf(lcd_putc,"%02d/%02d/%02d\n",dia,mes,anio);
}
>>simulación en proteus:
Exlicacion del programa
https://www.youtube.com/watch?v=xJOrmtBj-Jk&feature=youtu.be
>>Programación del proyecto en CCS Compiler:
________________________________________________________________________
#include <16f877A.h>
#fuses hs
#use delay(clock=20M)
#include <DS1307.c>
#define lcd_data_port getenv("sfr:portd")
#define lcd_enable_pin pin_d3
#define lcd_rs_pin pin_d2
#define lcd_rw_pin pin_A0
#define lcd_data4 pin_d4
#define lcd_data5 pin_d5
#define lcd_data6 pin_d6
#define lcd_data7 pin_d7
#include <LCD.c>
void estadoUno();
void seleccion();
void mostrarSeleccion();
void programacion();
void cambioEstado();
int sec=50,min=59,hora=23,dia=2, mes=10,anio=17,dow=0,estado,eleccion;
char fecha[5];
void main(){
estado=1;
port_b_pullups(true);
lcd_init();
//ds1307_init(DS1307_OUT_1_HZ);
ds1307_set_date_time(dia,mes,anio,dow,hora,min,sec);
ds1307_get_date(dia,mes,anio,dow); /// se obtiene la fecha
ds1307_get_time(hora,min,sec); /// se obtiene la hora
ds1307_get_day_of_week(fecha);
while(true)
{
while(estado==1){//ejecución
estadoUno();
cambioEstado();
}
while(estado==2){//Seleccion
seleccion();
mostrarSeleccion();
cambioEstado();
}
while(estado==3){//Ajuste
programacion();
ds1307_set_date_time(dia,mes,anio,dow,hora,min,sec);
mostrarSeleccion();
cambioEstado();
}
}
}
void programacion(){
if(input(PIN_A1)){
switch(eleccion){
case 0:
if(hora < 23 ){
hora +=1;
delay_ms(200);
}
else{
hora =0;
delay_ms(200);
}
break;
case 1:
if(min < 59 ){
min +=1;
delay_ms(200);
}
else{
min =0;
delay_ms(200);
}
break;
case 2:
if(sec < 59 ){
sec +=1;
delay_ms(200);
}
else{
sec =0;
delay_ms(200);
}
break;
case 3:
if(dia <31 ){
dia +=1;
delay_ms(200);
}
else{
dia =1;
delay_ms(200);
}
break;
case 4:
if(mes <12 ){
mes +=1;
delay_ms(200);
}
else{
mes =1;
delay_ms(200);
}
break;
case 5:
anio+=1;
delay_ms(200);
break;
}
}
if(input(PIN_A2)){
switch(eleccion){
case 0:
if(hora > 0 ){
hora -=1;
delay_ms(200);
}
else{
hora =23;
delay_ms(200);
}
break;
case 1:
if(min > 0 ){
min -=1;
delay_ms(200);
}
else{
min =59;
delay_ms(200);
}
break;
case 2:
if(sec >0 ){
sec -=1;
delay_ms(200);
}
else{
sec =59;
delay_ms(200);
}
break;
case 3:
if(dia >1 ){
dia -=1;
delay_ms(200);
}
else{
dia =31;
delay_ms(200);
}
break;
case 4:
if(mes >1 ){
mes -=1;
delay_ms(200);
}
else{
mes =12;
delay_ms(200);
}
break;
case 5:
if(anio >1 ){
anio-=1;
delay_ms(200);
}
break;
}
}
}
void cambioEstado(){
if(input(PIN_A3)){
estado+=1;
delay_ms(500);
printf(lcd_putc,"\f");
if(estado == 4){
estado=1;
}
}
}
void estadoUno(){
ds1307_get_date(dia,mes,anio,dow); /// se obtiene la fecha
ds1307_get_time(hora,min,sec); /// se obtiene la hora
ds1307_get_day_of_week(fecha);
lcd_gotoxy(1,1);
printf(lcd_putc,"%s %02u/%02u/20%02u",fecha,dia,mes,anio);
lcd_gotoxy(5,2);
printf(lcd_putc, "%02u:%02u:%02u",hora, min, sec);
//delay_ms();
}
void seleccion(){
if(input(PIN_A1)){
delay_ms(200);
if(eleccion<5)
eleccion+=1;
}
if(input(PIN_A2)){
delay_ms(200);
if(eleccion>0)
eleccion-=1;
}
}
void mostrarSeleccion(){
if(estado==2)
printf(lcd_putc," ");
lcd_gotoxy(1,1);
switch(eleccion){
case 0:
printf(lcd_putc,"* ");
break;
case 1:
printf(lcd_putc," * ");
break;
case 2:
printf(lcd_putc," * ");
break;
case 3:
printf(lcd_putc,"* ");
break;
case 4:
printf(lcd_putc," * ");
break;
case 5:
printf(lcd_putc," * ");
break;
}
lcd_gotoxy(1,2);
if(eleccion<=2)
printf(lcd_putc,"%02d:%02d:%02d\n",hora,min,sec);
else
printf(lcd_putc,"%02d/%02d/%02d\n",dia,mes,anio);
}
>>simulación en proteus:
- armado del circuito en protoboard.
- probando el programa en el entrenador.
- Video de la prueba en el entrenador UFK-010U.
https://youtu.be/B_pzlXCgrJg
- Armado del circuito en físico.
Observaciones y conclusiones.
- Tras realizar este proyecto pudimos entender y comprender mucho mejor el lenguaje C aplicado a la electrónica.
- Luego de haber desarrollado este proyecto podemos concluir que el pic 16f877A nos permite obtener salida y entradas tanto analógica y digitales.
- se uso formatos como el cero a la izquierdacuando el digito de las fechas es solo uno de los días y meses ademas de las horas,minutos y segundos para mostrar por lcd.
- Se puede concluir que el circuito ds1307 almacena y lleva la cuenta de la fecha y hora de manera autómata.
- Se utilizo el pic 16f877A
- en el programa utilizamos resistencias internas para nuestra función principal.
- se uso la librería ds 1307, la cual nos provee de funciones de fecha y hora.
- se utilizo una batería externa de 3v para no perder la información de cuando el circuito se apague.



Comentarios
Publicar un comentario