Ok.das war mein Fehler. Ich habe vergessen TCNT Wert zu schreiben .Jetzt Shnell=8 Hz , Langsam =2 hz.
CKDIV8 aktiviert.
Manchmal ohne Motor alles richtig funktioniert, aber wenn Motor angeschlossen wurde , dann dreht nicht (richtige Frequenzen).
Aber sie haben Recht, ich soll immer ohne Motor testen.
Code:
#include <avr\io.h>
#include <inttypes.h>
#include <avr\interrupt.h>
#include <util/delay.h>
#include <stdbool.h>
volatile uint16_t PrescaleCounter;
volatile uint8_t Slow;
void InitPorts()
{
DDRB =0b00000110; //PB1->richtung PB2 ->takt Ausgänge
DDRC &= ~(1<<DDC4); //PC4 Schnell/langsam schalter
PORTC |= (1<<PC4);
}
//Funktion für Schalter(gedrückt oder nicht)
bool check_button(volatile uint8_t *port, uint8_t pin, bool depressed){
if(!(*port&_BV(pin))){
_delay_ms(10);
if(!(*port&_BV(pin))){
if(depressed)while(!(*port&_BV(pin)));
return(true);
}
}
return(false);
}
void InitTimer1(void) //Timer initialisierung
{
PrescaleCounter = 0; // wird in der ISR genutz
Slow = 0xFF;
TIFR1 =0b00000010; // Interrupt Request loeschen (sicherheitshalber)
TIMSK1 =0b00000010; // Enable Output Compare A Interrupt
TCNT1 = 0;
OCR1A= 288; // CompareTime 1m
TCCR1B =0b00001010; // Prescaler 64, CTC Mode 4, Timer1 Start
}
ISR (TIMER1_COMPA_vect)
{
if (Slow)
{
// 1Hz
if (PrescaleCounter >=500)
{
PORTB^= (1<<PB2); // PB2 alle 500ms toggeln (1Hz Signal)
PrescaleCounter = 0;
} else {
PrescaleCounter++;
}
}
else {
// 4Hz
if (PrescaleCounter >=125)
{
PORTB^= (1<<PB2); // PB2 alle 2000ms toggeln
PrescaleCounter = 0;
}
else {
PrescaleCounter++;
}
}
}
int main(void)
{
InitPorts();
InitTimer1();
sei();
do {
// Drehzahl ändern
if(check_button(&PINC,PINC4,false))
{
Slow = 0xFF; // 1Hz
}
else {
Slow = 0; // 4Hz
}
}
while(1);
}
Manchmal ohne Motor alles richtig funktioniert, aber wenn Motor angeschlossen wurde , dann dreht nicht (richtige Frequenzen).
Aber sie haben Recht, ich soll immer ohne Motor testen.