Hallo Forum,
nach zwei Jahren Pause möchte ich mein altes Tachoprojekt nochmal neu aufsetzen. Dazu hab ich für Testzwecke eine Art Impulsgenerator gebaut. Zuerst hatte ich tone() verwndet, bis ich gelesen hatte das ich damit nur Frequenzen >30Hz erzeugen kann. Für mein Tachoprojekt reicht das aber nicht, also dachte ich, ich könnte mittels Timer einfach einen Pin zwischen HIGH und LOW hin- und herschalten lassen. Zusätzlich noch ein Poti um die Frequenz zu verändern...
Leider scheint das Ganz nicht zu funktionieren, das Programm läuft zwar, nach einfügen der Serial.print-Funktionen sehe ich auch das das Poti funktioniert, jedoch scheint an PIN2 kein Signal anzukommen. Habe für Testzwecke mal PIN13 verwendet um anhand der verbauten LED etwas zu erkennen, aber auch hier scheinbar keine Funktion. Ich vermute die Interruptroutine wird nicht aufgerufen, warum?
int impuls=0;
volatile byte b_mode=0;
volatile int dauer_neu=0;
ISR(TIMER1_COMPA_vect) { // will be called when an interrupt occurs at timer 1
if (b_mode==1) {
digitalWrite(2, HIGH);
b_mode=1;
} else {
digitalWrite(2, LOW);
b_mode=0;
}
OCR1A=dauer_neu;
}
void setup() {
// put your setup code here, to run once:
pinMode(2,OUTPUT);
Serial.begin(19200);
digitalWrite(2, LOW);
cli(); //Lösche globales Interrupt-Enable-Bit
//CTC-Mode aktivieren
TCCR1A = 0; //Löschen des TCCR1A-Registers
TCCR1B = 0; //Löschen des TCCR1B-Registers
TCNT1 = 0; // reset counter value
OCR1A=32500; //countervergleichsregister
TCCR1B |= (1 << CS11) | (1 << CS10); //Setze CS11 und CS12 (Clock Select) Takt/64
TCCR1B |= (1 << WGM12); //Setze CTC-Mode
TIMSK1 |= (1 << OCIE1A); //Bit Output Compare A Match Interrupt Enable setzen
}
void loop() {
// put your main code here, to run repeatedly:
impuls = analogRead(A2);
if (impuls>0){
sei();
dauer_neu=impuls <<5; //mit 32 multiplizieren
} else {
cli();
dauer_neu=0;
digitalWrite(2,LOW);
}
Serial.print("dauer_neu: ");Serial.println(dauer_neu);
}
Viele Grüße