Forum: Mikrocontroller und Digitale Elektronik Bascom: Quizspiel mit Atmega32 und Grafikdisplay


von Florian K. (Gast)


Lesenswert?

Hallo zusammen,
Ich arbeite derzeit an einem Quizspiel mit einem Atmega32 und dem Pollin 
TG12864b Grafikdisplay.
Das Spiel soll 15 Fragen haben (im Code habe ich erstmal nur 3 Fragen 
zum Test vorgesehen).
Beim Start soll kurz "Quizmaster 2012" eingeblendet werden, danach soll 
das Spiel beginnen, erste Frage soll dargestelllt werden.
Wenn eine Antwort ausgewählt wurde, soll die Zeile mit der richtigen 
Antwort invertiert dargestellt werden um die Auswahl zu markieren, die 
anderen Antworten sollen normal dargestellt werden.
Wenn die Antwort falsch ist soll das Programm kurz zur Hauptanzeige 
Lcdat 4 , 1 , "QUIZMASTER 2012" Springen und dann die erste Frage laden 
(erstmal ohne zufällige Auswahl der Fragen).
Wenn die Antwort richtig ist, soll er den nächsten Frage, Antwort, 
Geldblock darstellen.
Sind alle Fragen durch, soll er zurück zur Hauptanzeige springen.
Den Code schreibe ich mit Bascom AVR.

Ich hatte mir gedacht das Display so zu gestalten (es stehen mit einer 
8x8 Font 8 zeilen und 16 Zeichen zur verfügung):

Frage:     50EUR
Wer hat im Film.
..die Hauptrolle
gespielt?
A:(AntwortA)
B:(AntwortB)
C:(AntwortC)
D:(AntwortD)

Das ganze möchte ich mit 4 Tasten bedienen (Für jede Antwort eine Taste)

Nun zu meiner Frage:
Mit welchem Befehl kann ich den nächsten Block darstellen? Mit "Next" 
funzt das irgendwie nicht so richtig. Oder muss man da mit Cnt = Cnt+1 
arbeiten? Ich stehe dort gerade ein bisschen auf dem Schlauch.

Der Code sieht bisher so aus: (Da sind sicherlich einige Dinge die noch 
nicht so optimal gelöst wurden, aber man lernt ja noch dazu)

'Chipkonfiguration und Quarzfrequenz
$regfile = "m32def.dat"
$crystal = 8000000

'Hauptkonfiguration der Ein-und Ausgänge:
Config Portd.3 = Input
Config Portd.4 = Input
Config Portd.5 = Input
Config Portd.6 = Input

'Pullup-Widerstände aktivieren
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1

'Grafik-LCD Konfiguration
$lib "glcdKS108.lbx"

Wait 2

Print "Config"
Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portc , 
Ce = 0 , Ce2 = 1 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 5

Cls
Setfont Font8x8
Cls

Dim A As Integer
Dim X As Integer
Dim Loesung(3) As Integer
Dim Frage(3) As String * 16
Dim Geldanzeige(3) As String * 16
Dim Antworta(3) As String * 16
Dim Antwortb(3) As String * 16
Dim Antwortc(3) As String * 16
Dim Antwortd(3) As String * 16

Wait 1
Cls
Goto Hauptanzeige
Hauptanzeige:

Lcdat , 4 , 1 , "   QUIZMASTER   " , 1
Lcdat , 5 , 1 , "      2012      " , 1
Gosub Tasterabfrage


Frage(1) = "Was ist ein Aal?"
Frage(2) = "Wie heisse ich? "
Frage(3) = "Wie alt bin ich?"

Loesung(1) = 1
Loesung(2) = 4
Loesung(3) = 2

'Antwortmöglichkeiten (nicht negiert):

Antworta(1) = "A:Fischart      "
Antwortb(1) = "B:Werkzeug      "
Antwortc(1) = "C:Maschine      "
Antwortd(1) = "D:Krankheit     "
Antworta(2) = "A:Peter         "
Antwortb(2) = "B:Klaus         "
Antwortc(2) = "C:Matthias      "
Antwortd(2) = "D:Florian       "
Antworta(3) = "A:10 Jahre alt  "
Antwortb(3) = "B:20 Jahre alt  "
Antwortc(3) = "C:30 Jahre alt  "
Antwortd(3) = "D:40 Jahre alt  "

'Geldanzeige für die drei Fragen:
Geldanzeige(1) = "Frage:     50EUR"
Geldanzeige(2) = "Frage:    100EUR"
Geldanzeige(3) = "Frage:    250EUR"

Do
Tasterabfrage:
For X = 1 To 3 Step 1
'Ersten Frage-und Antwortenblock darstellen
   Lcdat 1 , 1 , Geldanzeige(x) , 1
   Lcdat 2 , 1 , Frage(x)
   Lcdat 5 , 1 , Antworta(x)
   Lcdat 6 , 1 , Antwortb(x)
   Lcdat 7 , 1 , Antwortc(x)
   Lcdat 8 , 1 , Antwortd(x)

   If Loesung(x) = A Then Next X                            'nächsten 
Frageblock darstellen! Wie?
   If Loesung(x) <> A Then Gosub Hauptanzeige               'Zurück zur 
Hauptanzeige
   If Loesung(x) = 0 Then Gosub Tasterabfrage               'Die Tasten 
abragen wenn keine Taste gedrückt wurde

'Antwortzuweisung der jeweiligen Taste, Hauptfunktion des Programms
   If Pind.3 = 0 Then A = 1
   If Pind.4 = 0 Then A = 2
   If Pind.5 = 0 Then A = 3
   If Pind.6 = 0 Then A = 4
   If Pind.3 = 1 And Pind.4 = 1 And Pind.5 = 1 And Pind.6 = 1 Then A = 0
   Return
Loop
End

$include "font8x8.font"

von Johannes G. (gutenberg)


Lesenswert?

Florian K. schrieb:
> Frage:     50EUR
> Wer hat im Film.
> ..die Hauptrolle
> gespielt?

Und da hast du dann genau ein Zeichen, um den Filmnamen hinzuschreiben? 
Das heisst wohl entweder ein anderes Display nehmen, oder Text scrollen.


Zu deiner eigentlichen Frage:
Du hast doch einen ganz simplen Programmablauf. Schreib den im Detail 
auf, dann setz ihn in bascom um.
Z.B.

- Frage x darstellen
- In Schleife ständig die vier Tasten abfragen, bis eine gedrückt wird
- Prüfen ob die richtige Taste gedrückt wurde
  - JA
    - Print "Gratulation..."
    - Geld = Geld + Gewinn
    - Frage = Frage + 1
  - NEIN
    - Print "Falsch..."
    - Geld = 0
    - Frage = 1
- Gehe zu Start


Einfacher wäre es natürlich, sowas auf dem PC zu testen. Das ist ja 
schliessliche keine typische µc-Aufgabe.

von Florian K. (Gast)


Lesenswert?

Johannes G. schrieb:
> Und da hast du dann genau ein Zeichen, um den Filmnamen hinzuschreiben?
> Das heisst wohl entweder ein anderes Display nehmen, oder Text scrollen.

Das war doch nur ein Beispiel rein vom Aufbau!! Die Fragen werden dann 
kürzer sein.

Das Problem was ich habe ist wie ich den nächsten 
Frage,Geld,Antwortenblock darstellen soll? Mit Next so wie ich das 
eingebunden habe flackert der Bildschirm nur da sich der Befehl nur 
schnell wiederholt. Ich möchte aber wenn die Antwort richtig ist, den 
nächsten Block darstellen und die Tasten abfrage OHNE das der Atmega 
immer wieder zurückspringt zur ersten Frage.
Oder muss man da anstatt:
"For 1 to 3 Step 1"
If Pin.() = 1 Then next X

eher schreiben:
Cnt = cnt + 1
also um eine Variable hochzählen (das der uC mitzählt)?
Er soll ja dann beim nächsten Block stehen bleiben und die Tasten erneut 
abfragen. Das Funktioniert aber nicht richtig. Wie muss ich den Next 
befehl denn einbinden damit meine Funktion gewährleistet ist? Auch die 
Bascom Hilfe bringt mich da nicht richtig weiter.

von Johannes G. (gutenberg)


Lesenswert?

Johannes G. schrieb:
> - Frage x darstellen
> - In Schleife ständig die vier Tasten abfragen, bis eine gedrückt wird
> - Prüfen ob die richtige Taste gedrückt wurde
>   - JA
>     - Print "Gratulation..."
>     - Geld = Geld + Gewinn
>     - Frage = Frage + 1
>   - NEIN
>     - Print "Falsch..."
>     - Geld = 0
>     - Frage = 1
> - Gehe zu Start


Hast du überhaupt gelesen und verstanden, was ich da geschrieben habe?

Es tönt so als ob du erst mal Basic lernen musst. Leg doch den µc zur 
Seite, und lern Basic-Grundlagen am PC (mit Textausgabe in die Konsole 
etc.).

von Florian K. (Gast)


Lesenswert?

Johannes G. schrieb:
> Hast du überhaupt gelesen und verstanden, was ich da geschrieben habe?

Ja das habe ich.
Anscheinend hast du schwierigkeiten mir meine Frage

Florian K. schrieb:
> Wie muss ich den Next
> befehl denn einbinden damit meine Funktion gewährleistet ist?

nicht verstanden.

Johannes G. schrieb:
>> - Frage x darstellen
>> - In Schleife ständig die vier Tasten abfragen, bis eine gedrückt wird
>> - Prüfen ob die richtige Taste gedrückt wurde
>>   - JA
>>     - Print "Gratulation..."
>>     - Geld = Geld + Gewinn
>>     - Frage = Frage + 1
>>   - NEIN
>>     - Print "Falsch..."
>>     - Geld = 0
>>     - Frage = 1
>> - Gehe zu Start

Der Ablauf ist mir klar, aber das ist doch im endeffekt nichts anderes 
was ich schon größtenteils im Programm stehen habe!

Johannes G. schrieb:
> Es tönt so als ob du erst mal Basic lernen musst.

Wie bitte?

Johannes G. schrieb:
> Leg doch den µc zur
> Seite, und lern Basic-Grundlagen am PC (mit Textausgabe in die Konsole
> etc.).

Das hat bei mir nicht funktioniert, sonst hätte ich das benutzt.
Das mit dem Terminal Emulator funzt nicht richtig und bei der Simulation 
gibt es nur einen Simulator für 2x16 Zeichen Lcds aber keinen für 
Grafikdisplays!

von Johannes G. (gutenberg)


Lesenswert?

Ich will dir nicht deine sinnlose Frage beantworten, wie du "next" zu 
benutzen hast, ich will dass du die geeignete Programmstruktur für dein 
Problem kapierst. Du hast doch da eine riesen-Schleife in der du alles 
mögliche machst. Das entspricht hinten und vorne nicht dem Ablaufplan 
den ich skizziert habe. Irgendwas hast du also doch nicht verstanden.

Florian K. schrieb:
> Das hat bei mir nicht funktioniert, sonst hätte ich das benutzt.
> Das mit dem Terminal Emulator funzt nicht richtig und bei der Simulation
> gibt es nur einen Simulator für 2x16 Zeichen Lcds aber keinen für
> Grafikdisplays!

Und das hast du auch nicht verstanden. Mit Basic kann man auch 
PC-Programme schreiben (hat rein garnichts mit µc oder Simulator etc. zu 
tun). Die Konsole ist kein Terminalprogramm sondern ein Textfenster wo 
du Ausgaben des Programms als Text darstellen kannst.

von oog (Gast)


Lesenswert?

Da sind strukturelle Probleme in der Hauptschleife
1
Do
2
  Tasterabfrage:
3
  For X = 1 To 3 Step 1
4
   If Loesung(x) = A Then Next X                            
5
   If Loesung(x) <> A Then Gosub Hauptanzeige               
6
   If Loesung(x) = 0 Then Gosub Tasterabfrage                  Return
7
Loop

Die For-Schleife muss immer mit Next beendet werden, nicht nur wenn 
Loesung(x)=A ist.

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.