- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 4 von 4

Thema: Algorithmus - Ausgabe in Schieberegister

  1. #1
    shedepe
    Gast

    Algorithmus - Ausgabe in Schieberegister

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,
    Ich hab hier grad eine Siebensegmentanzeige rumliegen die ich an ein Schieberegister angeschlossen habe. Funktioniert auch alles soweit.
    Jetzt frage ich mich jedoch (zu meinem funktionierenden code)
    kann man das auch noch besser machen:
    Zur Zeit habe ich eine Methode:
    Code:
    void DisplayNumber(uint8_t Number, uint8_t decimalPoint); //Nummer zwischen 0 und 9     wenn decimalPoint != 0 wird der DezimalPunkt angeschaltet
    In der Methode sieht das ganze so aus (Nur mal als Beispiel wenn Number==0)
    Code:
    switch (Number)
    	{
    		case 0:  //Ziffer Null
    		for(int i = 0; i < 8; i++)  //Alle 8 bits durchgehen
    		{
    			if(i == 4 || i == 2)  //Wenn entsprechendes Segment aus sein soll SERan (PORTC |= (1<<PC7);)
    			{
    				if(decimal ==AN) //Wenn der Decimalpunkt An sein soll SERaus (PC7 auf low)
    				{
    					if(i==2)
    						{
    							SERaus 
    						}
    						else
    						{
    
    							SERan
    						}
    				        }
    					else
    				        {
    					SERan //Für den Fall dass der Dezimalpunkt nicht an sein soll PC7 auf high --> Segment aus
    
    				        }
    		     
    			}
    			else
    			{
    			  SERaus //Für alle anderen Segmente PC7 auf Low --> Segment an
    			}
    			Impuls(); //Schiebe"impuls"
    
    		}
    		break;
    
    //Behandlung der anderen Ziffern
    Meine Frage: Ist das Vorgehen so sinnvoll oder sollte ich es komplett anders machen bzw. was könnte ich daran noch optimieren ?

    mfg shedepe

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Meine Frage: Ist das Vorgehen so sinnvoll oder sollte ich es komplett anders machen bzw. was könnte ich daran noch optimieren ?
    Ja, ich würde das definitiv deutlich anders machen:

    Code:
    #include <avr/pgmspace.h>
    
    
    #define DECIMAL_POINT_BIT  2
    
    static uint8_t SegmentPattern[] PROGMEM = {
    
    	0b11101011,   // 0
    	0b00000000,   // 1
    	0b00000000,   // 2
    	0b00000000,   // 3
    	0b00000000,   // 4
    	0b00000000,   // 5
    	0b00000000,   // 6
    	0b00000000,   // 7
    	0b00000000,   // 8
    	0b00000000    // 9
    };
    
    
    void DisplayNumber (uint8_t Number, uint8_t decimalPoint) {
    
    	uint8_t data = pgm_read_byte(&SegmentPattern[Number]);
    
    	if (decimalPoint)
    		data |= (1<<DECIMAL_POINT_BIT);
    
    	for (uint8_t mask = 1; mask; mask <<= 1) {
    		if (data & mask)
    			SERaus
    		else
    			SERan
    		Impuls();
    	}
    }
    Die Daten in SegmentPattern passen so natürlich nicht und müssen angepasst werden (1 = an, 0 = aus). Ich kenne ja schließlich deine Bit/Segment-Zuordnung nicht.

    PS: Ich empfinde die SERan und SERaus ohne Semikolon dahinter als ziemlich unschön (und ich bin da sicher nicht der einzige). Nimm die Semikolons aus den Makros raus und platziere sie lieber an "Ort und Stelle".
    MfG
    Stefan

  3. #3
    shedepe
    Gast
    Vielen Dank funktioniert hervorragend, so etwas hatte ich davor auch im Sinn, da ich jedoch nicht wusste wie man in einer Schleife die Bits durchgehen kann hatte ich den anderen Weg gewählt.

    Nachdem ich deine for schleife gesehn hab war mir das sofort klar

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.03.2010
    Beiträge
    161
    Also den Ausdruck (mask<<=1) finde ich sehr interessant. Auf eine derart einfache Idee wäre ich wohl nicht so schnell gekommen.

Berechtigungen

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

Labornetzteil AliExpress