Forum: Mikrocontroller und Digitale Elektronik Tastatur geht nicht


von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
bräucht da mal hilfe aber kuckt zuerst in den schaltplan

habe die Portpins wie folgt konfiguriert:

cbi(DDRx,x); //set as input
sbi(PORTx,x);//set pull up

stimmt oder oder ?

Interrupt kommt aber die tasten werden nicht erkannt, HIIILLLFEEE ! ;)

meine Interruptrouriene:

PORTC,3 ist eine Led zum anzeigen dass eine Taste erkannt wurde.
(wenn ich die Led ohne Prüfung aktiviere funktioniert alles nach 250ms
schaltet die wieder ab)

SIGNAL(SIG_INTERRUPT0)
{
cbi(GICR,INT0); disable interrupt INT0
wait_ms(250);   enable interrupt INT0 after 250 ms

//sbi(PORTD,3); // only for interrupt test

if(!PINB1)
 {
 tastatur = 0x01;
 sbi(PORTD,3);
 }

if(!PINB2)
 {
 tastatur = 0x02;
 sbi(PORTD,3);
 }

if(!PINB1)
 {
 tastatur = 0x03;
 sbi(PORTD,3);
 }

if(!PIND5)
 {
 tastatur = 0x04;
 sbi(PORTD,3);
 }

if(!PIND6)
 {
 tastatur = 0x05;
 sbi(PORTD,3);
 }

if(!PIND7)
 {
 tastatur = 0x06;
 sbi(PORTD,3);
 }

if(!PINB7)
 {
 tastatur = 0x07;
 sbi(PORTD,3);
 }

if(!PINB6)
 {
 tastatur = 0x08;
 sbi(PORTD,3);
 }

 if(!PIND4)
 {
 tastatur = 0x09;
 sbi(PORTD,3);
 }
}

von Rahul (Gast)


Lesenswert?

Ich weiß ja nicht mit welchem Compiler du arbeitest (vermutlich
avr-gcc).
Zumindest bei dem sind sbi und sbi aus dem "Wortschatz" verbannt
worden.

bei PIND1 würde ich vermuten, dass du das als Makro mit "PIND
&(1<<0)" realisiert hast. Sonst geht das auch nicht mit dem
AVR-GCC...

Und Warteschleifen haben in InterruptServiceRoutinen nichts zu suchen!

von Andreas (Gast)


Lesenswert?

ja nee iss chon klar der wartet ja nicht... der interrupt wird wird in
der main mit einem flag enabled :) und die anweisungen sbi cbi habe ich
mit aus dem alten arvgcc copiert

von Simon K. (simon) Benutzerseite


Lesenswert?

Ich schätze nicht, dass er Makros verwendet hat hier.

Die Prüfanweisung müsste lauten:

if (PIND & (1<<PD2)) für Pin 2


tu die sbi und cbi lieber raus.. Macht der Compiler auch automatisch
mit
REG |= (1<<bit)
REQ &= ~(1<<bit)

von peter dannegger (Gast)


Lesenswert?

Nur so als Hinweis, dieses Konzept ist eine Sackgasse.

"wait_ms(250);" in einem Interrupt ist eine Totsünde.

Schmeiß besser die Dioden wieder raus und entprelle im Timerinterrupt:

http://www.mikrocontroller.net/articles/Entprellung

http://www.mikrocontroller.net/attachment.php/252480/C_TAST.C


Peter

von Andreas (Gast)


Lesenswert?

fettes merci jetzt funkts

von Andreas (Gast)


Lesenswert?

ps das vom simon

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.