Forum: Mikrocontroller und Digitale Elektronik SPI 2Byte empfangen


von Tätglam (Gast)


Lesenswert?

Hy zusammen,

Ich bin gerade am Verzweifeln, also ich habe ein Atmega16 und ein 
tiny13. Der tiny13 sendet per SW-SPI 10bit AD-Wandler es kommen aber nur 
8bit an (ist auch klar), aber ich kann nur ADCH oder ADCL empfangen.
1
Datain1 = SPDR;      // ADCH
2
Dataout = (Datain1<<7)|Datain2;
3
Datain2 = SPDR;      // ADCL

Wollte Gerade den code testen, aber mein Programmer hat sich vom tisch 
verabschiedet und wird nicht mehr erkannt.

Funktioniert der Code?

MFG Tätglam

von Stefan P. (form)


Lesenswert?

Tätglam schrieb:
> Funktioniert der Code?

Nein, da SPDR am Anfang leer ist oder veraltete Daten enthält.
Du musst warscheinlich erst 8 dummy Bits SENDEN, damit er SPDR füllt.

von PittyJ (Gast)


Lesenswert?

Ich würde mit der Berechnung von Dataout warten, bis Datain1 und Datain2
gelesen sind.
Warum wird eigentlich um 7 Bit verschoben?

von Karl H. (kbuchegg)


Lesenswert?

Tätglam schrieb:

> Funktioniert der Code?

Welcher Code?
Das ist maximal eine grobe Übersichtsskizze eines Codes.

von Männel (Gast)


Lesenswert?

>Nein, da SPDR am Anfang leer ist oder veraltete Daten enthält.
>Du musst warscheinlich erst 8 dummy Bits SENDEN, damit er SPDR füllt.

Mit dem Dummy wert habe ich gar nicht gedacht. würde auf jedenfall 
hilfreich sein da der erste wert immer falsch ist und danach immer das 
richitge raus kommt.



>Ich würde mit der Berechnung von Dataout warten, bis Datain1 und Datain2
>gelesen sind.
>Warum wird eigentlich um 7 Bit verschoben?

Die berechnung später machen klappt nicht, denn Datain1 und Datain2 habe 
dann den letzten Inhalt von SPDR.

von Tätglam (Gast)


Lesenswert?

>Welcher Code?
>Das ist maximal eine grobe Übersichtsskizze eines Codes.

Habe nur den sende teil rein gesetzt, weil der Rest nur Deklarationen 
sind.

Hier mal den code:
1
volatile unsigned char status = 0;
2
DDRB |= (1<<PB1); //Ausgang
3
PORTB |= (1<<PB1); //High
4
_delay_ms(50);
5
SPCR = (1<<SPE); //SPI Erlauben
6
status = SPSR;  
7
     
8
PORTB &= ~(1<<PB1);//Setzte SS auf Low
9
Datain = SPDR;
10
11
PORTB |= (1<<PB1);//Setzte SS auf High
12
13
PORTB &= ~(1<<PB1);
14
    
15
usbMsgPtr = Buffer;
16
  
17
return sizeof(Buffer);

Mehr SPI einstellung habe ich nicht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tätglam schrieb:
> Mehr SPI einstellung habe ich nicht.
Du muss bei SPI erst mal was senden, bevor du was auslesen kannst. Denn 
Senden und Empfangen passiert bei SPI mit dem gleichen Mechanismus. SPI 
sind nur 2 hintereinander gekoppelte Schieberegister:
http://www.lothar-miller.de/s9y/categories/17-SPI

> Habe nur den sende teil rein gesetzt
1
   Datain = SPDR;
Senden geht genau andersrum...

> Hier mal den code:
Häng einfach mal den ganzen Code als Anhang mit dran...

von Tätglam (Gast)


Angehängte Dateien:

Lesenswert?

Danke für die Hilfe, habe aber etwas vergessen der Mega16 ist der Slave 
als HW-SPI und tiny als Master den eine Master SPI als Software fand ich 
einfacher und stabiler als SW-Slave.

Habe den Code angehängt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tätglam schrieb:
> Mega16 ist der Slave als HW-SPI
Aber auf der Empfängerseite hampelt man nicht mit dem SS herum. Denn das 
wird ja vom Master angesteuert, wenn er was übertragen will...

Tätglam schrieb:
> Habe den Code angehängt.
> sprintf( Buffer, "%2.3f",Volt);
Nicht ohne...
Dir ist schon klar, dass das ziemlich aufwendig ist? Und wenn dann der 
uC schon mit der USB-Nachbildung fast ausgelastet ist...

von Tätglam (Gast)


Lesenswert?

>Aber auf der Empfängerseite hampelt man nicht mit dem SS herum. Denn das
>wird ja vom Master angesteuert, wenn er was übertragen will...

Das weiss ich habe mir so ein zwischen ding gebastelt weil auf dem Tiny 
13 Port Mangel habe. Der Slave Aktiviert sich selbst durch ein anderen 
Port.

>Nicht ohne...
Hatte ich in einem anderen Porjekt schon drin dann habe ich es einfach 
übernommern und es passte vom Platz

von Täglam (Gast)


Lesenswert?

So lang ist her, habe aber mein Problem nicht gelöst.

Hatte zwischen zeitlich an ein SW_SPI empfang gedacht aber das ist genau 
so ein murks.

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.