Getaktete Übertragung

Gast #4080866
Lesenswert?

Hallo,

ich hoffe es kann mir jemand helfen. Es besteht das Problem, das die 
unten stehende Funktion in einer Endlosschleife hängt, und ich kann mir 
nicht erklären warum das so ist. Es sollen lediglich 3 Bit taktgesteuert 
übermittelt werden. Mit PD3 takte ich, und mit PD2 übertrage ich die 
drei Bit
1
void sendData(unsigned char wert){
2
  char i;
3

4
  
5
  for(i=2;i>=0;i--)
6
  {
7
    
8
    PORTD &=~(1<<PD3);
9
    
10
    if((wert>>i) & 0x01 )
11
    PORTD |= (1<<PD2);
12
    else
13
    PORTD &=~(1<<PD2);
14
    
15
    uart_putc('F'); // Nur für Debug zwecke
16
    _delay_us(10);
17
    PORTD |= (1<<PD3);
18
    _delay_us(10);
19
    
20
  }
21
}


Aufruf
1
sendData(2);


Vielen vielen Dank im voraus für die Unterstützung.
Gast #4080874
Lesenswert?

Nicole F. schrieb:
> char i;
>
>
>   for(i=2;i>=0;i--)
>   {

Char hat einen Nachteil: es ist nicht festgelegt ob signed oder 
unsigned. Hier wohl unsigned und so eine zahl kann nicht kleiner als 0 
werden, oder anders gesagt: Sie ist immer größer/gleich 0!
Also entweder anders lösen oder signed char verwenden (würde ich nicht 
machen).
Besser sind die typen aus stdint.h oder inttypes.h, diese haben immer 
die gleiche Breite.

PS: noch was: die wilst keine shifts um eine variable, diese sind 
saumäßig langsam
Gast #4080906
Lesenswert?

Danke!

Jetzt klappt es.
Ist es so schneller/besser?
1
void sendData(unsigned char wert){
2
  char i;
3

4
  
5
  for(i=0;i<3;i++)
6
  {
7
    
8
    PORTD &=~(1<<PD3);
9
    
10
    if((wert & 0x04 ) > 0)
11
    PORTD |= (1<<PD2);
12
    else
13
    PORTD &=~(1<<PD2);
14
    
15
    uart_putc('Z'); // Nur für Debug zwecke
16
    _delay_us(10);
17
    PORTD |= (1<<PD3);
18
    _delay_us(10);
19
    
20
  }
21
}
Gast #4080917
Lesenswert?

Korrektur
1
void sendData(unsigned char wert){
2
  char i;
3

4
  
5
  for(i=0;i<3;i++)
6
  {
7
    
8
    PORTD &=~(1<<PD3);
9
    
10
    if((wert & 0x04 ) > 0)
11
    PORTD |= (1<<PD2);
12
    else
13
    PORTD &=~(1<<PD2);
14
        
15
    wert = (wert<<1);
16
    
17
    uart_putc('d'); // Nur für Debug zwecke
18
    _delay_us(10);
19
    PORTD |= (1<<PD3);
20
    _delay_us(10);
21
    
22
  }
23
}
Gast #4081579
Lesenswert?

>Char hat einen Nachteil: es ist nicht festgelegt ob signed oder
>unsigned.

Tja, darüber wird oft gestritten.
Für den GCC scheint zu gelten:

>For gcc, the default is signed, but you can modify that with >-funsigned-char. 
note: for gcc in Android NDK, the default is unsigned. >You can also explicitly 
ask for signed characters with -fsigned-char.

aus
http://stackoverflow.com/questions/2054939/is-char-signed-or-unsigned-by-default

Meiner Ansicht nach sollte man den Datentyp "char" bei einem 
Microctontroller sowieso nie verwenden.
Statt dessen immer:

#include "stdint.h"

und dann

uint8_t

oder

int8_t

das ist eindeutig. Sonst nichts.

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