Motorvärmartimer
Postat: 4 januari 2006, 22:13:21
By popular request (en person iaf) kommer här en tråd om mitt pågående projekt, en pryl som själv räknar ut hur länge motorvärmaren behöver vara på beroende på utetemperatur och som sätter igång den i rätt tid.
Tanken är att man ska schemalägga när man ska nyttja bilen (och kunna göra tillfälliga ändringar) och timern sätter igång värmaren i lagom tid före.

Displayen ser ut så pga ett problem som jag har med följande kod:
Problemet är att secs nollställs oavsett allting.
Knappen enter känns inte heller av i interruptet. Klistrar jag däremot in precis samma rader i mainloopen så går det bra.
Tanken är att man ska schemalägga när man ska nyttja bilen (och kunna göra tillfälliga ändringar) och timern sätter igång värmaren i lagom tid före.

Displayen ser ut så pga ett problem som jag har med följande kod:
Kod: Markera allt
#define MCU_CLK 7372800
#define cbi(port, shift) (port) &= ~(1<<shift)
#define sbi(port, shift) (port) |= (1<<shift)
#define F_OSC 7372800
#define LCD_TIGHTER_TIMING
#define relay 0
#define light 1
#define enter 4
#define hoger 8
#define ner 16
#define vanster 32
#define upp 64
#include "avr/io.h"
#include "lcd_44780.h"
#include "lcd_44780.c"
#include "avr/interrupt.h"
#include "inttypes.h"
#include "avr/signal.h"
#include "onewire.c"
#include "onewire.h"
volatile unsigned char boolean = 0;
volatile unsigned char secs = 32;
volatile unsigned char mins = 0;
volatile unsigned char hrs = 0;
volatile unsigned int onsecs = 0;
float temperatur;
float gettemp()
{
if (ow_reset())
{
lcd_clear();
lcd_home();
lcd_puts(" Sensor error! ");
lcd_puts("Heater disabled");
cbi(PORTD,relay);
for(;;);
}
return temperatur;
}
SIGNAL(SIG_TIMER1_COMPA)
{
boolean = !boolean;
if ((PIND&enter) == 0)
{
cli();
}
if (boolean)
{
secs++;
lcd_putchar(secs+'0');
if (++secs >= 60)
{
secs = 0;
mins++;
}
if (++mins >= 60)
{
hrs++;
secs = 0;
mins = 0;
}
if (++hrs >= 24);
{
hrs = 0;
mins = 0;
secs = 0;
}
}
lcd_putchar(secs+'0');
}
void setup()
{
ms_spin(500);
lcd_init();
lcd_puts("Init!");
//sätt upp 2Hz-interrupt
TCCR1B = (1<<CS12|1<<CS10|1<<WGM12); //systemklocka/1024
TIMSK = (1<<OCIE1A); //Compare1A enable
OCR1A = 3600; //interrupt två ggr/sek
DDRD = 0b00000011;
lcd_home();
lcd_clear();
lcd_set_cursor(1,0); //on,blink
ow_parasite_disable();
//temperatur = gettemp();
sei();
}
int main(void)
{
setup();
//UART_init();
for(;;)
{
/*if ((PIND&enter) == 0)
{
cli();
}*/
}
}
Knappen enter känns inte heller av i interruptet. Klistrar jag däremot in precis samma rader i mainloopen så går det bra.