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
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.
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
> 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?
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)
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
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?
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
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.
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?
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
> //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.
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.
> 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)
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.
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.
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?
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.
Vielleicht ist Maxim ja auch dazu übergegangen, das einfach gleich in jedes Datenblatt zu drucken? =)
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?
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/
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.