added incomplete RTC module
This commit is contained in:
parent
5c8035d2e9
commit
4d41456906
5
Makefile
5
Makefile
@ -1,5 +1,5 @@
|
|||||||
PRG = rgbyteclock
|
PRG = rgbyteclock
|
||||||
OBJ = rgbyteclock.o timer.o lcd.o main.o
|
OBJ = rgbyteclock.o timer.o lcd.o main.o rtc.o
|
||||||
MCU_TARGET = atmega16
|
MCU_TARGET = atmega16
|
||||||
OPTIMIZE = -Os
|
OPTIMIZE = -Os
|
||||||
|
|
||||||
@ -25,10 +25,11 @@ $(PRG).elf: $(OBJ)
|
|||||||
@echo
|
@echo
|
||||||
|
|
||||||
# dependency:
|
# dependency:
|
||||||
rgbyteclock.o: timer.o lcd.o rgbyteclock.h
|
rgbyteclock.o: timer.o lcd.o rgbyteclock.h rtc.o
|
||||||
main.o: rgbyteclock.o
|
main.o: rgbyteclock.o
|
||||||
timer.o:timer.h
|
timer.o:timer.h
|
||||||
lcd.o: lcd.h
|
lcd.o: lcd.h
|
||||||
|
rtc.o: rtc.h
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf *.o $(PRG).elf *.eps *.png *.pdf *.bak
|
rm -rf *.o $(PRG).elf *.eps *.png *.pdf *.bak
|
||||||
|
132
rtc.c
Normal file
132
rtc.c
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
/*
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||||
|
* <struppi@struppi.name> wrote this file. As long as you retain this notice you
|
||||||
|
* can do whatever you want with this stuff. If we meet some day, and you think
|
||||||
|
* this stuff is worth it, you can buy me a beer in return.
|
||||||
|
* (c) 2014 Stefan Rupp
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "rtc.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
|
||||||
|
static volatile uint32_t rtc_time;
|
||||||
|
|
||||||
|
ISR(TIMER2_COMP_vect) {
|
||||||
|
++rtc_time;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rtc_init(void)
|
||||||
|
{
|
||||||
|
// Stop all interrupts
|
||||||
|
cli();
|
||||||
|
// Reset timer to zero
|
||||||
|
rtc_time = 0;
|
||||||
|
|
||||||
|
// ...
|
||||||
|
// ...
|
||||||
|
// ...
|
||||||
|
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current time
|
||||||
|
* \return the current time (in s)
|
||||||
|
*/
|
||||||
|
inline uint32_t rtc_get(void)
|
||||||
|
{
|
||||||
|
uint32_t t;
|
||||||
|
uint8_t sreg;
|
||||||
|
|
||||||
|
sreg = SREG;
|
||||||
|
cli();
|
||||||
|
t = rtc_time;
|
||||||
|
SREG = sreg;
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode a integer timestamp (in seconds)
|
||||||
|
* into days, hours, minutes, seconds
|
||||||
|
* \param time the time in seconds
|
||||||
|
* \param days will be filled in to contain the days after return
|
||||||
|
* \param hours will be filled in to contain the hours after return
|
||||||
|
* \param minutes will be filled in to contain the minutes after return
|
||||||
|
* \param seconds will be filled in to contain the seconds after return
|
||||||
|
* \param ms be filled in to contain the microseconds after return
|
||||||
|
*/
|
||||||
|
void rtc_decode(uint32_t time, uint16_t days, uint8_t *hours, uint8_t *minutes, uint8_t *seconds)
|
||||||
|
{
|
||||||
|
if (seconds != NULL) {
|
||||||
|
*seconds = time % 60;
|
||||||
|
}
|
||||||
|
time /= 60;
|
||||||
|
if (minutes != NULL) {
|
||||||
|
*minutes = time % 60;
|
||||||
|
}
|
||||||
|
time /= 60;
|
||||||
|
if (hours != NULL) {
|
||||||
|
*hours = time;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode a time given as hours, minutes, seconds and microsecods into a integer storing micorseconds
|
||||||
|
* \param time the variable to store the time into
|
||||||
|
* \param hour the hours to store
|
||||||
|
* \param hour the minutes to store
|
||||||
|
* \param hour the seconds to store
|
||||||
|
* \param hour the microseconds to store
|
||||||
|
*/
|
||||||
|
void timer_encode(uint32_t *time, uint8_t hours, uint8_t minutes, uint8_t seconds, uint16_t ms)
|
||||||
|
{
|
||||||
|
|
||||||
|
*time = hours;
|
||||||
|
*time *= 60;
|
||||||
|
|
||||||
|
*time += minutes;
|
||||||
|
*time *= 60;
|
||||||
|
|
||||||
|
*time += seconds;
|
||||||
|
*time *= 1000U;
|
||||||
|
|
||||||
|
*time += ms;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void timer_validate(uint8_t *hours, uint8_t *minutes, uint8_t *seconds, uint16_t *ms)
|
||||||
|
{
|
||||||
|
|
||||||
|
while (*ms >= 1000) {
|
||||||
|
*ms -= 1000;
|
||||||
|
(*seconds)++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*seconds >= 60) {
|
||||||
|
*ms -= 60;
|
||||||
|
(*minutes)++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*minutes >= 60) {
|
||||||
|
*minutes -= 60;
|
||||||
|
(*hours)++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user