int main(void) { #if _EXT_EEPROM_EMPTY==1 DDRB=0xFF; PORTB=0x00; i2cSetBitrate(100); //Ustaw prêdkoœæ i2c na 100kHz EXT_EEPROM_var *struktura_eeprom; struktura_eeprom=malloc(sizeof(EXT_EEPROM_var)); strcpy(struktura_eeprom->empty, " "); strcpy(struktura_eeprom->temperatura, "Temperatura: "); strcpy(struktura_eeprom->m1, "Ustawienia "); strcpy(struktura_eeprom->m10, "Data: "); strcpy(struktura_eeprom->m11, "Godzina: "); strcpy(struktura_eeprom->m12, "LCD: "); strcpy(struktura_eeprom->eePCF_Sunday, "Niedziela"); strcpy(struktura_eeprom->eePCF_Monday, "Poniedzialek"); strcpy(struktura_eeprom->eePCF_Tuesday, "Wtorek"); strcpy(struktura_eeprom->eePCF_Wednesday, "Sroda"); strcpy(struktura_eeprom->eePCF_Thursday, "Czwartek"); strcpy(struktura_eeprom->eePCF_Friday, "Piatek"); strcpy(struktura_eeprom->eePCF_Saturday, "Sobota"); strcpy(struktura_eeprom->eePCF_January, "Styczen"); strcpy(struktura_eeprom->eePCF_February, "Luty"); strcpy(struktura_eeprom->eePCF_March, "Marzec"); strcpy(struktura_eeprom->eePCF_April, "Kwiecien"); strcpy(struktura_eeprom->eePCF_May, "Maj"); strcpy(struktura_eeprom->eePCF_June, "Czerwiec"); strcpy(struktura_eeprom->eePCF_July, "Lipiec"); strcpy(struktura_eeprom->eePCF_August, "Sierpien"); strcpy(struktura_eeprom->eePCF_September, "Wrzesien"); strcpy(struktura_eeprom->eePCF_October, "Pazdziernik"); strcpy(struktura_eeprom->eePCF_November, "Listopad"); strcpy(struktura_eeprom->eePCF_December, "Grudzien"); PORTB=0x0F; EI2C_write_buf(ADDR_EEMEM_24C64, 0, sizeof(EXT_EEPROM_var), (uint8_t*)struktura_eeprom); free(struktura_eeprom); PORTB=0xFF; #endif // _EXT_EEPROM_EMPTY #if _EXT_EEPROM_EMPTY==0 char bufor_lcd[41]; //Bufor przechowuj¹cy znaki z pamiêci EEPROM //Zmienne wykorzystywane w opóŸnieniach: uint8_t state=0; uint32_t cnt=0, offset_cnt=0; uint8_t state_light=0; uint32_t cnt_light=0, offset_cnt_light=0; Ustawienia ustawienia; //Struktura s³u¿¹ca do odczytania ustawieñ z EEPROM ustawienia.ustawienia_poczatkowe=0; //Ustaw PORTB jak wyjœcie dla LED: DDRB=0xFF; PORTB=0x00; Flagi.flaga_klawiatura=1; //// ustawienia TIMER0, przerwanie co 10us OCR0 = 19; TCCR0 |= (1<<WGM01); //Tryb ctc TCCR0 |= (1<<CS01); // Preskaler 8 TIMSK |= (1<<OCIE0); // Przerwanie INT0 MCUCR |= (1<<ISC01); // wyzwalanie zboczem opadaj¹cym GICR |= (1<<INT0); // odblokowanie przerwania PORTD |= (1<<PD2); // podci¹gniêcie pinu INT0 do VCC i2cSetBitrate(100); //Ustaw prêdkoœæ i2c na 100kHz lcd_init(); pobierz_czas(&czas); pobierz_date(&data); /* sprawdzamy ile czujników DS18xxx widocznych jest na magistrali */ czujniki_cnt = search_sensors(); /* wysy³amy rozkaz wykonania pomiaru temperatury * do wszystkich czujników na magistrali 1Wire * zak³adaj¹c, ¿e zasilane s¹ w trybie NORMAL, * gdyby by³ to tryb Parasite, nale¿a³oby u¿yæ * jako pierwszego prarametru DS18X20_POWER_PARASITE */ DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL ); /* czekamy 750ms na dokonanie konwersji przez pod³¹czone czujniki */ _delay_ms(750); /* dokonujemy odczytu temperatury z pierwszego czujnika o ile zosta³ wykryty */ /* wyœwietlamy temperaturê gdy czujnik wykryty */ if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &subzero, &cel, &cel_fract_bits) ) display_temp(0); else { lcd_locate(0,0); lcd_str("term. error "); /* wyœwietlamy informacjê o b³êdzie jeœli np brak czujnika lub b³¹d odczytu */ } #endif // _EXT_EEPROM_EMPTY while (1) { #if _EXT_EEPROM_EMPTY==0 eeprom_read_block(&ustawienia, &deafult_flags, sizeof(deafult_flags)); if (ustawienia.ustawienia_poczatkowe) { eeprom_read_block(&data, &deafult_data, sizeof(data)); eeprom_read_block(&czas, &deafult_czas, sizeof(czas)); ustaw_date(&data); ustaw_czas(&czas); ustawienia.ustawienia_poczatkowe=0; eeprom_update_block(&ustawienia, &deafult_flags, sizeof(deafult_flags)); } switch(state_light) { case 0: if (Flagi.light_lcd) { state_light=1; cli(); cnt_light=200000; offset_cnt_light=licznik; sei(); } break; case 1: if(cnt_light<=licznik-offset_cnt_light) { Flagi.light_lcd=0; state_light=0; } break; } lcd_light(Flagi.light_lcd); //OpóŸnienie dzia³añ po wciœniêciu przycisku switch(state) { case 0: key_code=debouncer(KlawiaturaSkan()); if(key_code) { state=1; Flagi.light_lcd=1; //W³¹cz podœwietlanie LCD cli(); cnt=50000; offset_cnt=licznik; sei(); } break; case 1: key_code=0; if(cnt<=licznik-offset_cnt) { state=0; } break; } if (Flagi.flaga_menu_func==1) { EI2C_read_buf(ADDR_EEMEM_24C64, menu_ptr->addr_ext_eeprom, menu_ptr->size_ext_eeprom, (uint8_t *)bufor_lcd); if(Flagi.flaga_lcd) { lcd_locate(0, 0); } (*menu_ptr->funkcja)(bufor_lcd); //WskaŸnik na funkcje dla danej pozycji menu } if(Flagi.flaga_klawiatura==1) { if (key_code == PRZYCISK_PRAWO) { if(menu_ptr->next!=NULL) { Flagi.flaga_lcd=1; menu_ptr=menu_ptr->next; } } else if (key_code == PRZYCISK_LEWO) { if(menu_ptr->prev!=NULL) { Flagi.flaga_lcd=1; menu_ptr=menu_ptr->prev; } } else if (key_code == PRZYCISK_DOL) { if(menu_ptr->down!=NULL) { Flagi.flaga_lcd=1; menu_ptr=menu_ptr->down; } } else if (key_code == PRZYCISK_GORA) { if(menu_ptr->up!=NULL) { Flagi.flaga_lcd=1; menu_ptr=menu_ptr->up; } } } if(menu_ptr->funkcja!=NULL) Flagi.flaga_menu_func=1; else Flagi.flaga_menu_func=0; #endif // _EXT_EEPROM_EMPTY } }
void init_hardware(void) { // reset all ports to input, no pullup DDRA = 0; PORTA = 0; DDRB = 0; PORTB = 0; DDRC = 0; PORTC = 0; DDRD = 0; PORTD = 0; RS232_init(); // initialize RS232 interface initADC(); SFIOR = 0; i2c_init(); // initialize i2c bus and lcd display lcd_init(); lcd_command(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF); lcd_light(true); // set LED output DDR(LED1_PORT) |= _BV(LED1); DDR(LED2_PORT) |= _BV(LED2); DDR(LED3_PORT) |= _BV(LED3); DDR(LED4_PORT) |= _BV(LED4); DDR(LED5_PORT) |= _BV(LED5); // set SPEAKER output DDR(SPEAKER_PORT) |= _BV(SPEAKER); // set Controller Input Pull-UPs // CONTROLLER_PORT |= (_BV(CONTROLLER1_SW) | _BV(CONTROLLER2_SW) | _BV(CONTROLLER3_SW) | _BV(CONTROLLER4_SW)); // switch pull-ups SW_FUEL_PORT |= _BV(SW_FUEL); SW_START_PORT |= _BV(SW_START); //SW_PACECAR_PORT |= _BV(SW_PACECAR); SLOT1_PORT &= ~_BV(SLOT1); SLOT2_PORT &= ~_BV(SLOT2); // control outputs // DDR(LAP_COUNTER_PORT) |= _BV(LAP_COUNTER); // setup rail control //RAIL_DETECT_PORT |= _BV(RAIL_DETECT); // enable internal pull-up // DDR(RAIL_POWER_PORT) |= _BV(RAIL_POWER); // setup debut output on i2c pins DDR(PORTC) |= _BV(PC0) | _BV(PC1); // display init sequence on LEDs LED(1, 1); blinkdelay(); LED(2, 1); blinkdelay(); LED(3, 1); blinkdelay(); LED(4, 1); blinkdelay(); LED(5, 1); blinkdelay(); LED(1, 0); blinkdelay(); LED(2, 0); blinkdelay(); LED(3, 0); blinkdelay(); LED(4, 0); blinkdelay(); LED(5, 0); // setup response receiver timer // TCCR0 = (1<<CS01); //divide by 8 // interrupt enable + tcnt0 set in timer2 // setup data bit + carid timer // TCCR2 = (1<<CS21) | (1<<WGM21); //divide by 8, set compare match // OCR2 = TIMER2_50US; // TIMSK |= _BV(OCIE2); //enable timer2 interrupt // enable carid interrupts MCUCR = _BV(ISC00) | _BV(ISC01) | _BV(ISC10) | _BV(ISC11); // INT0/1 rising edge GICR = _BV(INT0) | _BV(INT1) ; // Enable INT0 + INT1 // setup data packet timer TCCR1B = (1<<CS11) | (1<<WGM12); //divide by 8, set compare match (1mhz clock) OCR1A = TIMER1_500NS; //OCR1A = TIMER1_7500NS; TIMSK |= _BV(OCIE1A); //enable timer1 interrupt RS232_puts_p(PSTR("FreeSlot Blackbox v")); RS232_puts(VERSION); RS232_putc('\n'); }