Forum: Mikrocontroller und Digitale Elektronik AVR Atmel 8535 Nimm Spiel


von aboutblank (Gast)


Lesenswert?

Hallo an alle :D

bin relativ neu im Gebiet AVR...
machen in der Arbeit gerade ein Projekt in dem wir in C ein Nimm Spiel 
programmieren müssen und das ganze über ein I²C LCD Display ausgeben.
Über Taster werden dann die "Streichhölzer" genommen.

Weiß nicht wie ich das ganze angehen soll und das soll bis 14 uhr fertig 
werden.

Kann da jemand helfen??

Danke schon mal im vorraus :)

von ... .. (docean) Benutzerseite


Lesenswert?

rofl... Viel Spass...

http://www.mikrocontroller.net/articles/AVR

Ich hoffe ihr könnnt schnell lesen und lernen...

von aboutblank (Gast)


Lesenswert?

hab eher gehofft dass da vielleicht schon mal jemand so etwas 
programmiert hat oder so :D

von Peter D. (peda)


Lesenswert?

aboutblank schrieb:
> bin relativ neu im Gebiet AVR...
...
> Weiß nicht wie ich das ganze angehen soll und das soll bis 14 uhr fertig
> werden.

14.00 Uhr im Februar?
Könnte knapp werden.


Peter

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Schon ganz schön frech!

von Karl H. (kbuchegg)


Lesenswert?

aboutblank schrieb:
> Hallo an alle :D
>
> bin relativ neu im Gebiet AVR...
> machen in der Arbeit gerade ein Projekt in dem wir in C ein Nimm Spiel
> programmieren müssen und das ganze über ein I²C LCD Display ausgeben.
> Über Taster werden dann die "Streichhölzer" genommen.
>
> Weiß nicht wie ich das ganze angehen soll

Welche Teile davon kannst du alleine programmieren und bei welchen 
brauchst du Hilfe.

Tasten einlesen?
auf LCD ausgeben?
die Nimm-Logik ausdenken
die Nimm-Logik umsetzen

> und das soll bis 14 uhr fertig
> werden.

und seit wann weißt du das?
Weihnachten und zu viel zu tun gehabt?

von aboutblank (Gast)


Lesenswert?

ja heute 14 uhr :D
habe die woche seit montag C kurs mit nem Atmel 8535 und sollen das 
programmieren nur hat da fast niemand ne ahnung wie wirs angehn 
sollen...

darum hab ich auf hilfe in dem forum hier gehofft

von Karl H. (kbuchegg)


Lesenswert?

aboutblank schrieb:
> ja heute 14 uhr :D
> habe die woche seit montag C kurs mit nem Atmel 8535 und sollen das
> programmieren nur hat da fast niemand ne ahnung wie wirs angehn
> sollen...

mit den Teilen, die ihr alleine lösen könnt.
So schwer ist das doch nicht!


ihr werdet ja wohl soweit sein, den Inhalt einer int-Variablen am LCD 
ausgeben zu können. Dann sind da noch 3 Tasten. In irgendeiner Vorübung 
habt ihr sicherlich gelernt, wie man Tasten abfragt.
 In der Hauptschleife geht dann immer das gleiche Spielchen:
1
  Anzahl Hölzchen = 21
2
3
  Schleife
4
   wenn irgendeine Taste gedrückt
5
6
     Taste 1 gedrückt  -> 1 von der Variable Anzahl Hölzchen abziehen
7
8
     Taste 2 gedrückt  -> 2 von der Variablen Anzahl Hölzchen abziehen
9
10
     Taste 3 gedrückt  -> 3 von der Variablen Anzahl Hölzchen abziehen
11
12
     Ist die Anzahl Hölzchen zu 0 geworden
13
                 -> ja Benutzer hat gewonnen
14
15
     berechnen wieviel der Rechner nehmen wird und abziehen
16
     die neue Anzahl Hölzchen hinschreiben
17
     hinschreiben wieviel der Rechner genommen hat
18
19
     Ist die Anzahl Hölzchen zu 0 geworden
20
                 -> ja der Rechner hat gewonnen

Das einzig Schwierige (wenn Ausgabe und Tastenabfragen bekannt ist, 
wovon ich ausgehe, denn ansonsten ist das nie und nimmer zu schaffen) 
ist die Logik, wieviele Hölzchen der Rechner nehmen soll. Und das kann 
man googeln (oder ihn der Einfachheit halber immer 1 nehmen lassen. Er 
spielt dann zwar schwach, aber immerhin: er spielt. Und das ist immer 
noch besser als er spielt nicht). Der Rest ist doch einfach, wenn man 
Ausgabe und Tasteneinlesen schon kann. Noch ein paar if und ein wenig + 
und - rechnen und fürs erste: fertig. Wenn dann noch Zeit bleibt, kann 
man auch mal an die Feinheiten gehen, zb. dass nicht mehr als 1 Taste 
zur gleichen Zeit gedrückt werden darf, der Benutzer mitten drinn 
aufhören will, ein neues Spiel anfangen etc. Aber das hat Zeit. Erst 
soll das Programm prinzipiell laufen.

von Sven J. (svenj)


Lesenswert?

Moin,

Bestell deinem Vorturner mal nen schönen Gruß; entweder das oder tretet 
euch reihum in den Allerwertesten fürs vollständige Pennen in der Woche

Ihr habt (fachlich) drei Probleme:
- i2c ansprechen
- Taster einlesen
- Logik des "Nimm-Spiels" implementieren.

mit absteigendem Ärger-Faktor.

Kurz skizziert:
-Init von Variablen, Display und Rest vom System
-Endlosschleife mit dem Hauptprogram.
-- muss die Logik einen Zug machen oder wird auf Eingabe gewartet?
-- ggf. Eingabe auswerten, Tutorial gibts hier, oder selbst Zug machen.
-- Ergebnis bewerten (Sieg, Niederlage?)
-- Ausgabe an Display => Funktionsaufruf.
- Schleife Ende.

- I2C Funktion
der 8535 hat keine i2c Paripheriem, also müßt ihr die nötigen Signale 
per Hand erzeugen. Eigentlich für jedes mögliche Symbol eine Folge von 1 
und 0 auf einem Pin und jeweils ein Taktsignal auf einem zweiten Pin.
Sollte man euch aber eigentlich "vorgefertigt" geben, ansonsten gibts 
hier auch ein Tut, werded ihr aber kaum schaffen bis 1400...


--
 SJ

von aboutblank (Gast)


Lesenswert?

also bin schon mal weitergekommen

problem die hölzer werden abgezogen wenn ic den taster drücke und wenn 
ich in "loslasse"

daher ab ich ne while schleife so lang der taster gedrückt is und das 
eigentliche proramm wird erst gestartet wenn er losgelassen wird also 
aus der while schleife raus is.

funktioniert aber nicht so...

von Christian Erker (Gast)


Lesenswert?

Stichwort: Entprellung

von aboutblank (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/Entprellung#Softwareentprellung

hab das hier gefunden aber weiß nicht wie ich den zustand im weiteren 
programmverlauf abfragen bzw anwenden kann...

von LordZiu (Gast)


Lesenswert?

Also wenn du

aboutblank schrieb:
> aber weiß nicht wie ich den zustand im weiteren
> programmverlauf abfragen bzw anwenden kann...

Also wenn du nicht mal weißt, wie Funktionen in C arbeiten, solltest du 
nächste Woche nochmal von Vorne anfangen...

Zustand wird nur intern in der Funktion genutzt. Der Rückgabewert der 
Funktion zeigt dir, ob der Taster gedrückt wurde oder nicht.

von LordZiu (Gast)


Lesenswert?

BTW:

Die Lösung hier find ich besser, funktioniert auch tadellos. Am Besten 
als ISR:

[[http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#.28Tasten-.29Entprellung]]

von aboutblank (Gast)


Lesenswert?

danke LordZiu hab das jetzt so eingebaut und geht soweit :D

von Peter D. (peda)


Lesenswert?

LordZiu schrieb:
> Die Lösung hier find ich besser, funktioniert auch tadellos.

Kann ich nicht glauben.

Die Routine wartet jedesmal 100ms, solange die Taste gedrückt ist.
Und nur, wenn man genau innerhalb dieser 100ms losläßt, wartet sie 
nochmal 100ms und gibt 1 zurück.
Man muß also genau innerhalb der Routine loslassen!

D.h. das Main darf nichts weiter tun, als ständig diese Routine 
aufzurufen.
Wenn das Main aber etwas größer ist und z.B. selber 100ms braucht, geht 
also im Schnitt jeder 2. Tastendruck verloren. Das ist unbrauchbar.

Sie ist günstigstenfalls für absolute Winzigstprogramme brauchbar.


Peter

von aboutblank (Gast)


Lesenswert?

falsch
sobald ich den taster jetzt loslasse wird das programm danach ausgeführt

von Karl H. (kbuchegg)


Lesenswert?

aboutblank schrieb:
> falsch

Nein, richtig

> sobald ich den taster jetzt loslasse wird das programm danach ausgeführt

Du hast nur das Glück, dass in deinem Programm, während der Abfrage der 
Tasten nichts anderes passiert. Damit hängt das Programm praktisch 
ständig in den ersten beiden _delay_ms im debounce() rum. Die 
Wahrscheinlichkeit, dass du genau während dieser beiden _delay_ms die 
Taste loslässt, ist relativ hoch, weil ja sonst nichts passiert.

Bei deinem Programm ist das gerade noch akzeptabel. Aber für ein 
professionelles Programm ist das nicht zu gebrauchen.

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.