Forum: Mikrocontroller und Digitale Elektronik Bytefolge lesen


von spi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich bekomme aus einem IC ein jeweils demoduliertes Byte. Auf dem 
Foto ist ein FSK Signal zu sehen (grün), blau ist ein Carrier Detect 
Signal, was quasi als Select verwendet wird, lila das daraufhin vom IC 
(ist Master) erzeugte Taktsignal, gelb Daten. Empfänger ist ein Atmega 
1284 im SPI Slave Modus. Clk idle low, Daten auf rising edge.

Das Problem ist, dass die Bytes nicht richtig vom SPI gelesen werden. Da 
kommt nur selstsamer murks raus. Sende ich z.B. die Folge 
33333333333333333333 kommt 3pÌ3pÎÃ8ÎÆpÎÆpÎ an. Ich lese die Bytes so 
ein:
1
CLRREG_DATA  // IC Datenempfang aktivieren
2
SETRXTX
3
int i=0;
4
int k=0;
5
char rec[21];  // Empfangsspeicher                  
6
SPION  // SPCR |= (1<<SPE);
7
do {                     
8
   while (PINB & (1<<CD_PD));   // auf Carrier Detect low warten
9
   rec[k]=spi_slave_receive(); // Byte empfangen und speichern                       
10
   k++;  
11
   } while(k<21);  // empfängt 20 Zeichen am Stück
12
   for (int l=0;l<k;l++)  // Terminalausgabe
13
   {
14
      uart_putc(rec[l]);
15
   }
16
}
17
        
18
char spi_slave_receive(void)
19
{
20
/* Wait for reception complete */
21
while(!(SPSR & (1<<SPIF)));
22
/* Return Data Register */
23
return SPDR;
24
}

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

wie erzeugst du das Taktsignal?

Sascha

von spi (Gast)


Lesenswert?

Das wird vom IC selbst erzeugt. Ich habe das Problem auch schon 
eingegrenzt. Und zwar demoduliert der IC immer etwas weiter als 8 Bit, 
also hier z.B. 2 weitere Bit, die dann schon im nächsten gelesenen Byte 
am Anfang stehen. Dadurch verschiebt sich alles weitere. Man muss also 
den SPI deaktivieren, damit alles resettet wird.

von J.-u. G. (juwe)


Lesenswert?

spi schrieb:
> Und zwar demoduliert der IC immer etwas weiter als 8 Bit,
> also hier z.B. 2 weitere Bit, die dann schon im nächsten gelesenen Byte
> am Anfang stehen. Dadurch verschiebt sich alles weitere. Man muss also
> den SPI deaktivieren, damit alles resettet wird.

Sollen die zwei zusätzlichen Bits verworfen oder weiterverwendet werden?

von spi (Gast)


Lesenswert?

Nein die sollen verworfen werden, da das quasi demoduliertes Rauschen 
ist,

von Sascha W. (sascha-w)


Lesenswert?

ja dann müsstest du die SPI nach dem Empfangen eines Bytes abschalten. 
Wenn du mehrere Bytes nacheinander sendest, wie groß sind dann die 
Zwischenabstände, oder kommen die Daten dann sauber nacheinander?
Nächstes Problem - wie lange dauert die Übertragung eines Bytes? Und wie 
lange die Ausgabe des selben über UART? Wenn der UART langsamer ist, 
dann werden die Daten im SPI verpfuscht, da du sie nicht rechtzeitig 
auslesen kannst. Da ist der ATMega als Slave eben nicht optimal, da die 
SPI-Einheit keinen Puffer hat. Evl. den SPI-Interrupt nutzen um die 
Daten zügig abzuholen.

Sascha

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.