Hi, ich bin hier langsam am verzweifeln. Ich versuche eine einfache Kommunikation mit dem rfm69 Funkmodul per spi hinzubekommen. Hier ist der Code um den es geht (ohne UART Teil) [1]. Schreiben geht, lesen manchmal. Oft bleibt der µC beim Lesen hängen. Ab und zu wird etwas ausgelesen und dann auch ab und zu der richtige Wert. Leider aber oft auch ein falscher Wert. Kann mir jemand bitte sagen woran das liegen kann? Frequenz ist richtig gesetzt. [1] http://pastebin.com/RSGr9wWx
while(!(SPDR & (1<<SPIF))); Wenn man da SPCR eingibt könnte es klappen;)
Moin, jo auch schon bemerkt, die Nach war zu lang gestern :D. Jetzt klappt das auslesen, aber er gibt immer 255 zurück. Egal was ich rein schreibe.
Ok ich brauch glaub ich mal generell Hilfe beim Typ umwandeln... Ich hab da also diese beiden Funktionen welche Daten mittels UART übertragen [1]. Funktioniert auch! Dann ist da die SPI Funktion welche so aussieht [2]. spi_transfer gibt ja einen Wert vom Typ unsigned int zurück. Das ist doch richtig, weil SPDR auch von diesem Typ ist?! Reicht es dann einfach mittel itoa den Wert umzuwandeln? Ich habe das Gefühl die Zielvariable läuft über, es kommt bei jeder Abfrage 255 raus. Wie würdet ihr den Rückgabewert von spi_transfer an die UART Funktion senden? [1] http://pastebin.com/svyn1ppD [2] http://pastebin.com/VizP7jmt
1. Zu wissen, welcher Controller verwendet wird, wäre hilfreich. 2. In deinen Quellcodes fehlen mir die include-Direktiven. Was ist alles eingebunden? 3. Wo ist die UART-Initialisierung?
Hi, - was ist mit dem NSS-Eingang vom RFM69 ? Ist der auf 0? - was passiert, wenn du den RFM69 zunächst mal abklemmt und MISO mit MOSI am mega16 verbindest? Kommt dann der rausgesendete Wert zurück?
marabou schrieb: > spi_transfer gibt ja einen Wert vom Typ unsigned int zurück. > Das ist doch richtig, weil SPDR auch von diesem Typ ist?! nein, Rückgabetyp ist uint8_t >Reicht es dann einfach mittel itoa den Wert umzuwandeln? ja >Ich habe das Gefühl die Zielvariable läuft über, es kommt bei jeder >Abfrage 255 raus. Ich habe eher das Gefühl, der rfm69 antwortet einfach nicht z.B. weil NSS nicht 0 ist oder weil du ein unsinniges Register ansprichst.
Moin, also das Register was ich anspreche ist schon richtig: 0x2F. Steht auch so in diversen anderen Libs. NSS ist an PD7, sieht für mich richtig aus. Das mit Miso direkt an Mosi ohne was dazwischen klingt interessant. Muss ich dann den SS Pin am µC entsprechend dem NSS schalten?
>Das mit Miso direkt an Mosi ohne was dazwischen klingt interessant. >Muss ich dann den SS Pin am µC entsprechend dem NSS schalten? Nein.
Hmm. Ich hab deinen Code mal genommen, für mega644p angepasst und mit einem RFM69 getestet. Bei mir funktioniert's. Der einzige Unterschied zu deinem Code ist der, dass ich als SS-Pin den dafür vorgesehenen PB4 verwendet und weiteren Debug-Output eingebaut habe. Und da über SPI und nicht über JTAG programmiere: Entweder RFM69 ( bei der Programmierung ) bzw. SPI-Connector ( beim Rennen ) abziehen. Code und Output im Anhang. Betreibst du beide ( ATmega16 (5V) und RFM69 (3V3) ) innerhalb der spezifizierten Versorgungsspannung ?
@marabou hast du den SS-Pin als Ausgang definiert? Im SPI-Master-Mode muss der Pin ein Ausgang sein, da sich mit entsprechendem Pegel oder offenem Pin die Betriebsart wieder in Slave-Mode ändert. Sascha
@Sascha nein hatte ich nicht. Hab jetzt den code von Rainer, danke schon mal, ausprobiert. Ausgabe: -----Begin------ Out: af In: 00 Out: 55 In: 00 Out: 2f In: 00 Out: 00 In: 00 Register 0x2f=00 Hab die Stellen für meinen µC natürlich angepasst. Keine Ahnung was falsch ist. Hab 2 Funkmodule getestet. Für den µC hab ich stabile 5V und für das Funkmodul 3.3V (gemessen). Hab auch schon die Kontakte am Modul bis zum Ende der Leitung getestet da ist auch alles OK.
Hm Ok, MISO und MOSI vom µC verbunden zeigt mir das richtige an. Das scheint also zu gehen. Was kann denn dann am Funkmodul falsch sein? Ich hab nur 3.3V, beide GND und eben die SPI Pins verbunden. (Ja, auch den SS Pin). Programmiergerät ist abgezogen.
Wenn permanent und reproduzierbar über die MISO-Leitung 0 reinkommt, dann zieht die jmd permanent auf 0. Hast du die Schaltung zur Hand? Speziell die Level-Shifter-Mimik zw. 3,3 und 5V, die du verwendest. Was sagt der Output, wenn du MISO und MOSI miteinander verbindest, einmal auf der 5V-Seite und dann nochmal auf der 3V3-Seite. Das sollte rauskommen, in beiden Fällen: Out: af In: af Out: 55 In: 55 Out: 2f In: 2f Out: 00 In: 00 Register 0x2f=00
Hier ist mal die Verkabelung.
Ich konnte auf die Schnelle kein Partfile für das Funkmodul finden daher
nur ein Kasten.
Ich verwende je einen Spannungsregler für 5V und für 3.3V.
Eigentlich alles recht simpel.
Was meinst du mit
>einmal auf der 5V-Seite und dann nochmal auf der 3V3-Seite
Ich hab doch nur eine µC Seite.
Ah shit vergessen. Ich hab die Kondensatoren an den Spannungsreglern nicht eingezeichnet. Und die Titelbezeichnung der Parts stimmt nicht 100%. Sollte aber keine Rolle spielen.
marabou schrieb: > Ah shit vergessen. Ich hab die Kondensatoren an den Spannungsreglern > nicht eingezeichnet. Und die Titelbezeichnung der Parts stimmt nicht > 100%. Sollte aber keine Rolle spielen. Wenn das Schaltbild tatsächlich so umgesetzt ist, dann stimmt noch mehr nicht. SCK ist fest auf GND gezogen? Der 5V-Controller ist ohne jeglichen Pegelwandler bzw. ohne strombegrenzende Widerstände mit dem 3,3V-Funkmodul verbunden? Das ist nicht dein Ernst, oder?
Hm das sieht im Schaltplan anders aus als im Bild, SCK ist natürlich nicht auf GND, die Leitung geht nur da oben lang. Sorry für die Missverständnisse. Widerstände hab ich auch nicht drin... Ich werde heute Abend mal ein neues, vollständiges Bild hochladen.
marabou schrieb: > Widerstände hab ich auch nicht drin... Das heißt, die Ausgänge vom Mikrocontroller sind direkt mit den Eingängen des Funkmoduls verbunden und umgekehrt? Dann hättest du folgende Szenarien: Die Ausgänge des Mikrocontrollers liegen, wenn sie gesetzt sind, auf 5 V, das Funkmodul verträgt an seinen Eingängen aber maximal seine eigene Versorgungsspannung von 3,3 V. Somit baust du hier einen niederohmigen Kurzschluss zwischen 5 V und 3,3 V und Schäden an mindestens einem der beiden Bauteile wären die Folge. Widerstände in den Leitungen würden zumindest den Strom begrenzen, ein echter Pegelwandler wäre natürlich die Premiumlösung. Die Ausgänge des Funkmoduls liegen, wenn sie gesetzt sind auf maximal 3,3 V, da der Hersteller aber im Datenblatt nur 90% der Versorgungsspannung garantiert, können es auch mal weniger als 3 V sein, was weniger 60% der Versorgungsspannung des Mikrocontrollers entspricht. Unterhalb dieser 60% ist nicht mehr garantiert, dass der Controller den Pegel als 1 erkennt. Kaputt wird in dieser Richtung nichts gehen, womöglich wird es aber nicht funktionieren.
... um diese Fehlerquellen auszuschließen, würde ich zumindest MOSI und SCK mit einem Spannungsteiler aus zwei Widerständen auf 3,3V zum RFM69 hin anpassen (obwohl ich glaube, dass der 5V-tolerant ist) und MISO mit Pegelwandler zum mega hin auf 5V-Level bringen. Beispielschaltungen hier: http://www.mikrocontroller.net/articles/Pegelwandler
Rainer B. schrieb: > ... um diese Fehlerquellen auszuschließen, würde ich zumindest MOSI und > SCK mit einem Spannungsteiler aus zwei Widerständen auf 3,3V zum RFM69 > hin anpassen (obwohl ich glaube, dass der 5V-tolerant ist) und MISO mit > Pegelwandler zum mega hin auf 5V-Level bringen. > > Beispielschaltungen hier: > http://www.mikrocontroller.net/articles/Pegelwandler Es ist nirgends vermerkt, dass das RFM69 5V-tolerant ist. Worauf stützt sich dein Glaube?
Stützt sich aufs Manual, hier ist im Abschnitt "Digital Inputs" kein max. Wert für Vih angegeben. Aber Versuch macht klug: Betreibt man das RFM69 so, wie der TO das oben angegeben hat, kommt genau der oben beschriebene Müll raus. In einer 3,3V-Umgebung funktionierts dann wieder normal. D.h. aus elektrischer Sicht ist's 5V-tolerant aus funktionaler Sicht eher nicht ;-).
Also vielen Dank für eure Hilfe. Pegelwandler habe ich nicht hier, aber bestellt. Mir ist aber aufgefallen, dass ich noch einen atmega16L habe. Der funktioniert mit 3.3V. Ausgetauscht, neu verkabelt und es geht tatsächlich... Logisch ist es allerdings habe ich darüber gar nicht nachgedacht weil das Funkmodul in anderen Schaltungen immer direkt am µC war. Das waren aber alles Arduinos welche mit 3.3V arbeiten. Also nochmal Danke und ich teste jetzt weiter.
Hallo, die letzten Wochen war wenig Zeit zum testen aber nun hab ich folgenden Stand: Die Register werden richtig geschrieben und gelesen aber es kommt trotzdem keine Datenübertragung zustande. Auf richtige Node und Netzwerk ID etc. habe ich geachtet. Hab das ganze auch noch mal an je einem raspberry ausprobiert (mit anderer Lib) und da geht es genau so wenig. Mir fehlt da jetzt ein bisschen der Ansatz zum Debuggen. Ich kann ja schlecht in die Bauteile reinschauen. Hat jemand einen Tipp wie ich rausfinden kann was nun schon wieder klemmt?
Nur mal so ins Blaue, ohne deinen Code zu kennen: a) Code posten b) Antennenlänge passt ? c) Empfänger-Bandbreite hochsetzen d) mit RSSI-Threshold experimentieren und RSSI auf DIOx legen oder aus Statusregister auslesen, um festzustellen, ob überhaupt was ankommt.
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.