Forum: Compiler & IDEs Und wat is mit SPI


von Mathias H. (innovator)


Lesenswert?

Hallo alle zusammen,

ich hätt da mal ein Problem:
Ich habe eine Schaltung mit einem ATmega16 und einem 
Thermokonverterbaustein (Maxim MAX 6675), der mir Temperaturwerte von 
einem Thermoelement in Daten für eine SPI Verbindung umwandelt, 
erstellt. Nun habe ich das Datenblatt des ATmega und des Max6675 gewälzt 
und hätte trotz umfassender Daten ein paar Fragen bei denen ihr mir 
vielleicht helfen könntet:

- Wie wandelt man unter Verwendung von AVR Studio5 den Wert den man über 
den Bus erhält (gemeint ist dieser Zahlenwert im Register SPDR) in eine 
normale integerzahl um die man dann im Programm verwenden kann?

- Wie funktioniert die Netzwerkkommunikation zwischen meinem 
Thermokonverter und meinem µC wenn der Thermokonverter ein reiner Sender 
ist (nur MISO und kein MOSI am MAX6675)?

- Ist die Netzewerkkommunikation überhaupt möglich wenn ich den µC über 
den ATMEL AVRISP mkII programmiere bzw. stört sich das gegenseitig?

- Hat einer von euch vielleicht sogar ein Beispiel wie man diese 
Netzwerkkommunikation über SPI mit C programmiert für einen ATMEGA 16?

Für eure Hilfe wär ich euch sehr dankbar
mfg
Mathias

von Karl H. (kbuchegg)


Lesenswert?

Mathias Haspel schrieb:

> - Wie wandelt man unter Verwendung von AVR Studio5 den Wert den man über
> den Bus erhält (gemeint ist dieser Zahlenwert im Register SPDR) in eine
> normale integerzahl um die man dann im Programm verwenden kann?

Du holst dir vom MAX die 2 Bytes (du brauchst daher 2 SPI Transfers) und 
zerlegst die beiden Bytes so, wie es im Datenblatt die Bitzuordnung 
angibt.

> - Wie funktioniert die Netzwerkkommunikation zwischen meinem
> Thermokonverter und meinem µC wenn der Thermokonverter ein reiner Sender
> ist (nur MISO und kein MOSI am MAX6675)?

Dann schliesst du eben MOSI nicht an den MAX an.
Abgesehen davon funktioniert die Kommunikation völlig gleich. Der Mega 
sendet dann halt einfach ins Leere, wenn er sein Byte raustaktet.

> - Ist die Netzewerkkommunikation überhaupt möglich wenn ich den µC über
> den ATMEL AVRISP mkII programmiere bzw. stört sich das gegenseitig?

Der MAX hält ja die Klappe, solange seine /CS Leitung High ist.

> - Hat einer von euch vielleicht sogar ein Beispiel wie man diese
> Netzwerkkommunikation über SPI mit C programmiert für einen ATMEGA 16?

WO ist dein Ansatz?
Das ganze ist ziemlich trivial.

Aufpassen, wenn du Hardware-SPI benutzen willst, musst du den SS PIn auf 
jeden Fall auf Ausgang programmieren. Macht aber nichts, denn an diesen 
Pin kannst du dann gleich den /CS vom Max anhängen.

Ansonsten:
  Pins auf Eingang/Ausgang konfigurieren
  Register SPCR richtig konfigurieren
  Register SPSR konfigurieren

  Hintereinander 2 Dummy Bytes durch Zuweisen an SPDR versenden,
  wobei jeweil mit SPIF festgestellt wird, ob das Byte schon draussen
  ist. Nach dem versenden des jeweiligen Bytes wird die Rückantwort
  vom MAX aus SPDR abgeholt.

von Peter D. (peda)


Lesenswert?

Bei neueren AVRs (ATmega164) kann man auch eine der UARTs als SPI-Master 
verwenden.
Durch den Puffer kann man dann je 16Bit in einem Rutsch 
senden/empfangen.


Peter

von Mathias H. (innovator)


Lesenswert?

>   Hintereinander 2 Dummy Bytes durch Zuweisen an SPDR versenden,
>   wobei jeweils mit SPIF festgestellt wird, ob das Byte schon draussen
>   ist. Nach dem versenden des jeweiligen Bytes wird die Rückantwort
>   vom MAX aus SPDR abgeholt.

Warum muss ich 2 byte senden obwohl diese mangels MOSI doch nie am 
MAX6675ISA ankommen (und selbst könnte er sie doch nie verwenden da er 
ja ein reiner Sender ist) ?

Und weiß einer von euch vielleicht ein Beispiel wie sowas als C-Code 
aussieht?

von max-gast (Gast)


Lesenswert?

naja selbst etwas anstrengen wäre nicht schlecht...

ich würde dir mal raten das datenblatt vom AVR her zu nehmen und dir mal 
anzusehen wie SPI funktioniert, dann beantwortet sich die frage von 
selbst?
(kl. Hinweis du musst einen wert ins register schreiben damit der AVR 
anfängt zu clocken) du kannst natürlich auch eine software SPI nehmen 
dann kannst du die so machen das du keinen wert schreiben musst sondern 
einfach clockst bis die daten im RAM sind.

http://www.atmel.com/Images/doc2595.pdf

aber am besten ist die seite: http://www.gidf.de/
da kannst du dann selbst filter welches c example / tutrial du zum SPI 
mit AVR nimmst ;) (nicht böse sein aber in deiner fragestellung sehe ich 
nciht heraus das du dich bemühen willst, am liebsten wäres die 
wahrscheinlich wenn man dir den kompletten code für die auswertung mit 
dem MAX geben würde)

von max-gast (Gast)


Lesenswert?

außerdem hat dir eigentlich khb alles geschrieben!

von Mathias H. (innovator)


Lesenswert?

Soweit klar speziell das mit http://www.gidf.de/

aber habt ihr vielleicht einen Tipp wie ich das Ganze simulieren kann ? 
Denn die Debugfunktion bzw. der eingebaute AVR Simulator ist 
diesbezüglich ganz schön bescheiden

von Michael H. (michael_h45)


Lesenswert?

Mathias Haspel schrieb:
> Autor: Mathias Haspel (innovator)
                         ^^^^^^^^^
LOL

Alles ist schlecht, kompliziert und doof beschrieben... Oder aber, du 
hast einfach keine Ahnung und suchst einen Sündenbock. Der Rest der Welt 
kommt nämlich recht gut mit den Gegebenheiten klar.

Wenn du was "simulieren" willst, nimm je zwei Schieberegister 74HC595 
und 74HC165, schließ sie an wie unter AVR-Tutorial: Schieberegister 
beschrieben und häng LEDs an die Ausgänge und Taster an die Eingänge.

Was hast du denn bisher schon?
Kann es sein, dass du "keine Ahnung" als Argument vorschützt, nicht 
anfangen zu müssen?

von Mathias H. (innovator)


Lesenswert?

Michael H. schrieb:
> Mathias Haspel schrieb:
>> Autor: Mathias Haspel (innovator)
>                          ^^^^^^^^^
> LOL
>
> Alles ist schlecht, kompliziert und doof beschrieben... Oder aber, du
> hast einfach keine Ahnung und suchst einen Sündenbock. Der Rest der Welt
> kommt nämlich recht gut mit den Gegebenheiten klar.
>
> Wenn du was "simulieren" willst, nimm je zwei Schieberegister 74HC595
> und 74HC165, schließ sie an wie unter AVR-Tutorial: Schieberegister
> beschrieben und häng LEDs an die Ausgänge und Taster an die Eingänge.
>
> Was hast du denn bisher schon?
> Kann es sein, dass du "keine Ahnung" als Argument vorschützt, nicht
> anfangen zu müssen?

Eigentlich dachte ich mehr an eine Software mit deren Hilfe ich die 
Kommunikation auf dem SPI SIMULIEREN (nicht als Hardwareaufbau) kann, 
und ich such auch keinen Sündenbock, es ist nur so dass mehr die 
Hardware meine Stärke (die Stärke anderer Leute scheint es zu sein einen 
Anfänger im µC Programmieren runter zu machen) ist.
Für konstruktive Hilfe bin natürlich sehr dankbar.

PS: Auch wenn manche über den von mir gewählten Nickname lachen, sie 
sollten mal vor ihrer eigenen Tür kehren den nicht jeder Nickname ist 
ein Ausdruck uneingeschränkter Intelligenz auch den die Lacher das zu 
meinen scheinen

von Michael H. (michael_h45)


Lesenswert?

okay... alles schön und gut.
aber es bleibt diese frage:
Michael H. schrieb:
> Was hast du denn bisher schon?

wenn du einfach mal anfangen würdest, würdest du schnell merken, wie 
einfach das ist.
das interface zur spi im avr ist SEHR hardware-nah. wenn du sagst, dass 
hardware eher dein gebiet ist, schau dir doch das 
funktions-block-diagramm an. das IST hardware.
und den ablauf der software hast du hier sogar auch schon schritt für 
schritt aufgesagt bekommen.

daher nochmal: fang doch einfach an.
hier im forum hilft dir jeder gern bei konkreten problemen.
wenn einer nur "wie gehtn dat?" schreit, ohne den anschein zu machen, 
sich selbst schon bemüht zu haben, kommen halt antworten wie meine.

von Mathias H. (innovator)


Angehängte Dateien:

Lesenswert?

Hier hab ich mal ein Stück des Programmcodes den ich mir jetzt aus 
Internetquellen und Atmel Datenblatt zusammengebastelt habe. Meine Frage 
ist nun wenn ich testen will ob der Code beim Debugging funktioniert wie 
muss ich dann Vorgehen. Denn wenn ich dieses Unterprogramm zusammen mit 
den restlichen Programmteilen mit dem in AvR Studio 5 eingebauten AVR 
Simulator im Debugging mode starte so kann ich alles durchsteppen sehe 
jedoch nicht ob das Programm in der Lage ist etwas von meinem Netzwerk 
zu erhalten.

Gibt es irgend eine Möglichkeit, vielleicht im IO View wo man ja auch 
die PORTs und zumindest die Register des SPI beobachten kann, 
irgendwelche Probewerte zu generieren oder wenigstens zu sehen wie sich 
der simulierte ATMega16 seine Werte holt?

von Mathias H. (innovator)


Lesenswert?

Und dann hätt ich noch ein kleines Problem das sich wahrscheinlich 
einfach lösen lässt: Wie wandle ich den Wert (ein 2byte char) den ich 
über das SPI bekomme am besten in eine Integerzahl um? Ist der 
castbefehldafür geeignet? z.b. mit:

char temp;
tempChar=SPDR;  //Wert vom Netzwerk


tempInt=(int)tempChar; //Umwandlung des Werts in eine Integerzahl 
//zur weiteren Verarbeitung

von Karl H. (kbuchegg)


Lesenswert?

>   //Initialisierung des AtMega 16 als Slave
>     DDRB=(1<<DDB6);


Nachdenken!

Wieso Slave?
Der Mega ist der Master. Der sagt wo es lang geht und der Max hat zu 
gehorchen.
Immer der, der den Bustakt erzeugt, das ist der Master. Und das ist in 
allen Fällen der Mega. Er muss den Bustakt erzeugen, der den MAX dazu 
befähigt seine Daten rauszuclocken.

von Karl H. (kbuchegg)


Lesenswert?

Ich seh auch nicht, wo du dem MAX den CS Pin mal auf Low ziehen würdest, 
damit sich der vom Takt auch angesprochen fühlen würde.

von Karl H. (kbuchegg)


Lesenswert?

>    actualTemp=SPDR;
>  return actualTemp ;

Das sind dann aber erst 8 Bit.
Der MAX hat aber 16 Bit für dich. D.h. du musst dir noch ein 2-tes Byte 
holen, ehe du dann den CS wieder auf High gehen lässt (was du noch nicht 
hast)

von Karl H. (kbuchegg)


Lesenswert?

Mathias Haspel schrieb:

> einfach lösen lässt: Wie wandle ich den Wert (ein 2byte char) den ich
> über das SPI bekomme am besten in eine Integerzahl um? Ist der
                       *********

Welche Methoden kennst du denn? :-)
('Am besten' impliziert immer, dass der Frager ein paar Methoden zur 
Auswahl hat, sich aber unschlüssig ist, welche er nehmen soll. Leider 
hat sich eingebürgert, dass hier im Forum immer nach 'dem Besten' 
gefragt wird, wenn die Frage in Wirklichkeit heißt: Hilfe, ich hab 
keinen blassen Schimmer wie das überhaupt geht. D.h. die Frage nach 'der 
besten' Methode stellt sich noch gar nicht. Es ist sinnlos nach der 
'besten Methode am Fahrrad zu sitzen' zu fragen, wenn ich gar nicht 
Fahrrad fahren kann)

> char temp;
> tempChar=SPDR;  //Wert vom Netzwerk
>
>
> tempInt=(int)tempChar; //Umwandlung des Werts in eine Integerzahl
> //zur weiteren Verarbeitung

Das bringt dir nichts. Auch ein char ist im Grunde nichts anderes als 
eine Variable mit der man rechnen kann. (Auch wenn das char heißt und 
irgendwie mit Zeichenverarbeitung in Verbindung gebracht wird. In C ist 
ein char eine Variable zur speicherung kleiner Zahlen)

* Du willst beim Arbeiten mit Bits und Bytes NIEMALS einfach nur
  mit 'char' arbeiten.
  Du willst aber immer mit entweder 'unsigned char' oder 'signed char'
  arbeiten. Und wenn es um Bytes geht, dann ist 'unsigned char' das
  was du willst.

  Und dafür gibt es auch Abkürzungen: uint8_t ist ein unsigned Wert
  mit 8 Bit.
  Das ist genau das was du hier willst, um jedes der beiden Bytes
  welches du vom MAX bekommst erst mal zwischenzuspeichern.

  UNd dann muss man die beiden Bytes zusammensetzen zu einem int.

von Michael H. (michael_h45)


Lesenswert?

Mathias Haspel schrieb:
> Hier hab ich mal ein Stück des Programmcodes den ich mir jetzt aus
> Internetquellen und Atmel Datenblatt zusammengebastelt habe.
Ein guter Anfang.
Folgende Fehler:
- der avr muss Master am Bus sein. NUR der Master erzeugt Clock. Der 
Teilnehmer am Bus, dessen Slave-Select Leitung aktiviert ist, schiebt 
dann Daten im Takt des Masters in Richtung Master.
- du musst die SPI nur ein mal initialisieren. Die Control-Register 
verlieren ihren Wert erst beim Reset.

Vorschläge (keine fehler!):
- anstatt die Funktion zwei mal aufzurufen, hol dir doch gleich 2 bytes 
innerhalb der Funktion.
- warum cli()? Und v.a. warum cli() ohne sei()?

Mathias Haspel schrieb:
> Meine Frage
> ist nun wenn ich testen will ob der Code beim Debugging funktioniert
Hast du gar keine Hardware zum Testen?

Mathias Haspel schrieb:
> tempInt=(int)tempChar; //Umwandlung des Werts in eine Integerzahl
> //zur weiteren Verarbeitung
Ein char und ein int sind beides integer-Typen. Sie unterscheiden sich 
nur in der Breite. Ein Char ist 8 Bit breit, ein Int hier 16.
Du machst Folgendes:
int data_int = 0;
data_int = (data_byte1 << 8) | data_byte0;
|........|........|
|  byte1 | byte0  |

daraus wird dann:

|................|
|      int       |

VORSICHT aber bei signed Variablen. Hier nimmst du NUR unsigned.

von Mathias H. (innovator)


Lesenswert?

Nur mal ob ich das richtig verstanden hab: ich lass diesen Ablauf zum 
holen der Daten das erste mal durchlaufen und bekomme byte0 dann ein 
zweites mal und ich krieg byte1 dann verbinde ich das mittels der 
Bitschieberei wie beschrieben und erhalte dann einen unsigned int wert 
richtig?
leider hab ich noch keine Hardware die ist erst bestellt deshalb dacht 
ich ja auch ob Simulatoren für ATMegas so gut sind dass ich damit die 
Netzwerkkomunikation einmal "im Trockenen" ablaufen lassen. Außerdem 
kann ich mit meinem AVRISP mkII ja leider keine Werte aus dem laufenden 
Betrieb des ATMega16 nehmen oder geht sowas ohne AVR Dragon oder JTAGICE 
3 bzw. JTAGICE mkII auch?

von Christian B. (luckyfu)


Lesenswert?

nunja, wenn du hast kannst du einen freien Port mit LED's bestücken und 
somit zumindest 1 Byte verfolgen.

Ansonsten brauchst du einen der angesprochenen JTAG debugger, damit 
kannst du dir die aktuell vorhandenen Werte ansehen.

von Peter D. (peda)


Lesenswert?

Der MAX6675 ist aber:
All versions are Not Recommended for New Designs.


Peter

von Michael H. (michael_h45)


Lesenswert?

Vielleicht ist Maxim ja auch dazu übergegangen, das einfach gleich in 
jedes Datenblatt zu drucken? =)

von Mathias H. (innovator)


Lesenswert?

Peter Dannegger schrieb:
> Der MAX6675 ist aber:
> All versions are Not Recommended for New Designs.
>
>
> Peter

Wenn dieses Not Recommended for new designs bei einem Produkt steht wie 
lang ist denn dann das noch zu kaufen ein Jahr? zwei Jahre? oder gibts 
nur noch Lagerbestände?

von maxim (Gast)


Lesenswert?

Mathias Haspel schrieb:
> Wenn dieses Not Recommended for new designs bei einem Produkt steht wie
> lang ist denn dann das noch zu kaufen ein Jahr? zwei Jahre? oder gibts
> nur noch Lagerbestände?

A product that is NRND (Not Recommended for New Designs) is in 
production and available, with no obsolescence scheduled. However, we 
recommend against using these parts for new designs because there are 
better or more economical alternatives, or because demand for the part 
is decreasing. We list alternatives when possible. For additional 
assistance in alternative designs, please contact technical support.
http://www.maxim-ic.com/products/nla/

von Karl H. (kbuchegg)


Lesenswert?

Christian B. schrieb:

> Ansonsten brauchst du einen der angesprochenen JTAG debugger, damit
> kannst du dir die aktuell vorhandenen Werte ansehen.

Bringt dir im gegenständlichen Fall allerdings auch nicht viel. Denn in 
dem Moment, indem an SPDR zugewiesen wird, taktet die Hardware das Byte 
mit FullSpeed raus. D.h. der Informationsgewinn durch den JTAG Debugger, 
was den externen Ablauf einer SPI angeht, tendiert gegen 0.

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.