Forum: Compiler & IDEs Problem mit Tastatur für Codeeingabe bei Alarmanlage


von Andreas R. (svsalzburg1933)


Angehängte Dateien:

Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Kannst Du mir erklären, was das soll:
1
      }
2
    void Code_Eingabe(char zeichen);  
3
    }


Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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...

von Andreas R. (svsalzburg1933)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Andreas R. (svsalzburg1933)


Lesenswert?

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
Noch kein Account? Hier anmelden.