16bit seriell in 16bit Variable auslesen

OP #1696515
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:
1
/* Function:  uint8_t CPLD_u8ReadKeys(void)
2
Description: serially reads one port value (1 bit) and compose result byte value */ 
3
uint8_t CPLD_u8ReadKeys(void)
4
{
5
  uint8_t u8Result;
6
  uint8_t u8Index;
7

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

16
  u8Result = 0;                           /* reset the return value */
17
  for (u8Index=0; u8Index < 8; u8Index++)
18
  {
19
    u8Result>>=1;
20
    PORTC |= (1<<CPLD_nSerCLK);            /* SerCLK = 1 */
21
    PORTC &= (~(1<<CPLD_nSerCLK));         /* SerCLK = 0 */
22
    u8Result |= PIND & (1<<CPLD_nSerDATA); /* Insert the port value to u8Result and shift left 1 position */
23
  }
24
  return (u8Result);
25
}

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 ;-)
Gast #1696525
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
    }
  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren