Atmega16 - přesnost hodin
Moderátor: Moderátoři
Atmega16 - přesnost hodin
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <string.h>
#define bitSet(var, mask) ((var) |= (1 << (mask)))
#define bitClear(var, mask) ((var) &= ~(1 << (mask)))
#define F_CPU 14745600UL // 14.7456 MHz
#include <util/delay.h>
void m_delay_ms(unsigned int ms) {
unsigned int i;
for ( i=0; i<ms; i++) { _delay_ms(1); }
}
void m_delay_s(unsigned int s) {
unsigned int i, i2;
for ( i=0; i<s; i++) { for ( i2=0; i2<100; i2++) { _delay_ms(10); } }
}
unsigned int hodiny=23,minuty=59,sekundy=50;
unsigned int ir0count=0, ir0=0; // signalizace interrupt 0
void setled(void){
int pomProm=0, pomProm2=0, pomProm3=0;
pomProm = hodiny/10;
pomProm3 = pomProm;
for (pomProm2=4; pomProm2>=3; pomProm2--) {
if(pomProm3 % 2) bitSet(PORTB, pomProm2); else bitClear(PORTB, pomProm2);
pomProm3 /= 2;
}
pomProm3 = hodiny-(10*pomProm);
pomProm2=0;
for (pomProm2=2; pomProm2>=-1; pomProm2--) {
if (pomProm2>=0) {
if(pomProm3 % 2) bitSet(PORTB, pomProm2); else bitClear(PORTB, pomProm2);
} else {
if(pomProm3 % 2) bitSet(PORTA, 7); else bitClear(PORTA, 7);
}
pomProm3 /= 2;
}
pomProm2=0;
pomProm=minuty/10;
pomProm3 = pomProm;
for (pomProm2=4; pomProm2<=6; pomProm2++) {
if(pomProm3 % 2) bitSet(PORTC, pomProm2); else bitClear(PORTC, pomProm2);
pomProm3 /= 2;
}
pomProm3 = minuty-(10*pomProm);
pomProm2=0;
for (pomProm2=0; pomProm2<=3; pomProm2++) {
if(pomProm3 % 2) bitSet(PORTC, pomProm2); else bitClear(PORTC, pomProm2);
pomProm3 /= 2;
}
pomProm2=0;
pomProm=sekundy/10;
pomProm3 = pomProm;
for (pomProm2=2; pomProm2>=0; pomProm2--) {
if(pomProm3 % 2) bitSet(PORTA, pomProm2); else bitClear(PORTA, pomProm2);
pomProm3 /= 2;
}
pomProm3 = sekundy-(10*pomProm);
pomProm2=0;
for (pomProm2=6; pomProm2>=3; pomProm2--) {
if(pomProm3 % 2) bitSet(PORTA, pomProm2); else bitClear(PORTA, pomProm2);
pomProm3 /= 2;
}
}
void uptime(void){
sekundy++;
if (sekundy >= 60) {
if (minuty >= 59) {
if (hodiny >= 23) hodiny = 0; else hodiny++;
minuty = 0;
}
else {
minuty++;
}
sekundy = 0;
}
setled();
}
ISR(TIMER0_OVF_vect) {
TCNT0=16; // 14.7456MHz/1024/240=60 preruseni/sec
ir0count++;
if (ir0count>=60) {
ir0count=0;
ir0=1;
}
if (bit_is_clear(PIND, 6)) {
hodiny=12;
minuty=40;
sekundy=0;
setled();
}
}
int main() {
// Nastaveni pinu jako vstupnich
bitClear (DDRD, 6);
bitSet (PORTD, 6);
// Nastaveni pinu jako vystupnich
bitSet (DDRB, 0);
bitSet (DDRB, 1);
bitSet (DDRB, 2);
bitSet (DDRB, 3);
bitSet (DDRB, 4);
bitSet (DDRA, 0);
bitSet (DDRA, 1);
bitSet (DDRA, 2);
bitSet (DDRA, 3);
bitSet (DDRA, 4);
bitSet (DDRA, 5);
bitSet (DDRA, 6);
bitSet (DDRA, 7);
bitSet (DDRC, 0);
bitSet (DDRC, 1);
bitSet (DDRC, 2);
bitSet (DDRC, 3);
bitSet (DDRC, 4);
bitSet (DDRC, 5);
bitSet (DDRC, 6);
bitSet(TCCR0, CS00); // Clock prescaler (/ 1024) 1. cast
bitSet(TCCR0, CS02); // Clock prescaler (/ 1024) 2. cast
bitSet(TIMSK, TOIE0); // povoleni preruseni od casovace
sei(); // povoleni preruseni globalne
while(1) {
if(ir0) {
ir0=0;
uptime();
}
m_delay_ms(0);
}
return 0;
}