www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programmierung des Pingpong-Spiels von Franzis in C


Autor: Mirko Horstmann (m1rk0)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe gerade angefangen, mich mit µC-Programmierung zu beschäftigen, 
als Grundlage dient mir momanten das Pingpong-Spiel aus dem 
Franzis-Verlag ( 
http://www.elo-web.de/elo/entwicklung-und-projekte... 
), für das ich ein eigenes Spiel entwickeln möchte. Die Hardware besteht 
aus einer Platine mit LED-Matrix, einem ATMega8 und zwei 
Schieberegistern für das Multiplexen der LEDs, sowie zwei Potis für die 
Steuerung - wie die Grafik funktioniert kann man anhand eines 
C-Beispiels auf der Webseite sehr gut nachvollziehen. Andere Beispiele 
dort sind leider in BASCOM geschrieben, und daher für mich nicht sehr 
hilfreich. Ich verwende GCC mit dem Eclipse-AVR-Plugin unter Linux.

Hier gibt es den Schaltplan: ( 
http://www.elo-web.de/xattachment/0911PingPongSchaltbild.jpg ). Für 
meine Frage wichtig sind vor allem die Anschlüsse K1, K2 und P1-P4. Das 
Gerät besitzt einen Münzeinwurf, der einfach aus zwei Drähten an K1 und 
K2 besteht - eine eingeworfene Münze stellt kurz einen Kontakt zwischen 
beiden her und holt damit das Gerät aus dem Sleep-Modus, nach dem Spiel 
schläft es wieder ein. Die äußeren Anschlüsse beider Potis sind an P1 
und P4 angeschlossen, der Schleifer des einen an P2, der des anderen an 
P3. Mein Problem ist jetzt folgendes:

K2 und P4 hängen beide an PD2/INT0. In dem erwähnten C-Beispiel (das den 
Sleep-Mode nicht verwendet) wird zu Anfang PortD komplett auf Ausgang 
geschaltet:
DDRD = 0xff;

Dadurch funktioniert aber der Interrupt nicht, der bei INT0=low das 
Spiel wieder starten soll. Wenn ich dagegen die vier unteren Bits mit
DDRD = 0xf0;

als Eingang konfiguriere, dann wacht der AVR zwar wieder auf, aber ich 
habe dann leider ein Problem mit dem ADC: Der Wert, den ich mir ausgeben 
lasse, ist offenbar immer der 10-bit-Maximalwert. Daher habe ich nun 
versucht, am Anfang des Programms die Datenrichtung von PortD auf 0xff 
zu lassen und erst vor dem Schlafenlegen zu ändern. Meine Funktion für 
den Sleep-Modus sieht nun so aus:
void sleepNow()
{
  //Bildschirm löschen
  uint8_t i;
  for (i = 0; i<WIDTH; i++) leds[i] = 0;

  _delay_ms(250);

  //INT0 auf Eingang stellen, damit der Münzeinwurf funktioniert
  DDRD &= ~(1<<DDD2);

  //Sleep Enable, STAND-BY
  MCUCR |= (1<<SE) | (1<<SM2) | (1<<SM1);
  //Interrupt bei low auf INT0 erlauben
  GICR |= (1<<INT0);

  sleep_mode();

  //INT0 wieder auf Ausgang, damit das Poti funktioniert
  DDRD |= (1<<DDD2);
}

Ohne die letzte Zuweisung von DDRD bekomme ich nach dem Aufwachen wieder 
nur den höchsten Wert angezeigt, mit der Zuweisung reagiert das Gerät 
anschließend nicht mehr (es macht den Eindruck, als ob es gar nicht 
aufwacht).

Meine Frage wäre jetzt zunächst, was die Verbindung von K2, P4 und PD2 
für einen Sinn hat. Es scheint ja zu funktionieren, wie man am 
Originalspiel sieht, nur ist mir die Idee dahinter nicht klar. Meine 
Vorstellung ist, dass die Potis als Pull-Up-Widerstände fungieren, wenn 
der Pin als INT0 verwendet wird. Aber wäre es nicht sinnvoller gewesen, 
P4 mit Masse zu verbinden und die Messung damit unabhängig von der 
Konfiguration von PD2 zu machen?

Was muss ich unternehmen, um sowohl den Sleep-Mode als auch den ADC 
verwenden zu können?

Mein momentanes Testprogramm habe ich mal angehängt (auch wenn es etwas 
unordentlich aussieht). Der Wert des rechten Potentiometers wird in 
Binärcode über die Breite des Bildschirms angezeigt. Wenn man es ganz 
runterdreht (Wert 4, kleiner geht nicht), dann legt sich das Programm 
schlafen.

Mirko

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mirko Horstmann schrieb:
> Ohne die letzte Zuweisung von DDRD bekomme ich nach dem Aufwachen wieder
> nur den höchsten Wert angezeigt, mit der Zuweisung reagiert das Gerät
> anschließend nicht mehr (es macht den Eindruck, als ob es gar nicht
> aufwacht).

Weil zu diesem Zeitpunkt der externe Interrupt immer noch enabled ist. 
Wenn du den Pin zum Ausgang machst und eine 0 ausgegeben wird, schickt 
sich der µC quasi selber in einen Dauerinterrupt (dein Programm bleibt 
dann zwar nicht wirklich stehen, wird aber extrem langsam).

Autor: Mirko Horstmann (m1rk0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, danke! Mit einem
GICR &= ~(1<<INT0);

nach dem Aufwachen funktioniert es. Jetzt frage ich mich immer noch, 
warum die Schaltung so aufgebaut wurde. Wenn das Poti einfach mit Masse 
verbunden wäre, müsste es doch auch funktionieren, oder?

Mirko

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

vielleicht kann mir ja jemand helfen.... Ich habe dieses tolle PingPong 
Spiel bei Conrad gekauft und versuche den Controller mit Bascom 
umzuprogrammieren. Habe mir bei amazon einen USB-Programmer (Diamex) 
gekauft und angeschlossen, Programm übertragen... aber nix passiert, 
PingPong läuft weiter auf dem Controller. Habe mir jetzt sogar den 
Minimal-Programmer, wie auf elo-web beschrieben, besorgt. Auch hiermit 
bekomme ich mein Programm nicht übertragen... pingPong läuft weiter.... 
Hat jemand einen Tipp??

Vielen Dank!

Lutz

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.