Sehr geehrte Forenkollegen, ich arbeite nun schon unzählige stunden an dem problem, dass ich in AVR mit einem ATMEGA32 eine Tastaturfunktion für eine Aktivierung und Deaktivierung einer Alarmanlage zusammenkriege . Allerdings will es einfach nicht funktionieren . Mein Wunsch wäre, dass die Tastatur immer abgefragt wird und sobald 4 zeichen erreicht sind, der eingegebene Code mit einem Vorgegebenem verglichen wird. Ist der Code nicht gleich, so funktioniert die Alarmanlage, bei Erfüllung des Vergleichs ist sie deaktiviert. Dies wird zusätzlich durch eine Duo-LED an PORTD signalisiert. Wenn mir doch bitte irgendwer einen Ratchlag geben könnte? Ich wäre euch sehr dankbar darum. MfG Andreas
Du hast es doch selbst schon geschrieben:
1 | //Entprellung 10ms einbauen
|
Vorher braucht man über nichts anderes zu diskutieren. Ganz davon abgesehen, du hast zwar prima beschrieben, was du haben willst, aber nicht, was die Differenz deiner derzeitigen Implemen- tierung zu deiner Zielvorstellung ist.
Kannst Du mir erklären, was das soll:
1 | }
|
2 | void Code_Eingabe(char zeichen); |
3 | }
|
Peter
Peter Dannegger wrote: > Kannst Du mir erklären, was das soll: >
1 | > } |
2 | > void Code_Eingabe(char zeichen); |
3 | > } |
4 | >
|
Eine Prototyp-Deklaration, natürlich an einer sehr merkwürdigen Stelle...
hallo, danke schon mal für die bisherigen antworten! das genaue problem ist, dass die Tastatur einfach nicht funktioniert zur Codeeingabe. vor allem an der richtigen syntax des Unterprogramms (Code_Eingabe()) zur Code-Überprüfung zweifle ich. die entprellung hab ich nun eingebaut mit einem delay (util/delay.h ist ja schon in der LCD.h definiert). anbei ist mein neuer quellcode. dass der timer zurzeit umsonst ist weiß ich. bitte seht euch den Code einmal an, speziell das Unterprogramm. Bin um jeden Ratschlag froh den ich bekomme. MfG Andreas
3 Probleme, die mir auffallen: 1. keine Kommentare 2. Du willst einzelne Tasten prüfen, vergleichst aber immer den ganzen Port. Hier mal eine funktionierende Scanroutine:
1 | #include <avr\io.h> |
2 | |
3 | typedef unsigned char u8; |
4 | typedef unsigned short u16; |
5 | #define NOP(); asm volatile("nop"::);
|
6 | |
7 | |
8 | #define KEY_PIN PINB
|
9 | #define KEY_PORT PORTB
|
10 | #define KEY_DDR DDRB
|
11 | |
12 | |
13 | u8 keyscan( void ) |
14 | {
|
15 | u8 col = 0, row = 0; |
16 | |
17 | KEY_PORT = 0xFF; // all pullups on |
18 | KEY_DDR = 0xF0; // pin 7..4 = output |
19 | KEY_PORT = 0x0F; // pin 7..4 = output low |
20 | NOP(); // wait until inputs sampled |
21 | if( ~KEY_PIN & 1<<0 ) // if pin 0 = low |
22 | col = 4; |
23 | if( ~KEY_PIN & 1<<1 ) |
24 | col = 3; |
25 | if( ~KEY_PIN & 1<<2 ) |
26 | col = 2; |
27 | if( ~KEY_PIN & 1<<3 ) |
28 | col = 1; |
29 | row = col; |
30 | if( col ){ // if column found, check row |
31 | KEY_PORT = 0xFF; // all pullups on |
32 | KEY_DDR = 0x0F; // pin 3..0 = output |
33 | KEY_PORT = 0xF0; // pin 3..0 = output low |
34 | NOP(); // wait until inputs sampled |
35 | if( ~KEY_PIN & 1<<4 ) |
36 | row = 5; |
37 | if( ~KEY_PIN & 1<<5 ) |
38 | row = 9; |
39 | if( ~KEY_PIN & 1<<6 ) |
40 | row = 13; |
41 | if( ~KEY_PIN & 1<<7 ) // if pin 7 = low |
42 | row = 17; |
43 | } // 0 = no key |
44 | return row - col; // 1..16 = key |
45 | }
|
3. Ich sehe nirgends ne Flankenerkennung, d.h. Du flutest Deinen Puffer, solange ne Taste gedrückt wird. Du darfst nur bei ner Flanke von losgelassen nach gedrückt die Taste übernehmen. Peter
hallo, vielen dank für die antwort ! werde das gleich mal in mein programm einbauen und einen testlauf durchführen . mfg andreas
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.