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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.