-         

Ergebnis 1 bis 3 von 3

Thema: [gelöst] Idee und Problem...

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von squelver
    Registriert seit
    20.07.2006
    Ort
    Hoykenkamp
    Alter
    37
    Beiträge
    2.474

    [gelöst] Idee und Problem...

    Anzeige

    Hallo

    Ich bin seit gestern wieder am üben. Nun hab ich mir was ausgedacht, soweit klappt, nur gibts ein kleines Problem.

    Ich nutze einen Port für eine Segmentanzeige. Habe aber nur 5 Pins zur Verfügung. Ich habe jede Zahl definiert. Nun fehlen mir zwei Pins eines anderen Ports für die vollständige Anzeige der Zahlen. Kann man zwei Ports gleichzeitig definieren?

    Hier mein Code:

    Code:
    //----------------------------------------------------------------------
    // Titel     : C Grundgerüst für das myAVR-Board
    //----------------------------------------------------------------------
    // Funktion  : Skorpion-Roboter "Intelligentes Bein"
    // Schaltung : ...
    //----------------------------------------------------------------------
    // Prozessor : ...
    // Takt		 : 3.6864 MHz
    // Sprache   : C
    // Datum     : 10.10.2008
    // Version   : 0.1
    // Autor     : copious
    //----------------------------------------------------------------------
    #define 	F_CPU 3686400	// Taktferquenz des myAVR-Boards
    
    #define		zahl			PORTB 			// Port
    #define		eins			0b00100001		// 1
    #define		zwei			0b00111110		// 2
    #define		drei			0b00111011		// 3
    #define		vier			0b00110001		// 4
    #define		fuenf			0b00011011		// 5
    #define		sechs			0b00011111		// 6
    #define		sieben			0b00100011		// 7
    #define		acht			0b00111111		// 8
    #define		neun			0b00111011		// 9
    #define		null			0b00101111		// 0
    #define		off				0b00000000		// aus
    
    #include	<avr\io.h>		// AVR Register und Konstantendefinitionen
    //----------------------------------------------------------------------
    main ()						// Hauptprogramm, startet bei Power ON und Reset
    {
    	DDRD = 0b11111100;		// Pin 2 - 7 (Ausgang)
    	DDRB = 0b00111111;		// Pin 0 - 5 (Ausgang)
    	DDRC = 0b00000110;		// Pin 0 - 5 (Eingang)
    	PORTC = 0b00000110;
    	
    	do 
    	{
    		if(!(PINC&0b00000010))
    		{
    		zahl = eins;
    		}
    		else if(!(PINC&0b00000100))
    		{
    		zahl = zwei;
    		}
    		else
    		{
    		zahl = off;
    		}
    
    	}
    	while (true);			// Schleifenende Mainloop
    }
    //----------------------------------------------------------------------
    * Da geht noch was *

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    gelöst oder nicht?


    Erst mal würde ich die Muster nicht als defines, sondern in einem Array ablegen. Dann kann man nämlich zb mit anzeigecodes[7] die Code für die sieben ermitteln, wodurch die Ausgabe von Variablen erst möglich wird. Mit deiner Lösung könntest du nur konstante Wert ausgaben, da du alle Zahlen ausschreiben musst.

    Und dann solltest du eine Funktion schreiben, die die Zahl als uint8 übergeben bekommt und dann den Code nachschaut und die Ports entsprechend setzt.

    In dieser Funktion müsste dann das Byte mit dem Code aufgeteilt werden, und dann auf die Ports geschreiben werden.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von squelver
    Registriert seit
    20.07.2006
    Ort
    Hoykenkamp
    Alter
    37
    Beiträge
    2.474
    Danke für den Tipp, ich bin nur am rumprobieren und testen, ist nicht das direkte Ziel ne Segmentanzeige zu betreiben
    Wie sich was verhält und so.

    Des ist mein aktueller Code, sicherlich einiges so wie es nicht sein sollte, aber es funzt, die Zahlen laufen durch von 0 bis 9:

    Code:
    //----------------------------------------------------------------------
    // Titel     : C Grundgerüst für das myAVR-Board
    //----------------------------------------------------------------------
    // Funktion  : Skorpion-Roboter "Intelligentes Bein"
    // Schaltung : ...
    //----------------------------------------------------------------------
    // Prozessor : ...
    // Takt		 : 3.6864 MHz
    // Sprache   : C
    // Datum     : 10.10.2008
    // Version   : 0.1
    // Autor     : copious
    //----------------------------------------------------------------------
    #define 	F_CPU 3686400	// Taktferquenz des myAVR-Boards
    
    // #define		zahl			PORTB 			// Port
    #define		eins			(PORTD = 0b10000100) & (PORTB = 0b00000010)		// 1
    #define		zwei			(PORTD = 0b11111000) & (PORTB = 0b00000010)		// 2
    #define		drei			(PORTD = 0b11101100) & (PORTB = 0b00000010)		// 3
    #define		vier			(PORTD = 0b11000100) & (PORTB = 0b00000011)		// 4
    #define		fuenf			(PORTD = 0b01101100) & (PORTB = 0b00000011)		// 5
    #define		sechs			(PORTD = 0b01111100) & (PORTB = 0b00000011)		// 6
    #define		sieben			(PORTD = 0b10001100) & (PORTB = 0b00000010)		// 7
    #define		acht			(PORTD = 0b11111100) & (PORTB = 0b00000011)		// 8
    #define		neun			(PORTD = 0b11101100) & (PORTB = 0b00000011)		// 9
    #define		null			(PORTD = 0b10111100) & (PORTB = 0b00000011)		// 0
    #define		off				(PORTD = 0b00000000) & (PORTB = 0b00000000)		// aus
    
    #include	<avr\io.h>		// AVR Register und Konstantendefinitionen
    #include 	<util\delay.h>	// Bibliothek mit Warteroutinen
    //----------------------------------------------------------------------
    
    main (void)						// Hauptprogramm, startet bei Power ON und Reset
    {
    	DDRD = 0b11111100;		// Pin 2 - 7 (Ausgang)
    	DDRB = 0b00111111;		// Pin 0 - 5 (Ausgang)
    	DDRC = 0b00000000;		// Pin 0 - 5 (Ausgang)
    	PORTC = 0b00000011;
    	
    	unsigned char i;				// Variable für Datenausgabe
    	i=1;							// Bit 0 = 1, 0b00000001
    	
    	do 
    	{
    		
    		
    		if (eins)					// Wenn Bit durchgelaufen
    			i;					
    		_delay_ms(10000);				// kurz warten
    		if (zwei)
    			i;
    		_delay_ms(10000);				// kurz warten
    		if (drei)
    			i;
    		_delay_ms(10000);				// kurz warten
    		if (vier)
    			i;
    		_delay_ms(10000);				// kurz warten
    		if (fuenf)
    			i;
    		_delay_ms(10000);				// kurz warten
    		if (sechs)
    			i;
    		_delay_ms(10000);				// kurz warten
    		if (sieben)
    			i;
    		_delay_ms(10000);				// kurz warten
    		if (acht)
    			i;
    		_delay_ms(10000);				// kurz warten
    		if (neun)
    			i;
    		_delay_ms(10000);				// kurz warten
    		if (null)
    			i;
    		_delay_ms(10000);				// kurz warten
    
    	}
    	while (true);			// Schleifenende Mainloop
    }
    //----------------------------------------------------------------------
    * Da geht noch was *

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •