PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastendruck



Vbxler
27.06.2009, 08:01
Hallo Leute,

ich stehe gerade auf dem Schlauch!
Vielleicht kann mir einer helfen.

Folgendes Programm funktioiert:

//--------------------------------------------------------------
// Interruptvector Overflow Timer2
//--------------------------------------------------------------
ISR(TIMER2_OVF_vect)
{
//------------------------------------------------
// Systemfunktionen
//------------------------------------------------
TCNT2 = 0x64; //Nachladen des Timer2 - Register

//------------------------------------------------
//Taste abfragen
//------------------------------------------------
byTaste = (PIND & (1 << biD0_D2_Reserve));

//wurde Taste betätigt?
if (byTaste)
PORTC |= (1<<boD0_C5_Reserve);
else
PORTC &= ~(1<<boD0_C5_Reserve);
}


//-----------------------------------------------------------------------
// Hauptprogramm
//-----------------------------------------------------------------------
int main(void)
{
init(); //Initialisierung

//-----------------------------------------------------------------------
// Hauptschleife
//-----------------------------------------------------------------------
while (1)
{
;
}
}
Wenn ich die Taste drücke, wird der Ausgang geschaltet - wenn ich loslasse, geht der Ausgang auf = 0.

Dieser Code funktioniert nicht:

//--------------------------------------------------------------
// Interruptvector Overflow Timer2
//--------------------------------------------------------------
ISR(TIMER2_OVF_vect)
{

//------------------------------------------------
// Systemfunktionen
//------------------------------------------------
TCNT2 = 0x64; //Nachladen des Timer2 - Register

//------------------------------------------------
//Taste abfragen
//------------------------------------------------
byTaste = (PIND & (1 << biD0_D2_Reserve));
}


//-----------------------------------------------------------------------
// Hauptprogramm
//-----------------------------------------------------------------------
int main(void)
{
init(); //Initialisierung

//-----------------------------------------------------------------------
// Hauptschleife
//-----------------------------------------------------------------------
while (1)
{

//wurde Taste betätigt?
if (byTaste)
PORTC |= (1<<boD0_C5_Reserve);
else
PORTC &= ~(1<<boD0_C5_Reserve);
}
}
Da die Variable 'byTaste' global ist, muss der Zustand auch überall verfügbar sein. Aber es ist nicht nicht der Fall, der Ausgang wird nicht geschaltet.

Der Fehler sitzt warscheinlich wieder zwischen meinen Ohren.

Danke für jede Hilfe.

McJenso
27.06.2009, 09:35
Hallo,

beide Programme funktionieren nicht. Es fehlen z.B. die Deklarationen und die Funktion init() gibt es auch nicht.

Da meine Glaskugel wieder da ist, kann ich sie ja mal ausprobieren :-)

Sie sagt mir, ändere

uint8_t byTaste;

in

volatile uint8_t byTaste;

Bitte funktionsfähigen Code mit Copy and Past einfügen. Auch nicht abschreiben.

Gruß

Jens

Vbxler
27.06.2009, 12:09
Hallo Jens,


die Funktion init() ist schon vorhanden,
aber danke für den Hinweis, denn volatile war das Zauberwort.

Jetzt funktioniert es!!

volatile müssen alle globalen Variablen markiert werden, die in Interrupt-Handlern verwendet werden.
Danke für die Hilfe! O:)