Zitat von
Sternthaler
So, da ich nicht weiß, ob dir diese Beschreibung überhaupt weitergeholfen hat, höre ich hier erst einmal auf. (Ist doch etwas aufwändig)
Wenn dir das aber helfen konnte, dann melde dich mal, und ich werde auch noch zu internen Interrupts (ADC, Timer) etwas schreiben.
Hallo Sternthaler,
deine Taster-Interrupt-Erklärung ist super!
gilt dein Angebot noch? Ich wäre dir sehr dankbar, wenn du mir die anderen Interrupts auch noch erklären würdest.
Ich habe jetzt mal zu Übungszwecken, um die Zusammenhänge zu begreifen, versucht ein kleines Programm zu schreiben, in das ich alle nötigen Funktionen etc. direkt eingebunden habe. Damit lässt sich die StatusLED schalten und der Tasterinterrupt geht auch.
Mein nächstes Ziel ist nun, nach der Tastergeschichte mit Hilfe von Timer2-Interrupt eine Wartezeit einzubauen, nach der die LED gelb leuchtet.
Kann es sein, das ich hierfür die "SIGNAL (SIG_OVERFLOW2)" ändern müsste?
Leider ist mir diese Funktion ziemlich unverständlich.
Code:
//----------------------------------------------------------------
//bitschiebereien und interrupts
#include <avr/io.h>
#include <avr/interrupt.h>
//----------------------------------------------------------------
// variablen in global.c definiert:
volatile int switched; //für tasterinterrupt
volatile unsigned char count36kHz; //für timer2 interrupt
volatile unsigned long timebase; //für timer2 interrupt
//----------------------------------------------------------------
// eigene variablen
volatile int zeit; //für timer2 interrupt
long i; //fürs warten
//----------------------------------------------------------------
// Funktionen
//----------------------------------------------------------------
// warten
void warten(void)
{
for(i=0;i<500000;i++);
}
//----------------------------------------------------------------
//Interruptfunktion taster in asuro.c
SIGNAL (SIG_INTERRUPT1)
{
switched = 1;
GICR &= ~(1 << INT1); // Externen Interrupt 1 sperren
}
//----------------------------------------------------------------
//taster interrupt einschalten
void StartSwitch (void)
{
DDRD &= ~(1 << PD3); // PD3 als Eingang
PORTD &= ~(1 << PD3); // PD3 auf LOW
MCUCR &= ~((1 << ISC11) | (1 << ISC10)); // Low level erzeugt Interrupt
GICR |= (1 << INT1); // Externen Interrupt 1 zulassen
}
//----------------------------------------------------------------
//taster interrupt ausschalten
void StopSwitch (void)
{
GICR &= ~(1 << INT1); // Externen Interrupt 1 sperren
}
//----------------------------------------------------------------
//timer2 interrupt einschalten
void TimerInit (void) // teil der init in asuro.c
/*
Timer2, zum Betrieb mit der seriellen Schnittstelle, fuer die
IR-Kommunikation auf 36 kHz eingestellt.
*/
{
TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle fuer 36kHz
TIMSK |= (1 << TOIE2); // 36kHz counter
}
//----------------------------------------------------------------
//Interruptfunktion timer2 in asuro.c
SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25;
count36kHz ++;
if (!count36kHz)
timebase ++;
#ifdef RC5_AVAILABLE
if (enableRC5 && !(count36kHz % 8))
IsrRC5(); // wird alle 222.2us aufgerufen
#endif
}
//----------------------------------------------------------------
//----------------------------------------------------------------
int main(void)
{
sei (); //Interrupts erlauben
//cli (); //Interrupts verbieten
//led vorbereiten
DDRB |= (1<<PB0); // Datenrichtungsregister für LED-grün auf Ausgang
DDRD |= (1<<PD2); // für rot auf ausgang
//----------------------------------------------------------------
// Ampel
// grün
PORTB |= (1<<PB0); // Ausgang für grün schalten
warten();
// gelb
PORTD |= (1<<PD2); // rot dazu einschalten
warten();
// rot
PORTB &= ~(1<<PB0); // grün ausschalten
warten();
// aus
PORTD &= ~(1<<PD2); // rot auschalten
// Ampel Ende
//----------------------------------------------------------------
warten();
warten();
//----------------------------------------------------------------
// Taster Interrupt
switched = 0;
StartSwitch ();
while (switched == 0) // wenn kein taster gedrückt ist rot leuchten
{
PORTB &= ~(1<<PB0); // grün ausschalten
PORTD |= (1<<PD2); // rot einschalten
}
PORTB |= (1<<PB0); // grün einschalten
PORTD &= ~(1<<PD2); // rot auschalten
//switched = 0;
//StartSwitch ();
StopSwitch ();
// Taster Interrupt Ende
//----------------------------------------------------------------
// und jetzt nach 1sek led gelb mit timer2 interrupt ?????????
//----------------------------------------------------------------
// timer2 Interrupt
// zeit = 1;
TimerInit ();
if ( zeit == 1)
{
PORTB |= (1<<PB0); // grün einschalten
PORTD |= (1<<PD2); // rot einschalten
}
//----------------------------------------------------------------
while(1);
return(0);
}
Schöne Grüsse
M.
Lesezeichen