Simples Würfelprogramm verhält sich nach kleiner Erschütterung komisch

Gast #4306106
Lesenswert?

Ich habe für meinen Atmega88PA ein simples Würfelprogramm geschrieben, 
welches auch funktioniert (Code: http://pastebin.com/UjBUAgNa). Sollte 
es aber zu einer kleinen Erschütterung der Hardware kommen und der 
Taster gedrückt werden, wartet das Programm nicht mehr auf das Loslassen 
des Tasters und generiert mit maximaler Geschwindigkeit Zahlen, sodass 
die 7-Segment-Anzeige extrem schnell rumflackert und eine acht zu sehen 
ist. Die Hardware scheint zu funktionieren, da ein anderes Programm, was 
bei selbem Aufbau einfach nur den aktuellen Pinstatus auf dem Display 
ausgiebt, nicht auf diese Erschütterungen reagiert. Woran kann das 
liegen? Wie kann die Erschütterung das eine Programm beeinflussen, das 
andere aber nicht?

Der Aufbau: Der Pin C0 des Controllers ist mit dem Taster und einem 
Pull-Up von 10 kOhm verbunden. Alle D-Pins sind mit den 8 Pins der 
7-Segment-Anzeige verbunden (Pin 7 ist ein kleiner Punkt neben der 
Zahl). Programmiert wird über Atmel Studio 7 und einem USBAsp, der die 
Schaltung auf dem Breadboard außerdem mit 5V Strom versorgt.
Angehängte Dateien:
Gast #4306120
Lesenswert?

Klingt so, als würde der Kontakt vom Taster flattern und schon gibts 
Müll.

Kim-Yannick schrieb:
> ein anderes Programm, was
> bei selbem Aufbau einfach nur den aktuellen Pinstatus auf dem Display
> ausgiebt

Zeig doch mal dieses wundervolle Programm.

Auf jeden Fall fehlt die Resetbeschaltung mit Pullup und die 
Entkoppelkondensatoren.
Gast #4306139
Lesenswert?

1: Warum setzt du den Code nicht direkt in den Beitrag? Der ist nicht so 
lang, dass es da Probleme gäbe.

2: Das Programm hat ein paar unschöne Stellen, die die Funktion nicht 
stören aber trotzdem nicht so toll sind.

3: Ist das Problem reproduzierbar, tritt also immer gleich auf? Werden 
dauerhaft neue Zahlen generiert oder nur beim Wackeln?
Gast #4306145
Lesenswert?

Dussel schrieb:
> 3: Ist das Problem reproduzierbar, tritt also immer gleich auf? Werden
> dauerhaft neue Zahlen generiert oder nur beim Wackeln?

Nach der Erschütterung hält das Problem eine kurze und immer 
unterschiedliche Zeit an. Das Flackern passiert nur, solange der Taster 
gedrückt ist. Wenn ich ihn loslasse, erkennt es das Programm korrekt. 
Wenn ich ihn wieder drücke, fährt das Flackern fort, sofern sich die 
Schaltung nicht schon wieder eingekriegt hat.

Dussel schrieb:
> 1: Warum setzt du den Code nicht direkt in den Beitrag? Der ist nicht so
> lang, dass es da Probleme gäbe.

Weil man in vielen Foren den Code in eigene Code-Blöcke setzen muss, die 
es hier nicht gibt. Außerdem gibt es bei Pastebin Syntax-Highlighting.

Holger L. schrieb:
> Pin22 (GND) und Pin20(AVCC) wurden ebenfalls weggelassen.

Muss ich an die Pins einfach nocheinmal die Versorgungsspannung 
anschließen?

Witzbold schrieb:
> Die Entkoppelkondensatoren an VCC fehlen.
> Diese dienen der mechanischen Entkoppelung von Mikrocontroller und
> Steckbrett.

Wie genau muss ich die aufbauen? Ich bin neu im Gebiet der Elektronik.
#4306173
Lesenswert?

Die 100nF Abblockkondensatoren kommen jeweils zwischen VCC und GND.
Dem Resetpin kann man noch einen 10k Widerstand nach Vcc spendieren.
Dein F_CPU 10000000UL hat eine null zu viel.
Eventuell ist eine Tastenentprellung erforderlich.
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten

Code kann man hier im Forum auch formatiert anzeigen, siehe dazu
https://www.mikrocontroller.net/articles/Formatierung_im_Forum
Gast #4306217
Lesenswert?

Eine simple If-Abfrage scheint den Code lauffähig zu machen. Wieso es 
jetzt genau so war, weiß ich immer noch nicht. Aber immerhin läuft der 
Code jetzt.

Ausschnitt aus dem Code:
1
while (!PINC&1) {
2
    number = rand();
3
    _delay_ms(10);
4
}
5

6
if (PINC&1) { // Die If-Abrage scheint es zum Laufen zu bringen
7
    PORTD = codes[number%6+1];
8
    
9
    while (PINC&1)
10
        _delay_ms(10);
11
}
Gast #4306307
Lesenswert?

Forist schrieb:
> Was haben Port D und Pin C miteinander zu schaffen?
>
> Wie sieht dein Schaltungplan dazu aus?

Das ist die selbe Schaltung wie oben beschrieben bzw. auf dem Foto zu 
sehen. Pin C0 ist der Schalter, dessen Signal in Form einer 0 oder 1 
abgegriffen wird. Diese 1-Bit-Zahl wird dann als Index für das 
Code-Array genommen, welches fortlaufend die Daten für die jeweiligen 
Ziffern des 7-Segment-Displays enthält, dessen Pins alle mit den Pins 
von PORTD verbunden sind.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren