Ich habs jetzt mit ner Softwarelösung gebacken bekommen. Allerdings sind die Werte etwas utopisch und auch irgendwie bei jedem Lüfter gleich (einer soll 1100rpm, der andere 1800rpm haben).
Mir ist klar, dass es mehr als einen Impuls pro Umdrehung gibt. Aber das, was ich hier hab is irgendwie ganz komisch. Alle Werte liegen so bei 14500. Schwankt ein wenig, aber das war es auch schon.
Hier ist mein Code:
Code:
#include <stdlib.h>
#include <avr/io.h>
#include "lcd.h"
#include <util/delay.h>
#include <avr/interrupt.h>
uint32_t fan1 = 0;
uint32_t fan2 = 0;
uint32_t updated = 0;
uint32_t polled = 0;
/*uint8_t gotSignal(uint8_t pin)
{
if(bit_is_clear(PIND, pin))
{
unsigned char di, dj; // debounce
//for(di = 0; di < 255; di++)
for(dj = 0; dj < 255; dj++);
if(bit_is_clear(PIND, pin))
return 1;
}
return 0;
}*/
uint8_t gotSignal(uint8_t pin)
{
return bit_is_clear(PIND, pin);
}
void update_display(void)
{
updated++;
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts("Luefter1: ");
lcd_put_d(fan1);
lcd_gotoxy(0,1);
lcd_puts("Luefter2: ");
lcd_put_d(fan2);
lcd_gotoxy(0,2);
lcd_puts("Updated: ");
lcd_put_d(updated);
lcd_gotoxy(0,3);
lcd_puts("Polled: ");
lcd_put_d(polled);
}
ISR(TIMER2_OVF_vect)
{
polled++;
if(gotSignal(7))
fan2++;
if(gotSignal(6))
fan1++;
if(polled >= 30000) //jede sekunde
{
update_display();
polled = 0;
fan2 = 0;
fan1 = 0;
}
TCNT2 = 0xFA;
}
void start_timer(void)
{
//Polling der Lüfter alle 0,002 sek.
TCCR2 |= (1<<CS21) | (1<<CS20); // Prescaler = 64
TCNT2 = 0xFA; //Counter-Wert auf 250 setzen (vorladen, overflow bei 255)
TIMSK |= (1<<TOIE2); //Interrupt bei Overflow
}
void init_ports(void)
{
DDRD = 0x00; //Eingang
}
int main(void)
{
start_timer();
init_ports();
lcd_init(LCD_DISP_ON); // LCD initialisieren
sei(); //Interrupts an
while(1) {}
}
Ich hab auch mal versucht zu entprellen, aber das geht gar nicht. Dauert viel zu lange. War auch nur ein Verzweiflungsversuch
Lesezeichen