Getaktete Übertragung

Gast #4080866
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
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
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
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
>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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.