Hallo Martin,
ich weiß nicht ob Du das Problem schon gelöst hast. Ich habe aufgrund dieses Beitrags hier mal einen Code zusammengebastelt (da ich das auch gesucht habe). Mit Hilfe des Forums habe ich dann auch noch kleine Probleme darin behoben.
Hie mal die Codeteile die Relevant sind um erst einmal ein Grundgerüst zu haben. Ich habe das in einzelnen Funktionen gelöst, kann man sicher noch besser machen (bin aber selber noch nicht so fit in C).
Das Beispiel läuft bei mir auf einem Mega16 mit 8MHz, es basiert auf der vorhergehenden Antwort.
Interrupt auf INT0 initialisieren:
Code:
void init_interrupt(void)
{
MCUCR |= (1<<ISC00) | (1<<ISC01); //INT0 auf Steigende Flanke stellen (Löst Interrupt bei steigendet Flanke an INT0 aus
GICR |= (1<<INT0); //Interrupt von INT0 auf Enable
}
Timer initialisieren:
Code:
void init_timer(void)
{
//Timer 1 (16Bit)
TCCR1B |= (1<<CS11); //Vorteiler auf CPU Takt/8
}
PortB initialisieren (als Ausgang schalten):
Code:
void init_digital(void)
/*Diese Funktion initialisiert die verwendeten Ports*/
{
DDRB |= (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB4) | (1<<DDB5); //Bit 1 bis Bit 5 an Port B als Ausgang belegen
}
Interrupt an INT0 auswerten:
Code:
ISR(INT0_vect)
{
if (flanke == 1)
{
start = TCNT1;
MCUCR |= (1<<ISC01); //INT0 auf fallende Flanke stellen
MCUCR &= ~(1<<ISC00);
flanke = 0;
}
else
{
stop = TCNT1;
impuls = stop - start;
MCUCR |= (1<<ISC00) | (1<<ISC01); //INT0 auf Steigende Flanke stellen (Löst Interrupt bei steigendet Flanke an INT0 aus)
flanke = 1;
}
}
Testprogramm zur Visualisierung der Auswertung:
Code:
#include <avr/io.h>
#include <avr/iom16.h>
#include <avr/interrupt.h>
#include "inttypes.h"
init_digital(); // Ports initialisieren (eigene Funktion)
init_timer(); // Timer initialisieren (eigene Funktion)
init_interrupt(); // Interrupt initialisieren
int main(void)
{
int start;
int stop;
int32_t impuls;
int flanke;
sei(); //Interrupts aktivieren
while(1)
{
//****************************************************************************
if (impuls < 1100)
{
PORTB |= (1<<PB3); //Bit3 auf High setzen
}
if (impuls > 1800)
{
PORTB |= (1<<PB4); //Bit4 auf High setzen
}
if ((impuls > 1490) & (impuls < 1550))
{
PORTB &= ~(1<<PB4); //Bit4 auf Low setzen
PORTB &= ~(1<<PB3); //Bit3 auf Low setzen
}
//****************************************************************************
}
}
In meinem Beispiel wird bei einem vollen Knüppelausschlag in eine Richtung PB3 gesetzt in nullstellung wieder zurückgesetzt und in die andere Richtung PB4 auf High und in Nullstellung ebenfalls wieder auf Low
Ich hoffe das Hilft Dir weiter, falls Du noch keine Lösung hast.
Lesezeichen