I have some code (relevant portions below) that I feel should work, but it doesn't. It starts at 60 deg (I'm controlling a servo angle) at morning time and rotates slowly as time passes. It should be 120 deg at sunset but instead it's capping out at like 104 deg and earlier in the day than it should.
Any help is appreciated! Thanks!
#include <avr/io.h>
#include <avr/interrupt.h>
#include "uart.h"
static volatile uint64_t milliseconds = 0;
int hour = 0;
int minute = 0;
int morning = 6;
int morning_min = 27;
int evening = 20;
int evening_min = 50;
void delay_ms(int ms)
{
uint64_t timestamp = milliseconds;
while(milliseconds - timestamp < ms);
}
int main(void)
{
initUART();
int now = (hour * 60) + minute;
int morn = (morning * 60) + morning_min;
int even = (evening * 60) + evening_min;
//setup if mid day
if (now >= morn && now <= even)
{
int denomenator = even - morn;
double numerator = now - morn;
double ratio = numerator / denomenator;
int angle = (ratio * 60) + 60;
OCR1A = angle;
}
else
{
OCR1A = 60;
}
char start[18] = {0};
sprintf(start, "Startup-%02d:%02d-%d\n", hour, minute, OCR1A);
writeString(start);
DDRB |= (1 << PORTB1); //servo pin 6
//timer 0
OCR0A = 249; //1ms interval
TIMSK0 |= (1 << OCIE0A); //enable oputput compare interrupt
TCCR0A |= (1 << WGM01); //ctc
TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler 64
//timer 1
TCCR1A |= (1 << COM1A1) | (1 << WGM11) | (1 << WGM10); // clear on match, fast pwm
TCCR1B |= (0 << WGM13) | (1 << WGM12) | (1 << CS12) | (0 << CS10); //1024 prescaler
sei(); //enable interrupts globally
while(1)
{
if((milliseconds % 10) == 0) {
minute++;
if(minute % 60 == 0)
{
minute = 0;
hour++;
}
if(hour % 24 == 0) { hour = 0; }
int now = (hour * 60) + minute;
if(now >= morn && now <= even)
{
int denomenator = even - morn;
double numerator = now - morn;
double ratio = numerator / denomenator;
int angle = (ratio * 60) + 60;
OCR1A = angle;
}
char message[10] = {0};
sprintf(message, "%02d:%02d-%d\n", hour, minute, OCR1A);
writeString(message);
}
}
}
ISR(TIMER0_COMPA_vect)
{
milliseconds++;
}