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