SPI 2Byte empfangen

Gast #2604797
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
Gast #2604844
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.
Gast #2604984
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.
Moderator (Firma: Titel) Persönliche Seite #2605002
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...
Gast #2605028
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.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #2605040
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...
Gast #2605168
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren