Tzn. PCF8583, to dzisiaj już przestarzała konstrukcja, populara, bo dobrze opisana swego czasu, ale są znacznie lepsze zegary RTC jak DS1307, gdzie mamy wręcz wyjście oscylatora, i wybór częstotliwości 1Hz/4.096KHz/8.192KHz i 32.768KHz czyli sam kwarc zegarka.
Taki ukłąd byłby znacznie lepszy jeżeli chodzi o energooszczędność.
Atmega16 - podtrzymanie Goldcapem
Dodałem w załączniku.
Co do trybu Uśpienia. Można by to zrobić tak żeby zastosować tryb Idle na czas tych 100ms. Tylko problem w tym że funkcje nie są wywoływane co 100ms...jak to zrobić żeby były????
Plik main.c
Co do trybu Uśpienia. Można by to zrobić tak żeby zastosować tryb Idle na czas tych 100ms. Tylko problem w tym że funkcje nie są wywoływane co 100ms...jak to zrobić żeby były????
Plik main.c
Kod: Zaznacz cały
#include <avr/io.h>
#include <util/delay.h>
#include "display.h"
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include "keyb.h"
#include "czas.h"
void fv_Tryby_Pracy(void);
unsigned char uc_display_enable;
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
licz_czas();
}
int main(void)
{
//Kierunki portów:
DDRA=0b11111110;
DDRB=0b11111111;
DDRC=0b11111111;
DDRD=0b00111111;
//Podciągnięcie wejść przycisków do Vcc
PORTD |=0b01000000;
PORTD |=0b10000000;
// Inicjalizacja Timer1
TCCR1B |= (1<<WGM12) | (1<<CS10);// tryb CTC, prescaler /1024
OCR1A = 41943; // wartość porównania
TIMSK |= (1<<OCIE1A); // zezwolenie na przerwanie
//Wyłacznie komparatora analogowego
ACSR |= (1<<ACD);
sei();
while(1)
{
if(!(PINA & 1<<0))
{
uc_display_enable = 0;
}
else
{
uc_display_enable = 1;
}
fv_HAL_keyb_100ms();
fv_Tryby_Pracy();
fv_HAL_Display_100ms();
sleep_mode();
}
}
void fv_Tryby_Pracy(void)
{
}
- Załączniki
-
- zegar1.rar
- (41.44 KiB) Pobrany 327 razy
kayron: dla mnie brak multiplekserowania to wielka zaleta, z resztą się zgadzam.
malina555: przy takim obłożeniu pinów radził bym wybrać procka mega162, ma o 3 piny we/wy więcej. Teraz już pewnie po ptakach.
Co do uśpienia, to sleep zatrzymuje procka do czasu następnego przerwania. Wywal wszystkie delay(100) z funkcji, zamiast tego możesz sprawdzać upływ czasu odczytując setne części sekundy (zmienna zwiększana przez przerwanie).
A żeby timer 2 liczył przy uśpionym procku, trzeba przestawić fusy na wewnętrzny oscylator RC (sprawdź, może oscylator 400khz od watchdoga wystarczy), jako kwarc podpiąć zegarkowy i włączyć timer 2 w trybie asynchronicznym. W takiej sytuacji przerwanie timera 2 liczy czas i trochę trzeba będzie program przerobić.
Wszystko masz w dokumentacji.
malina555: przy takim obłożeniu pinów radził bym wybrać procka mega162, ma o 3 piny we/wy więcej. Teraz już pewnie po ptakach.
Co do uśpienia, to sleep zatrzymuje procka do czasu następnego przerwania. Wywal wszystkie delay(100) z funkcji, zamiast tego możesz sprawdzać upływ czasu odczytując setne części sekundy (zmienna zwiększana przez przerwanie).
A żeby timer 2 liczył przy uśpionym procku, trzeba przestawić fusy na wewnętrzny oscylator RC (sprawdź, może oscylator 400khz od watchdoga wystarczy), jako kwarc podpiąć zegarkowy i włączyć timer 2 w trybie asynchronicznym. W takiej sytuacji przerwanie timera 2 liczy czas i trochę trzeba będzie program przerobić.
Wszystko masz w dokumentacji.