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


von Steffen H. (avrsteffen)


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 ;-)

von (prx) A. K. (prx)


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.

von Flo (Gast)


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
    }
  }

von Steffen H. (avrsteffen)


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

von Steffen H. (avrsteffen)


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

von Flo (Gast)


Lesenswert?

Ne, das hab ich nur zur Verdeutlichung mitverändert :D

von Steffen H. (avrsteffen)


Lesenswert?

Ich werds gleich mal probieren

von Steffen H. (avrsteffen)


Lesenswert?

Ja super, so passt es.

Danke dir noch mal Flo!

Steffen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.