Forum: Mikrocontroller und Digitale Elektronik AVR-n00b will Passworteingabe machen


von Walternativ (Gast)


Lesenswert?

Hallo,
ich habe einen atmega8 auf nem alten STK500 und wollte eine Art 
Passworteingabe machen. Die Knöpfe 0-2 können gedrückt werden und es 
wird jeweils ein Wert in einen Puffer geschrieben. Dieser wird mit einem 
anderen verglichen und wenn sie übereinstimmen geht eine LED an.

Ich bin nicht sehr erfahren in der AVR-Programmierung und habe keine 
Ahnung wie ich eine Debug-Ausgabe realisieren soll. Ich glaube die Werte 
werden nicht richtig in den Puffer geschrieben. Die compare funktion ist 
auf jeden Fall richtig, denn wenn ich puffer und passwort gleichsetze 
leuchtet die LED. Auch wenn ich die Länge des Passworts auf 1 setze geht 
es. Ihr Profis erkennt sicher auf dem ersten Blick meinen Fehler:
1
#include <avr/io.h>
2
#include <avr/delay.h>
3
4
#define INPUT_MASK 0b00000111 //3 knöpfe
5
#define LENGTH 2
6
7
uint8_t getInput(uint8_t pin, uint8_t mask) {
8
  return ~(pin & mask);
9
}
10
11
uint8_t it = 0;
12
13
void add(uint8_t* buf, uint8_t num) {
14
  buf[it] = 1;
15
  if (it < LENGTH - 1)
16
    it++;
17
  _delay_ms(500);
18
}
19
20
int compareArrays(uint8_t* buf1, uint8_t* buf2) {
21
  for (uint8_t i; i < LENGTH; i++) {
22
    if (buf1[i] != buf2[i])
23
      return 0;
24
  }
25
  return 1;
26
}
27
28
int main(void) {
29
30
  DDRB = 0b11111111; //out
31
  DDRD = 0; //in
32
  PORTB = 0xff;
33
34
  uint8_t buffer[LENGTH] = { 0, 0 };
35
  uint8_t pass[LENGTH] = { 1, 1 };
36
37
  while (1) {
38
          uint8_t input = getInput(PIND, INPUT_MASK);
39
40
    if (input & 0b00000001) //wenn knopf 1 gedrückt
41
      add(buffer, 1);
42
43
    if (compareArrays(buffer, pass))
44
      PORTB = ~0b00001000;
45
    else
46
      PORTB = 0xff;
47
  }
48
  return 0;
49
}

von Paul (Gast)


Lesenswert?

Stichwort: Entprellung

von Walternativ (Gast)


Lesenswert?

Paul schrieb:
> Stichwort: Entprellung

Das heißt doch nur, dass das einmalige Drücken als mehrfaches 
wahrgenommen wird, was aber nicht die Lösung zu meinem Problem sein 
kann, oder?

von Max B. (theeye)


Lesenswert?

Walternativ schrieb:
> dass das einmalige Drücken als mehrfaches
> wahrgenommen wird

Wenn du eine PIN Eingabe realisieren möchtest, ist das doch ganz 
entscheidend!

Beispiel
PIN lautet 012 (Taster)

Also d®ückst du die Taster 0, 1 und 2. Ergebnisse:

Ohne entprellen z.B.: 0000011111222

Mit entprellen: 012

Gruß Max

von Paul (Gast)


Lesenswert?

Hm... da ist ja ein recht großes Delay drin.

Walternativ schrieb:
> return ~(pin & mask);

Warum eigentlich hier das nicht?

von Max H. (hartl192)


Lesenswert?

Wenn ein Knopf gedrückt wird wie add(); aufgerufen. add enthält ein 
_delay_ms(500); die Taste wird also entprellt.

von Walternativ (Gast)


Lesenswert?

Paul schrieb:
> Hm... da ist ja ein recht großes Delay drin.
>
> Walternativ schrieb:
>> return ~(pin & mask);
>
> Warum eigentlich hier das nicht?

Weil das STK500 ganz komisch ist.

Max B. schrieb:
> Wenn du eine PIN Eingabe realisieren möchtest, ist das doch ganz
> entscheidend!
>
> Beispiel
> PIN lautet 012 (Taster)
>
> Also d®ückst du die Taster 0, 1 und 2. Ergebnisse:
>
> Ohne entprellen z.B.: 0000011111222
>
> Mit entprellen: 012
>
> Gruß Max

Das ist schon richtig, aber es erklärt nicht, warum die LED überhaupt 
nicht angeht. Theoretisch müsste ja dann schon beim ersten Tastendruck 
der Puffer auf {1,1} stehen und damit dem Passwort entsprechen.

von Drrt (Gast)


Lesenswert?


von jetzt (Gast)


Lesenswert?

Dann gib doch den jeweils gelesenen pin ueber einen anderen aus und 
beobachte mit einem Oszilloskop

von Walternativ (Gast)


Lesenswert?

Ein n00b hat kein Oszilloskop

von spontan (Gast)


Lesenswert?

Manche Tasten prellen nicht nur beim Drücken, sondern auch beim 
Loslassen,
kann das Dein delay und der Rest der Software ausgleichen?

von Walternativ (Gast)


Lesenswert?

Ich habe in der compare Funktion i uninitialisiert gelassen. Es geht 
jetzt.

Der Thread ist hiermit offiziell geschlossen

von jibi (Gast)


Lesenswert?

Hat dich der Compiler nicht mit einem Warnhinweis darauf aufmerksam 
gemacht?
Die zu lesen und zu verstehen ist nämlich Gold wert.

Gruß Jonas

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.