Sorry lag vorhin als ich das gepostet hab mit dem Tablet im Grünen,hatte da den Code nicht zur Hand.
Hier mal der Code:
Code:
//*****Grundeinstellungen
//defines:
#define F_CPU 16000000
//includes:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd-routines.h"
#include <stdlib.h>
char Buffer[20];
int counter = 0;
unsigned short countert0 = 0;
long rpm = 0;
//3***Interrupt Service Routine - Interrupt Eingang INT0****************************************
ISR (INT0_vect)
{
counter++;
}
ISR (TIMER0_COMP_vect)
{
countert0++;
if (countert0 == 100)
{
cli();
countert0 = 0;
rpm = (counter * 60) / 50;
counter = 0;
lcd_clear();
lcd_setcursor( 0, 1 );
itoa( rpm, Buffer, 10 );
lcd_string( Buffer );
sei();
}
}
//main programm:
int main (void)
{
//1***pwm init**********************************************************************************
TCCR1B |= (1<<CS12); //Prescaler 256
TCCR1A |= (1<<WGM10); //Fast PWM Mode
TCCR1B |= (1<<WGM12);
TCCR1A |= (1<<COM1A1) | (1<<COM1B1) ;
OCR1A = 0; //PWM Start-Wert
DDRD |= (1<< PD5); //PWM aktivieren
//2***Switch init*******************************************************************************
DDRA = 0b00000000; //Setze Port A auf Eingang
PORTA = 0b00000000; //Deaktiviere alle internen Pull-Ups an Port A
//3***Interrupt INT0 init***********************************************************************
GICR |= (1<<INT0); //Aktivieren des INT0 Interrupt Eingangs
MCUCR |= (1<<ISC01) | (1<<ISC00); //Löst aus bei Wechsel von "low" nach "high"
//4***Interrupt TIMER0 init*********************************************************************
TCNT0 = 0; //Anfangszählerstand = 0
TCCR0 = (1<<CS02) | (1<<CS00); //Prescaler von 1024 auswählen
/* CPU-Takt = 16.000.000Hz Prescaler = 1024
Zeit bis overflow = CPU-Takt/Prescaler = 16.000.000HZ / 1024 = 15.625Hz
*/
OCR0 = 50; //Zähler zählt bis 156
/* Zeit bis overflow = 15625Hz Zählwert = 156
Zeit bis Interrupt = 15625Hz / 156 = 100,16Hz ~ 100Hz
1s / 100 = 0,01s = 10ms
*/
TIMSK |= (1<<OCIE0); //Interrupt aktivieren
//5**LCD init***********************************************************************************
lcd_init();
//***main***************************************************************************************
//Test
while(1)
{
sei();
if ( PINA & (1<<PINA0) )
{
OCR1A = 75;
}
else
{OCR1A = 17;
// lcd_clear();
}
}
}
Gruß Andi
Lesezeichen