2017-11-24 13:29:36 +02:00
|
|
|
#include <avr/io.h>
|
|
|
|
#include <avr/interrupt.h>
|
|
|
|
#include <util/delay.h>
|
|
|
|
#include "ds18b20.h"
|
|
|
|
#include "main.h"
|
|
|
|
#include "io.h"
|
|
|
|
|
2017-11-24 17:24:12 +02:00
|
|
|
#ifdef DEBUG
|
|
|
|
#include "debug.h"
|
|
|
|
#endif /* DEBUG */
|
|
|
|
|
2017-11-24 13:29:36 +02:00
|
|
|
void initIO()
|
|
|
|
{
|
2017-11-24 22:14:50 +02:00
|
|
|
/* Servos */
|
|
|
|
DDRB |= (1 << SERVO_L);
|
|
|
|
/* Phase Correct PWM, 9-bit; Inverting mode */
|
|
|
|
TCCR1A |= 1 << WGM11 | 1 << COM1A1 | 1 << COM1A0;
|
|
|
|
/* "Clear Timer on Compare match" mode; Prescaler = 1 */
|
|
|
|
TCCR1B |= 1 << WGM13 | 1 << WGM12 | 1 << CS10;
|
|
|
|
ICR1 = 19999; // F_CPU / 50Hz - 1
|
|
|
|
|
|
|
|
/* LED */
|
2017-11-24 13:29:36 +02:00
|
|
|
DDRD |= (1 << LED_1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void readTemp()
|
|
|
|
{
|
|
|
|
double d;
|
|
|
|
|
|
|
|
sei();
|
|
|
|
for (;;) {
|
|
|
|
d = ds18b20_gettemp();
|
|
|
|
if (d >= 21)
|
|
|
|
PORTD |= (1 << LED_1);
|
|
|
|
else
|
|
|
|
PORTD &= ~(1 << LED_1);
|
|
|
|
|
|
|
|
_delay_ms(500);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-24 22:14:50 +02:00
|
|
|
void runServos()
|
|
|
|
{
|
|
|
|
/* Stop */
|
|
|
|
OCR1A = ICR1 - 1500;
|
|
|
|
_delay_ms(1500);
|
|
|
|
|
|
|
|
/* Reverse */
|
|
|
|
OCR1A = ICR1 - 2000;
|
|
|
|
_delay_ms(1500);
|
|
|
|
|
|
|
|
/* Forwards */
|
|
|
|
OCR1A = ICR1 - 1000;
|
|
|
|
_delay_ms(1500);
|
|
|
|
}
|
|
|
|
|
2017-11-24 13:29:36 +02:00
|
|
|
int main(void)
|
|
|
|
{
|
|
|
|
initIO();
|
2017-11-24 22:14:50 +02:00
|
|
|
runServos();
|
2017-11-24 13:29:36 +02:00
|
|
|
readTemp();
|
|
|
|
|
2017-11-24 22:14:50 +02:00
|
|
|
|
2017-11-24 13:29:36 +02:00
|
|
|
return 0;
|
|
|
|
}
|