Hi Leute ,
zu meinem Projekt kann ich mal die Aufgabenstellung festlegen die zu erfüllen habe.
Es geht drum, dass ich 2 Interrupts habe: der erste wird bei einer steigenden Flanke aktiviert und der zweite wird bei einer fallenden Flanke aktiviert. (an Pin D2)
Zischen steigender und fallender Flanke sollte ein Timer in 1µs anfangen zu Zählen und den Wert "ausgeben".
Die Ausgabe ist hier nur als printf Befehl angezeigt.
Im Voraus ich bin nicht besonders gut im AVR Programmieren ^^.
Aber hab mal ein Schema zum Programm versucht zu erstellen und würde mich freuen, wenn mir jemand weiterhelfen bzw. den weiteren Lösungsweg erklären könnte.
LG Dejan
____________________________
// Grundeinstellungen
SETBIT0(DDRD, 2); // Port D2 auf Dateneingang
SETBIT1(PORTD, 2); // PullUp aktivieren
// Flanke bei INT0
//Auf steigende Flanke
SETBIT1(MCUCR, ISC01);
SETBIT1(MCUCR, ISC00);
// Fallende Flanke bei INT1
//Auf fallende Flanke
SETBIT1(MCUCR, ISC11);
SETBIT0(MCUCR, ISC10);
SETBIT1(GICR, 6); // Ext. Int0 ein
SETBIT1(GICR, 7); // Ext. Int1 ein
SETBIT1(SREG, 7); // Global Interrupt Enable
void timer16init(void)
{
cli(); // disable global interrupts
// Timer1 auf Modus CTC (mode 4)
SETBIT0(TCCR1B, WGM13);
SETBIT1(TCCR1B, WGM12);
SETBIT0(TCCR1A, WGM11);
SETBIT0(TCCR1A, WGM10);
OCR1A = 12; // von CPU Takt 12000000 Hz auf 1µs Takt: Zeit= die wir wollen(0,000001s)/(1/CPU takt(12MHz)) = 12
// Aktiviert TOGGLE auf OC1A-Anschluss
SETBIT1(DDRD, 5); // OC1A-Anschluss auf Output
SETBIT1(TCCR1A, COM1A0); // OC1A-Anschluss TOGGLE
SETBIT0(TCCR1A, COM1A1); // wenn TCNT1 = OCR1A
sei(); // enable global interrupts:
}
ISR(INT0_vect) // Dieses Unterprogramm wird automatisch bei INT0 ausgeführt
{
TCCR1A = 0; // Zähler wird auf 0 gesetzt
TCCR1B = 0; // Zähler wird auf 0 gesetzt
timer16init(void)
//GTCCR &= ~(1 << TSM); // Zähler starten
}
ISR(INT1_vect) // Dieses Unterprogramm wird automatisch bei INT1 ausgeführt
{
prinf("Der Wert ist: %d µs",TCNT1) ; // Zähler wird ausgegeben / eh falsch
}
zu meinem Projekt kann ich mal die Aufgabenstellung festlegen die zu erfüllen habe.
Es geht drum, dass ich 2 Interrupts habe: der erste wird bei einer steigenden Flanke aktiviert und der zweite wird bei einer fallenden Flanke aktiviert. (an Pin D2)
Zischen steigender und fallender Flanke sollte ein Timer in 1µs anfangen zu Zählen und den Wert "ausgeben".
Die Ausgabe ist hier nur als printf Befehl angezeigt.
Im Voraus ich bin nicht besonders gut im AVR Programmieren ^^.
Aber hab mal ein Schema zum Programm versucht zu erstellen und würde mich freuen, wenn mir jemand weiterhelfen bzw. den weiteren Lösungsweg erklären könnte.
LG Dejan
____________________________
// Grundeinstellungen
SETBIT0(DDRD, 2); // Port D2 auf Dateneingang
SETBIT1(PORTD, 2); // PullUp aktivieren
// Flanke bei INT0
//Auf steigende Flanke
SETBIT1(MCUCR, ISC01);
SETBIT1(MCUCR, ISC00);
// Fallende Flanke bei INT1
//Auf fallende Flanke
SETBIT1(MCUCR, ISC11);
SETBIT0(MCUCR, ISC10);
SETBIT1(GICR, 6); // Ext. Int0 ein
SETBIT1(GICR, 7); // Ext. Int1 ein
SETBIT1(SREG, 7); // Global Interrupt Enable
void timer16init(void)
{
cli(); // disable global interrupts
// Timer1 auf Modus CTC (mode 4)
SETBIT0(TCCR1B, WGM13);
SETBIT1(TCCR1B, WGM12);
SETBIT0(TCCR1A, WGM11);
SETBIT0(TCCR1A, WGM10);
OCR1A = 12; // von CPU Takt 12000000 Hz auf 1µs Takt: Zeit= die wir wollen(0,000001s)/(1/CPU takt(12MHz)) = 12
// Aktiviert TOGGLE auf OC1A-Anschluss
SETBIT1(DDRD, 5); // OC1A-Anschluss auf Output
SETBIT1(TCCR1A, COM1A0); // OC1A-Anschluss TOGGLE
SETBIT0(TCCR1A, COM1A1); // wenn TCNT1 = OCR1A
sei(); // enable global interrupts:
}
ISR(INT0_vect) // Dieses Unterprogramm wird automatisch bei INT0 ausgeführt
{
TCCR1A = 0; // Zähler wird auf 0 gesetzt
TCCR1B = 0; // Zähler wird auf 0 gesetzt
timer16init(void)
//GTCCR &= ~(1 << TSM); // Zähler starten
}
ISR(INT1_vect) // Dieses Unterprogramm wird automatisch bei INT1 ausgeführt
{
prinf("Der Wert ist: %d µs",TCNT1) ; // Zähler wird ausgegeben / eh falsch
}