Forum: Compiler & IDEs Getaktete Übertragung


von Nicole F. (Gast)


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.

von nga (Gast)


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

von Nicole F. (Gast)


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
}

von Nicole F. (Gast)


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
}

von chris_ (Gast)


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.

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.