Nordmende
Enthusiast
Hallo !
In der Schule programmieren wir zurzeit einen Atmel Atmega16 Mikrokontroller.
Dieser soll, sobald ein Knopf gedrückt wird und wieder los gelassen wird, eine zufällige Zahl von 1 bis 6 ausgeben.
Hier unser Code:
Wenn jetzt die Taste gedrückt wird, zeigt die 7-Segment-LED Anzeige alle Segmente an, es leuchtet also eine 8 mit dem Punkt unten.
Unser Problem ist jetzt aber: Sobald die taste losgelassen wird, wird immer die Zahl 2 angezeigt und an diesem Punkt kommen wir nicht weiter
Weiß einer von euch Rat ?
In der Schule programmieren wir zurzeit einen Atmel Atmega16 Mikrokontroller.
Dieser soll, sobald ein Knopf gedrückt wird und wieder los gelassen wird, eine zufällige Zahl von 1 bis 6 ausgeben.
Hier unser Code:
Code:
#include <inttypes.h>
#include <avr/io.h>
int main(void)
{
uint8_t led;
uint8_t keys;
DDRB = 0xff; // use all pins on PortB for output
DDRD = 0x00; // use all pins on port D for input
PORTD = 0xff; // activate internal pull-up
PORTB = 0xff; // set output high -> turn all LEDs off
for (;;) { // loop forever
keys = ~PIND; // read input port with switches (active-low)
if ( keys & 1 )
{
led = 164; // Zahl 1
}
else if ( keys & 1 )
{
led = 148; // Zahl 2
}
else if ( keys & 1 )
{
led = 210; // Zahl 3
}
else if ( keys & 1 )
{
led = 152; // Zahl 4
}
else if ( keys & 1 )
{
led = 136; // Zahl 5
}
else if ( keys & 1 )
{
led = 215; // Zahl 6
}
else led=0 // Alle Segmente Leuchten, Zahl 8
PORTB = ~led; Set corresponding LED if switch pressed
}
}
Wenn jetzt die Taste gedrückt wird, zeigt die 7-Segment-LED Anzeige alle Segmente an, es leuchtet also eine 8 mit dem Punkt unten.
Unser Problem ist jetzt aber: Sobald die taste losgelassen wird, wird immer die Zahl 2 angezeigt und an diesem Punkt kommen wir nicht weiter

Weiß einer von euch Rat ?
aber dennoch du mußt warten und den code zumindest kurz unterbrechen lassen damit er die Anzeige in Ruhe anzeigen kann...sonst flimmert das ja alles. Die If Abfrage ist glaube in dem Fall einfach nicht ideal die kann nur ein Ergebniss liefern
... weil nur einmal eingelesen wird und der Wert ja nur 1 oder eben 0 sein kann...das heißt es wird nur die erste Bedingung verarbeitet (oder auch nicht) die anderen werden nie abgefragt ... lass doch ein Timer laufen und lasse ihn durch die Taste unterbrechen und wenn er sich im Bereich von 0 bis 43 befindet machst 1 und wenn er zwischen 43 und 86 ist 2 usw. Die Bitmaske hast ja in der If Abfrage drin ok 

