mikrocontroller.net

Forum: Compiler & IDEs 16bit seriell in 16bit Variable auslesen


Autor: Steffen H. (avrsteffen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Forum Gemeinde

Ich möchte in eine 16bit Variable meine Tasterzustände speichern. Die 
Tasterzustände kommen bei mir an PORTD Pin7 (SER_Data) seriell an. Für 
8bit funktioniert das alles auch.

Siehe:
/* Function:  uint8_t CPLD_u8ReadKeys(void)
Description: serially reads one port value (1 bit) and compose result byte value */ 
uint8_t CPLD_u8ReadKeys(void)
{
  uint8_t u8Result;
  uint8_t u8Index;

  DDRC  |= (1<<CPLD_nSerCLK);             /* SerCLK as output */
  DDRC  |= (1<<CPLD_nSerEN);              /* SerEN as output */
  DDRC  |= (1<<CPLD_nSerRDWR);            /* SerRDWR as output */
  DDRD  &= (~(1<<CPLD_nSerDATA));         /* SerDATA as input */
  PORTC &= (~(1<<CPLD_nSerRDWR));         /* RDWR=0, read from CPLD operation */
  PORTC |= (1<<CPLD_nSerEN);              /* EN=1, serial clock disabled, read keys to parallel register */
  PORTC &= (~(1<<CPLD_nSerEN));           /* EN=0, serial clock enabled */

  u8Result = 0;                           /* reset the return value */
  for (u8Index=0; u8Index < 8; u8Index++)
  {
    u8Result>>=1;
    PORTC |= (1<<CPLD_nSerCLK);            /* SerCLK = 1 */
    PORTC &= (~(1<<CPLD_nSerCLK));         /* SerCLK = 0 */
    u8Result |= PIND & (1<<CPLD_nSerDATA); /* Insert the port value to u8Result and shift left 1 position */
  }
  return (u8Result);
}

Jetz habe ich u8Result auch schon in u16Result (uint16_t) und uint8_t 
CPLD_u8ReadKeys(void) in uint16_t CPLD_u16ReadKeys() umgeschrieben. 
Natürlich auch den Index bis 16 zählen lassen. Nur funktioniert das 
einlesen der 8bit in die 16bit Variable Result nicht.

Wie mach ich falsch?

Gruß Steffen
=> blutiger C-Anfänger, also seid bitte nicht so hart zu mir ;-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das funktioniert schon vorher nur deshalb, weil es Bit 7 vom Port ist. 
Dein Schema würde bei 16 Bits nur mit Bit 15 vom Port funktionieren.

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen H. schrieb:
> u8Result>>=1;
>     PORTC |= (1<<CPLD_nSerCLK);            /* SerCLK = 1 */
>     PORTC &= (~(1<<CPLD_nSerCLK));         /* SerCLK = 0 */
>     u8Result |= PIND & (1<<CPLD_nSerDATA); /* Insert the port value to u8Result 
and shift left 1 position */


shift left und u8Result>>=1 passen irgendwie nicht zusammen, sollte wohl 
eher
u8Result<<=1 heißen, oder?

Außerdem, der Ausdruck
PIND & (1<<CPLD_nSerDATA)
sieht bei einer empfangenen 1 binär so aus: 10000000, sprich, du 
überschreibst die siebte Bitposition im im Result, was bei 8-Bit-Werten 
mit Rechtsschieben klappt (siehe deine Funktion).
Bei 16 Bit fügst du mit dieser Zeile aber mitten ins Ergebnis das 
seriell empfangene ein.

Würde dir empfehlen, es so in die Schleife zu schreiben:

  for (u16Index=0; u16Index < 16; u16Index++)
  {
    u16Result<<=1;    //linksschieben
    PORTC |= (1<<CPLD_nSerCLK);           //takten
    PORTC &= (~(1<<CPLD_nSerCLK));
    if(PIND & (1<<CPLD_nSerDATA))
    {
      u16Result |= 1;           //Wenn 1 ankommt, Bit0 in Result auf 1 
setzen
    }
  }

Autor: Steffen H. (avrsteffen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß. Nur muss es doch eine Möglichkeit geben jetzt auch 16bit 
einzulesen.

Übrigens hab ich mich verschrieben.

Es sollte "16bit seriell in 16bit Variable einlesen" heißen!

Steffen

Autor: Steffen H. (avrsteffen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das könnte die Lösung sein. Danke!

Ich frag einfach ab, ob empfangene SER_Data eine "1" ist und verodere 
diese im LSB des u16Result's.

Hab ich das jetzt richtig verstanden?

Nur Index muss doch nicht 16bit sein, oder?

Steffen

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne, das hab ich nur zur Verdeutlichung mitverändert :D

Autor: Steffen H. (avrsteffen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich werds gleich mal probieren

Autor: Steffen H. (avrsteffen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja super, so passt es.

Danke dir noch mal Flo!

Steffen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.