/* * fonction.cpp * * Created: 19/12/2013 14:18:08 * Author: Adrien */ #define F_CPU 16000000UL //Fréquence horloge à 16Mhz #include #include #include /* Chargement des librairie */ #include "./lib/hc74595.h" #include "./lib/DS1307.h" #include "lib/UART.h" /* Config des pin */ #define LED_RED 1< Passage à 0 sur les Nixie Tube ...) #define LOW(bit) ~(bit) /* Création des objets */ ds1307 rtc; hc74595 shiftRegister(SHIFT_REGISTER_DATA, SHIFT_REGISTER_CLK, SHIFT_REGISTER_CONFIRM, &PORTD); uint8_t usart; int bcm_rgb_actif = 0; int bcm_red = 0; int bcm_green = 0; int bcm_blue = 0; int abc=0; void init_interupt() { TCCR0A = 0x00; TCCR0B = (TCCR0B&(~(_BV(CS01)|_BV(CS02))))|_BV(CS00); //Prescale 8 TCNT0 = 0x00 ; OCR0A = 0x01; TIMSK0 = _BV(OCIE0A); //Enable interupt } int int_to_bcd(int val) { int high = 0; while (val >= 10) // Count tens { high++; val -= 10; } return (high << 4) | val; } void setup_pins() { USART_ini(); DDRD &= LOW(1<>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, 0); envoi = rtc.r_minute(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, 0); envoi = rtc.r_seconde(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, 0); shiftRegister.confirm(); } void affichage_date() { uint8_t envoi = rtc.r_jour(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, false); envoi = rtc.r_moi(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, false); envoi = rtc.r_year(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, false); shiftRegister.confirm(); } void affichage_shutdwon() { shiftRegister.send(0xFF, false); shiftRegister.send(0xFF, false); shiftRegister.send(0xFF, false); shiftRegister.confirm(); } void routine_affichage() { uint8_t secondes_var = rtc.r_seconde(); if(secondes_var >= 0x20 && secondes_var <= 0x30 && 1==2) //Affiche la date pandant 10 seconde affichage_date(); else affichage_heur(); } void clignotement(int n, bool date) { n++; uint8_t envoi; if(date) { switch(n) { case 1: envoi = 0xff; shiftRegister.send(envoi, false); envoi = rtc.r_moi(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, false); envoi = rtc.r_year(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, false); shiftRegister.confirm(); break; case 2: envoi = rtc.r_jour(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, false); envoi = 0xff; shiftRegister.send(envoi, false); envoi = rtc.r_year(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, false); shiftRegister.confirm(); break; case 3: envoi = rtc.r_jour(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, false); envoi = rtc.r_moi(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, false); envoi = 0xff; shiftRegister.send(envoi, false); shiftRegister.confirm(); break; } } else { switch(n) { case 1: envoi = 0xff; shiftRegister.send(envoi, 0); envoi = rtc.r_minute(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, 0); envoi = rtc.r_seconde(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, 0); shiftRegister.confirm(); break; case 2: envoi = rtc.r_heur(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, 0); envoi = 0xff; shiftRegister.send(envoi, 0); envoi = rtc.r_seconde(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, 0); shiftRegister.confirm(); break; case 3: envoi = rtc.r_heur(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, 0); envoi = rtc.r_minute(); envoi = (envoi>>4)|((envoi&0x0f)<<4); shiftRegister.send(envoi, 0); envoi = 0xff; shiftRegister.send(envoi, 0); shiftRegister.confirm(); break; } } } void couleur() { usart = USART_Receive(); uint8_t mask = LED_BLUE|LED_GREEN|LED_RED; //COnfigure le mask uint8_t curent_couleur; if((PINB & (1< mask) curent_couleur = 0x00; else bcm_rgb_actif = 0; if (curent_couleur&LED_BLUE) PORTB |= LED_BLUE; else PORTB &= LOW(LED_BLUE); if(curent_couleur&LED_GREEN) PORTB |= LED_GREEN; else PORTB &= LOW(LED_GREEN); if(curent_couleur & LED_RED) PORTB |= LED_RED; else PORTB &= LOW(LED_RED); } } else if((PINB & (1<= (tmps_clignotement*2)) a = 0; if (PINB & (1< tmps_clignotement) //Clignotement clignotement(SR_SECONDE, false); else affichage_heur(); if((PINB & (1< tmps_clignotement) //Clignotement clignotement(SR_MINUTE, false); else affichage_heur(); if(PINB & (1<>4)+1)<<4; //Incrémente de 10 else curent_minute++; //Incrémente de 1 if(curent_minute >= 0x60) //Si supérieur à 60 retour à 00 /!\ Pas d'incrémentation de l'heur !! curent_minute = 0x00; rtc.w_minute(curent_minute); //Met à jour le DS1307 } else if(PINB & (1<>4)-1)<<4)|0x09; //Décrémente de 10 else if(curent_minute == 0x00) // Bug en simulation ..........???????????~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ curent_minute = 0x59; else curent_minute--; //Décrémente de 1 if(curent_minute > 0x60) curent_minute = 0x59; rtc.w_minute(curent_minute); //Met à jour le DS1307 } break; case 3: //Config de l'heur if(a > tmps_clignotement) //Clignotement toute les clignotement(SR_HEUR, false); else affichage_heur(); if(PINB & (1<>4)+1)<<4; //Incrémente de 10 else if(curent_heur >= 0x23) //Si arrivé à 24H retour à 00H, /!\ Attention n'incrémente pas la date !! curent_heur = 0x00; else curent_heur = ((curent_heur&0x0F)+1)|(curent_heur&0xF0); //Incrémente de 1 rtc.w_heur(curent_heur, 0); //Met à jour le DS1307 } else if(PINB & (1<>4)-1)<<4)|0x09; //Décrémente de 10 else curent_heur = ((curent_heur&0x0f)-1)|(curent_heur&0xf0); //Décrémente de 1 rtc.w_heur(curent_heur, 0); //Met à jour le DS1307 } break; case 4: //Config du jour PORTC &= LOW(1< tmps_clignotement) //Clignotement clignotement(SR_JOURS, true); else affichage_date(); if(PINB & (1<>4)+1)<<4; //Incrémente de 10 else curent_day = ((curent_day&0x0F)+1)|(curent_day&0xF0); //Incrémente de 1 if(curent_day > 0x31) curent_day = 0x00; rtc.w_date(curent_day); //Met à jour le DS1307 } else if(PINB & (1<>4)-1)<<4)|0x09; //Décrémente de 10 else curent_heur = ((curent_heur&0x0F)-1)|(curent_heur&0xF0); //Décrémente de 1 if(curent_heur == 0x00) curent_heur = 0x31; rtc.w_date(curent_heur); //Met à jour le DS1307 } break; case 5: //config du mois if(a > tmps_clignotement) //Clignotement clignotement(SR_MOIS, true); else affichage_date(); if(PINB & (1<>4)+1)<<4; //Incrémente de 10 else curent_months = ((curent_months&0x0F)+1)|(curent_months&0xF0); //Incrémente de 1 if(curent_months > 0x12) curent_months = 0x01; rtc.w_moi(curent_months); //Met à jour le DS1307 } else if(PINB & (1<>4)-1)<<4)|0x09; //Décrémente de 10 else curent_months = ((curent_months&0x0F)-1)|(curent_months&0xF0); //Décrémente de 1 if(curent_months < 0x01) curent_months = 0x12; rtc.w_moi(curent_months); //Met à jour le DS1307 } break; case 6: //Config de l'année if(a > tmps_clignotement) //Clignotement clignotement(SR_ANNEE, true); else affichage_date(); if(PINB & (1<>4)+1)<<4; //Incrémente de 10 else curent_year = ((curent_year&0x0F)+1)|(curent_year&0xF0); //Incrémente de 1 if(curent_year > 0x99) curent_year = 0x00; rtc.w_year(curent_year); //Met à jour le DS1307 } else if(PINB & (1<>4)-1)<<4)|0x09; //Décrémente de 10 else if (curent_year != 0x00) curent_year = ((curent_year&0x0F)-1)|(curent_year&0xF0); //Décrémente de 1 else curent_year = 0x99; rtc.w_year(curent_year); //Met à jour le DS1307 } break; } PORTC &= LOW(1<100) a=0; if(usart == 0xC1) { usart = USART_Receive(); for(int b = 0; !usart ; b++) { usart = USART_Receive(); affichage_heur(); if(b>100) b=0; _delay_ms(1); } rtc.w_seconde(int_to_bcd(usart)); USART_Transmit(0xC1); } if(usart == 0xC2) { usart = USART_Receive(); for(int b = 0; !usart ; b++) { usart = USART_Receive(); affichage_heur(); if(b>100) b=0; _delay_ms(1); } rtc.w_minute(int_to_bcd(usart)); USART_Transmit(0xC2); } if(usart == 0xC3) { usart = USART_Receive(); for(int b = 0; !usart ; b++) { usart = USART_Receive(); affichage_heur(); if(b>100) b=0; _delay_ms(1); } rtc.w_heur(int_to_bcd(usart), 0); USART_Transmit(0xC3); } if(usart == 0xC4) { cfg =false; } } } }