AVR-n00b will Passworteingabe machen

Gast #3521933
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
}
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.