- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 23

Thema: 16-bit int in 2 8-bit int zerlegen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von Besserwessi
    Man kann auch direkt auf die einzelnen Bytes zugreifen, wenn man die Variable als union definiert.

    Es könnte sein dass GCC das per Optimierung auch so hinkriegt.
    GCC kann schon lange scalar replacement of aggregates, d.h. Komponenten eines zusammengesetzten Objekts werden ebenso effizient wie Skalare bekandelt, falls sie selber welche sind.

    Ausnahme sind Bitfelder, die bis dato in avr-gcc nicht sehr effizient behandelt werden. Insbesondere für einzelne Bits ist der Code deutlich schlechter, als er sein könnte. Demnägst gibt's aber vielleicht in Patch, das auch das behebt. Dann kann auf Bit ein einem Bitfeld ebenso effizient zugegriffen werden wie über das C-übliche Masken-Gefummel.
    Disclaimer: none. Sue me.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    29.12.2014
    Beiträge
    13

    Unglücklich

    Hallo Community,

    ich weiß, dass der Thread >6 Jahre alt ist, aber warum einen neuen eröffnen wenn mein Problem hier 100% liegt.

    mein Vorhaben ganz simpel: eine Zahl (16bit) soll auch wie hier in 2x(8bit) zerlegt werden und via UART auf einen zweiten µC gesendet und auf einer 7-Segment LED-Anzeige ausgegeben werden.
    Mit einer 8-bit Zahl habe ich die Ansteuerung des 7-Segment Displays getestet um dies schonmal abzuhaken in seiner Funktion.

    Problem ist, wenn ich eine 16-bit Zahl (hier 6789) sende, gibt die LED-Anzeige lauter Zufallszahlen aus und wechselt hin- und her.

    Ich stehe mit meiner Programmiererfahrung noch ziemlich am Anfang und habe versucht eine Lösung zu finde, jedoch ohne Erfolg. Ich poste die wichtigen Ausschnitte meines Codes (unwichtiges rausgelöscht) was das Senden und Empfangen angeht, wäre nett wenn mir einer helfen kann (ist ja bestimmt nichts großes)

    SENDEN
    Code:
    .
    .
    .
    .
    uint16_t zahl=6789;
    
    uint8_t HByte;
    uint8_t LByte;
    
    
    void daten_senden (uint8_t data)
    {
    	while (!(UCSRA & (1<<UDRE))){} //warten bis senden möglich ist
    	
    	UDR = data; //Zeichen in den Ausgabepuffer schreiben
    }
    
    void usart_init (void)
    {
    	UCSRB |= (1<<TXEN); //Daten senden
    	UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  // Asynchron 8N1
    	UBRRH = UBRR_VAL >> 8;
    	UBRRL = UBRR_VAL & 0xFF;
    }
    
    
    int main(void)
    {
        usart_init();
    
        while (1) 
        {
    		
    		HByte = (zahl >> 8);
    		LByte = zahl & 0xff;		
    
    		daten_senden(HByte);
    		daten_senden(LByte);		
        }
    }


    EMPFANGEN

    Code:
    .
    .
    .
    
    
    uint16_t zahl;
    uint8_t usart_empfang; 
    
    void usart_init (void)
    {
    	UCSRB |= (1<<RXEN) |(1<<RXCIE) ; //Daten empfangen und Interrupt für Datenempfang enable
    	UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  // Asynchron 8N1
    	UBRRH = UBRR_VAL >> 8;
    	UBRRL = UBRR_VAL & 0xFF;
    }
    
    
    ISR(USART_RXC_vect)
    {
    	usart_empfang = UDR;	
    }
    
    
    int main(void)
    {	
    	usart_init();
    	
    	sei();
    	
        while (1) 
        {
    		
    		uint8_t HByte = usart_empfang;
    		uint8_t LByte = usart_empfang;
    			
    		zahl = (((uint16_t) HByte) << 8 ) | LByte;
    		
    		zahl_ausgeben(zahl);	
    		
    		
        }
    }
    Geändert von opc (15.04.2016 um 14:20 Uhr)

Berechtigungen

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

12V Akku bauen