4 Gewinnt in C (LED'S ansteuern)?



  • Guten Abend !

    Ich hab eine Frage und zwar haben wir eine Kleine Aufgabe bekommen wo wir ein 4 Gewinnt Spiel Programmieren sollen in C. Wir haben unsere Aufgaben aufgeteilt und ich habe die bekommen wo es sich um die Ausgabe an ein LED Spielboard handelt.

    Es steht uns zur verfügung ein ATmega8
    und das Spielfeld sieht wiefolgt aus:

    S1 S2 S3 S4 S5 (Spalt)
    Z1 # # # # #

    Z2 # # # # #

    Z3 # # # # #

    Z4 # # # # #

    T T T T T (T= Taster)

    Also der Aufbau ist 4x5

    ich habe schon angefangen ein Code zu schreiben und würde euch bitten mal nachzugucken ob es soweit in ordnung ist .. ob es in die Richtige richtung geht.

    / Definierung der Zeilen und Spalten

    #define Port_Zeile PORTD
    #define Z1 PD0
    #define Z2 PD1
    #define Z3 PD2
    #define Z4 PD3

    #define Port_Spalt PORTC
    #define S1 PC0
    #define S2 PC1
    #define S3 PC2
    #define S4 PC3
    #define S5 PC4

    #define PIN_Taster PINB

    //globale Variable zur Auwertung bei Interrupts
    volatile uint8_t isrFlag;
    //globale Variable für Zeilendurchlauf
    volatile uint8_t isrZeile;

    //Array für die Matrix
    char leds[4] = {0b00011111,\
    0b00010001,\
    0b00010001,\
    0b00011111};

    ISR( TIMER0_OVF_vect ) // Overflow Interrupt Vector
    {
    //Interrupt erfolgt
    isrFlag = 1;
    //Inkrementieren der Zeilen
    isrZeile++;
    //Nach der 4.Zeile wieder auf 0 zurücksetzen
    if (isrZeile > 3)
    isrZeile =0;

    }

    //Ausgabe einer Zeile
    void led_mat(char matrix[4]){

    //Spalte festlegen
    Port_Spalt = matrix[isrZeile];

    //Zeile anschalten
    Port_Zeile &= ~(1<<isrZeile);
    //1ms Warten
    _delay_ms(1);
    //Zeile ausschaltemn
    Port_Zeile |= (1<<isrZeile);
    }

    int main (void) {

    //Timer konfigurieren
    TIMSK |= (1<<TOIE0); // den Overflow Interrupt des Timers freigeben
    TCCR0 = (1<<CS01); // Vorteiler 8, jetzt zählt der Timer bereits

    }

    Meine frage ist noch wie ermögliche ist das mit den Tastern? das ich halt mit dem Taster bestimme in welchen Spalt der Stein Fällt und wie definiere ich sie ?hab ja im moment so gesehen nur 1 Taster mit #define PIN_Taster PINB

    Mfg



  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum C (C89, C99 und C11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Bezieht sich deine Frage da drauf, wie du deine Hardware ansteuerst? Oder wie du die Programmlogik umsetzt? Oder zu syntaktischen Problemen mit der Sprache C?

    Wir brauchen mehr Informationen.
    http://www.c-plusplus.net/forum/200753



  • Ich hab deinen Code mal formatiert:

    // Definierung der Zeilen und Spalten 
    
    #define	Port_Zeile	PORTD 
    #define Z1	 PD0 
    #define Z2	 PD1 
    #define Z3	 PD2 
    #define Z4	 PD3 
    
    #define Port_Spalt	PORTC 
    #define S1	 PC0 
    #define S2	 PC1 
    #define S3	 PC2 
    #define S4	 PC3 
    #define S5	 PC4 
    
    #define PIN_Taster	PINB 
    
    //globale Variable zur Auwertung bei Interrupts 
    volatile uint8_t isrFlag; 
    //globale Variable für Zeilendurchlauf 
    volatile uint8_t isrZeile; 
    
    //Array für die Matrix 
    char leds[4] = {0b00011111,\ 
    0b00010001,\ 
    0b00010001,\ 
    0b00011111}; 
    
    ISR( TIMER0_OVF_vect ) // Overflow Interrupt Vector 
    { 
    	//Interrupt erfolgt 
    	isrFlag = 1; 
    	//Inkrementieren der Zeilen 
    	isrZeile++; 
    	//Nach der 4.Zeile wieder auf 0 zurücksetzen 
    	if (isrZeile > 3) 
    		isrZeile =0; 
    } 
    
    //Ausgabe einer Zeile 
    void led_mat(char matrix[4])
    { 
    	//Spalte festlegen 
    	Port_Spalt = matrix[isrZeile]; 
    
    	//Zeile anschalten 
    	Port_Zeile &= ~(1<<isrZeile); 
    	//1ms Warten 
    	_delay_ms(1); 
    	//Zeile ausschaltemn 
    	Port_Zeile |= (1<<isrZeile); 
    } 
    
    int main (void)
    { 
    	//Timer konfigurieren 
    	TIMSK |= (1<<TOIE0); // den Overflow Interrupt des Timers freigeben 
    	TCCR0 = (1<<CS01); // Vorteiler 8, jetzt zählt der Timer bereits 
    }
    

    So, zum Thema: Ich verstehe deinen Code ehrlichgesagt nicht wirklich.
    Warum der Umweg über den Timer und nicht einfach eine Endlosschleife in main und "_delay_ms" ?

    Was genau ist mit dem "Array für die Matrix", warum sind die LEDs Anfangs schon aktiviert ? 😕

    Und AFAIK musst du zu Beginn des Programms festlegen welche Ports Output sind, das ist bei dir nicht. Korrigier mich wenn das unnötig ist.

    Zum Thema Ansteuerung der Hardware:
    Das Problem ist, dass das hier nicht wirklich ein C Problem ist, zu Mikrocontroller-spezifischen Sachen kann ich dir nicht viel sagen. Aber ein paar Grundlegene Dinge:

    1. Wie setzt du den Status der LEDs ? Ich schätze du hast Ports auf die du Werte legen kannst. Aber wie steuerst du damit die LED Matrix an ?
      Mach erstmal eine Funktion "SetLED(int num, bool on)", oder klär mich auf wie das läuft 😃
    2. Wie fragst du den Zustand der Taster ab ? Auch wieder ein Port über den du Werte einlesen kannst oder ?

    So genug gefragt, hier mal Pseudocode für die Implementierung:

    //Dummys
    void SetLED(int y, int x, bool on);
    bool getButtonState(int num);
    void sleep(int time);
    
    char field[5][4];
    
    //returns number of the first pressed button (or -1)
    int getButton()
    {
    	for(int i=0;i<5;i++)
    	{
    		if(getButtonState(i))
    			return i;
    	}
    	return -1;
    }
    
    void drawField()
    {
    	for(int y =0; y<4; y++)
    	{
    		for(int x=0; x<5; x++)
    		{
    			SetLED(y, x, field[y][x]);
    		}
    	}
    }
    
    void updateLogic()
    {
    	// ...
    }
    
    void mainLoop()
    {
    	int selectedButton =-1;
    	while(true)
    	{
    		selectedButton = getButton();
    		if(selectedButton != -1)
    		{
    			//insert a field
    			selectedButton = -1;
    		}
    		updateLogic();
    		sleep(10);
    	}
    }
    
    int main()
    {
    	//Initialize Ports
    	//Loop over field at set all zero
    	mainLoop();
    }
    

    Falls du Fragen zur Programmlogik selber hast (insert, updateLogic) musst du genauer werden. 😉



  • Das ist ja lustig, genau dieses Projekt willich in Zukunft auch noch umsetzen!

    Benutzt ihr RGB leds?

    Wolverine89 schrieb:

    Meine frage ist noch wie ermögliche ist das mit den Tastern? das ich halt mit dem Taster bestimme in welchen Spalt der Stein Fällt und wie definiere ich sie ?hab ja im moment so gesehen nur 1 Taster mit #define PIN_Taster PINB
    Mfg

    Wieso benutzt ihr nicht für jede Spalte jeweils einen Taster? Also insgesamt 5.

    Kann mir nicht vorstellen, dass ein einziger Taster ausreicht zum Spielen.

    Falls euch die Pins ausgehen, könntet ihr eventuell mut Schieberegistern arbeiten. Kenn mich auf dem Gebiet leider noch nicht so gut aus.

    Falls ihr dürft und Schwierigkeiten mit dem Ansteuern der Hardware habt, programmiert das ganze mit Arduino. Damit ist das ein Kinderspiel.



  • Hab nochmal kurz überlegt und so wie ich das sehe, benötigt ihr:

    40 digitale Pins (OUTPUT) für die LEDS
    (falls ihr RGB LEDs benutzt, also 2x 4x5, da zwei Farben und 4x5 Zeilen mal Spalten)

    und

    5 digitale Pins (INPUT) für die Taster (ein Taster pro Spalte).

    Der Mikrocontroller muss in der Lage sein, jede einzelne LED anzusteuern, und das in zwei Farben, und der Mikrocontroller muss zu jedem Zeitpunkt wissen, welche LED gerade an ist und welche nicht.

    Weil der Atmega8 nicht genug digitale Pins besitzt, müsst ihr auf jeden Fall Schieberegister oder irgendwelche LED-Matrix-Treiberchips benutzten.

    Wäre schön, wenn ihr euch meldet und mehr Infos über Hardware preisgibt, ansonsten kann man nicht helfen.


Log in to reply