Bitmanipulationsproblem

OP #4609069
Hallo zusammen

Ich habe eine Soft-SPI-Datenleitung, bei der ich das Eingangssignal(8 
Bit) auslesen möchte. Das Signal wird korrekt zum uC übertragen, jedoch 
weiss ich nicht, was ich in der Auswertung falsch mache, dass ich das 
Signal nicht richtig lese.

Datenpin ist auf PC1.
Clock auf PC0(der funktioniert)

Der Code:
1
// Switch Data pin to input
2
    DDRC &= ~(1<<SPI_SOFT_DATA);
3

4
    unsigned char data_buffer;
5
    
6
    // Receive the data byte
7
    for(loop = 0, mask = 0x80, data_buffer=0;loop<8;loop++,mask = mask >> 1;)
8
    {
9
        SPI_SOFT_CLK_HIGH();
10
        // If data input is high, set bit
11
        if(PORTC & 0x02)
12
            data_buffer |=  mask;
13

14
        SPI_SOFT_CLK_LOW();    
15
    }
16
    SPI_CSX_HIGH();
17
    // Switch Data pin to output
18
    DDRC |= (1<<SPI_SOFT_DATA);
19
    return data_buffer;

Ich hoffe, ihr könnt mir helfen, den Knoten zu lösen.

MfG
Persönliche Seite #4609097
Du solltest vor dem Durchlaufen Deiner Schleife sicherstellen, daß 
"data_buffer" mit 0 initialisiert ist. Da das eine automatische Variable 
zu sein scheint (d.h. sie liegt auf dem Stack), ist sie das nämlich 
nicht, und Du mischst Deine Nutzdaten mit dem "Rauschen", das da schon 
in der Variablen drinsteht.
Gast #4609114
TM F. schrieb:
> Ich hoffe, ihr könnt mir helfen, den Knoten zu lösen.

Vielleicht bist du zu schnell beim lesen - du sagst ja nicht welcher 
Baustein mit SPI das ist. Näheres steht im Datenblatt bzgl. des Timings.

Deine For-Schleife ist schrecklich unübersichtlich so.
Gast #4609124
Ja, du musst PINC lesen.
Ich finde, du solltest auch eine gewisse Zeit abwarten, zwischen dem 
Takt und dem Einlesen des Pins.

Vorschlag, um deine for-Schleife besser lesbar zu machen:
1
    uint8_t data_buffer=0;
2
    for(int i=0; i<8; i++)
3
    {
4
        SPI_SOFT_CLK_HIGH();
5
        _delay_us(1);
6
        data_buffer <<= 1;
7
        if(PINC & 0x02)
8
        {
9
            data_buffer+=1;
10
        }
11
        SPI_SOFT_CLK_LOW();    
12
    }

Aber das ist letztendlich Geschmackssache.
OP #4609134
Lothar M. schrieb:
> Mit hinreichender Wahrscheinlichkeit sollte es das PINC Register sein...

Mit der änderung von PORTC zu PINC funktioniert es.

Habe mich mal wieder selber gelinkt.

Stefan U. schrieb:
> Ich finde, du solltest auch eine gewisse Zeit abwarten, zwischen dem
> Takt und dem Einlesen des Pins.

Das Datenbit wird schon bei der fallenden Flanke des Clocks geschrieben, 
deshalb ist es nichts zeitkritisches.

Danke für die Antworten

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.