Hallo liebe Community, ich habe folgendes Problem. Oben seht Ihr meine
Beschaltung des Radiochips SI4735. Die Steuerleitungen gehen Links zum
Atmega8. Mit einem I2C Busscanner findet der Atmega den Radiochip auf
Adresse 34. Soweit alles in Ordnung. Wenn ich jetzt aber einen
automatischen Sendersuchlauf starte, Steht im Display sowohl für
Frequenz, als auch für RSSI und SNR eine 0.
Also sind die Register leer denke ich mal.
Aus dem Lautsprecher kommt nur rauschen.
Der Chip findet einfach keine sinnvollen Frequenzen.
Hier der Code, den ich für den automatischen Suchlauf verwende. Laut
Datenblatt des SI sollten die Befehle die richtigen sein.
1
Sub Aufwaertssuche()
2
I2cstart ' I2C Kommunikation aufbauen
3
I2cwbyte 34 ' I2C Adresse vom SI4735 schreiben
4
I2cwbyte &H21 ' FM_Seek_Start Command
5
I2cwbyte &H0C ' Seek up and Wrap
6
I2cstop ' I2C Kommunikation abbauen
Vielleicht weiss ja einer von Euch woran das liegen kann, ich bin so
langsam am Verzweifeln.
Vielen Dank im Voraus schonmal
mfg
Da kann an so vielen Dingen liegen...
Ist hardwareseitig alles richtig angeschlossen? Was ist mit "erst mal
nicht aufgebaut?
Ich kenne jetzt die Details nicht, aber Du wirst die Befehle schon
richtig abgetippt haben. Bleibt noch BASCOM I2C. Wie initialisierst Du
I2C?
Ansonsten gibt es hier einen funktionierenden Code:
http://www.elektronik-labor.de/AVR/Heimradio2.html
Und hier einen Schaltplan:
http://www.elexs.de/SI4735h.html
Die I2C Initialisierung klappt, sonst würde der Chip ja nicht antworten
und das Programm würde sich aufhängen. Und per I2C Scanner ( Scannt alle
I2C Adressen ab und wartet auf Antwort von den Slaves) antwortet der SI
ja mit seiner Adresse (34). Daher gehe ich davon aus, dass die I2C
Kommunikation klappt.
Erstmal nicht aufgebaut heisst einfach nur, dass ich vorerst nur FM
testen will und AM aussen vor lasse. An diesem Projekt aus dem ELEXS
habe ich mich orientiert.
Ich habe die Anschlüsse am Radiochip bzw am Sockel dafür mehrfach
durchgeklingelt und kontrolliert. Alles richtig verdrahtet.
Ich merk schon, das ist garnicht so einfach, ich dachte vielleicht hatte
jemand das gleiche oder ähnliche Problem schonmal mit dem SI Chip
Vielen Dank aber schonmal für die schnelle Antwort
mfg
Ich stelle gelegentlich Probleme fest (insbesondere bei
Lochrasteraufbauten), wenn ich (trotz richtiger Pinbelegung)
Hardware-TWI verwende ($lib "i2c_twi.lbx"). Da gibt es auch kein
Problem, die richtige Adresse zu finden, die Kommunikation klappt aber
nicht. Mit "Config I2cdelay" könntest Du auch etwas spielen. Probleme
kann es auch geben, wenn in $crystal eine falsche Frequenz angegeben
wurde.
Ich programmiere in BasCom und nicht in C . Das mit dem Crystal werde
ich nochmal übeprüfen. Ansonsten heisst es weiter suchen. Was mir
aufgefallen ist, wenn ich an PB1 den Timer aktiviere und auf PWM stelle,
dann emfängt der Radiochip wirre Frequenzen. Wahrscheinlich die
Störfrequenzen von dem PWM Pin. Vielleicht muss ich den Chip noch besser
abschirmen. Ja ist auf Lochraster aufgebaut.
Gruß
derLemmi schrieb:> Ich programmiere in BasCom und nicht in C
Ich weiß, mein Beitrag bezog sich auf BASCOM. Immerhin kann man
Hardware-TWI als Fehlerquelle ausschließen.
derLemmi schrieb:> emfängt der Radiochip wirre Frequenzen
Kannst Du den den Chip auf eine bestimmte Frequenz eines starken
Radiosenders in Deiner Nähe einstellen? Vielleicht kannst Du dann besser
nach Störungen suchen.
Die Frequenz ist Standardmässig auf 87,0 eingestellt, von da an sucht
der Chip den Frequenzbereich ab. Ich werde das nochmal testen mit einer
festen Frequenz. Auch werde ich nochmal eine längere Antenne austesten,
da ich hier sozusagen in einem "Bunker" sitze. Bzw. ich werde die
Antenne mal aus dem Fenster hängen.
Ich habe in der BasCom Hilfe keinen Befehl I2Cdelay gefunden. Ich muss
dazu aber auch sagen, dass ich erst seit ca 3 Monaten in BasCom
programmiere.
Gruß
Ja, die Quarzbeschaltung ist vollkommen falsch und wenn Du mit "erstmal
nicht aufgebaut" den Kondensator am FMI nicht bestückst, wie soll da
jemals ein Antennensignal in den Chip gelangen.
Also, nochmal hinsetzen und die Grundschaltungen üben ;-)
Old-Papa
So die Quarzbeschaltung korrigiert und an den DCLK Pin mit
angeschlossen. Die Bürdekondensatoren am Quarz auf 22pF geändert ... er
findet jetzt zumindest schonmal Sender, die werden aber auf dem LCD mit
komplett falschen Frequenzen angezeigt.
Vielleicht habt ihr ja hier auch noch einen Tip für mich.
Vielen Dank schonmal
mfg
Na, hätte schon fast geglaubt, Du meldest Dich nicht mehr. Ohne den Code
zu sehen, wird man da kaum helfen können. Welche Frequenz ist
eingestellt und was wird angezeigt?
Den Quelltext habe ich eigentlich 1zu1 aus dem ELEXS Projekt übernommen.
1
Sub Fm_tune_status()
2
I2cstart
3
I2cwbyte 34 ' I2C Adresse vom SI4735 schreiben
4
I2cwbyte &H22
5
I2cwbyte &H03
6
I2cstop
7
I2cstart
8
I2cwbyte 35 ' I2C Adresse vom SI4735 lesen
9
I2crbyte Status , Ack
10
I2crbyte R1 , Ack
11
I2crbyte R2 , Ack
12
I2crbyte R3 , Ack
13
I2crbyte R4 , Ack
14
I2crbyte R5 , Ack
15
I2crbyte R6 , Ack
16
I2crbyte R7 , Nack
17
Freq = 256 * R2 'Freq aus R2 und R3 berechnen
18
Freq = Freq + R3
19
Rssi = R4
20
Snr = R5
21
Cls 'Ausgabe der ausgelesenen Werte auf dem LCD
22
Locate 1 , 1
23
Lcd Freq
24
Lcd " "
25
Locate 2 , 1
26
Lcd "Freq"
27
Locate 1 , 8
28
Lcd Rssi
29
Lcd " "
30
Locate 2 , 7
31
Lcd "RSSI"
32
Locate 1 , 12
33
Lcd Snr
34
Lcd " "
35
Locate 2 , 12
36
Lcd "SNR"
37
I2cstop
38
End Sub
zum Einstellen der Frequenz verwende ich
1
Sub Fm_tune_freq();
2
I2cstart
3
I2cwbyte 34 ' I2C Adresse vom SI4735 schreiben
4
I2cwbyte &H20 ' FM_Tune_Freq Command
5
I2cwbyte &H00
6
H = High(ffm) ' Startfrequenz ins H und L Byte schreiben
7
L = Low(ffm)
8
I2cwbyte H
9
I2cwbyte L ' 88.8 MHz
10
I2cwbyte &H00
11
I2cstop ' I2C Kommunikation abbauen
12
End Sub
Wenn ich ne feste Frequenz von z.B. 88.8 ( bei uns N-Joy) zeigt er auf
dem Display 43957 an.
Irgendwie seh ich da keinen Zusammenhang.
Vielen Dank im Voraus
mfg
Bei 88.8 müsstest Du 8880 auf dem Display sehen. R2 wäre &H22 (34) und
R3 wäre &HB0 (176). Lass Dir mal R2 und R3 ausgeben. Du kannst auch
schreiben:
Freq = MAKEINT(R3,R2)
Wenn ich als Frequenz .. also die Variable ffm mit 8880 deklariere,
steht auf dem Display 46507
R2 ist 171 und R3 ist 181 (bei der standardberechnung stimmt das
Ergebnis auch wenn es unsinnig ist) mit dem Makeint Befehl stimmt die
Rechung dann nicht mehr.
Gruß
Nachtrag:
Einen Sender ( Also Musik) findet er bei der fest eingegebenen Frequenz
auch nicht. Bei 88.8 ist aber definitiv ein Sender. Mit anderem fertigen
Radio getestet. mit dem Suchlauf findet er den Sender. Wenn ich dann
aber aufwärtssuche und dann wieder abwärts, ist die Musik zu hören, also
der Sender wird empfangen, aber R2 und R3 ändern sich jedes mal.
Ich verzweifle langsam an diesem Projekt :(
Gruß
Jetzt steht auf dem Display bei der festen Frequenz 8880 auf dem Display
47090 für R2 steht 183 und für R3 steht 242 .
Ich glaube nicht, dass das an der Formatierung der Ausgabe liegt, aber
ich habe leider keine Ahnung woran sonst :(
Kann das immer noch was mit den 32,78 kHz vom Quarz zu tun haben ?
Gruß
derLemmi schrieb:> Kann das immer noch was mit den 32,78 kHz vom Quarz zu tun haben ?
Sicherlich!
Du musst dem Chip auch bei der Initialisierung mitteilen, welche
Frequenz das Ref-Clock Signal hat. Tust Du das? Überhaupt wäre die
Initialisierung mal ganz interessant zu sehen.
Stell bitte auch mal ein aktuelles Schaltbild hier rein. Das oben
gezeigte hat einfach zu viele Fehler! Wenn Du z.B. RFGND immer noch
nicht mit GND verbunden hast, würde es mich auch nicht wundern, dass der
Chip nicht vernünftig tickt...
gruß
daniel
Anbei der Code zur Initialisierung .. auch aus dem ELEXS Projekt
1
Sub Init_fm()
2
I2cstart
3
I2cwbyte 34 ' I2C Adresse vom SI4735
4
I2cwbyte &H01 ' Powerup Command
5
I2cwbyte &H10 ' '00 FM, 01 AM, 10 32-kHz-Osz
6
I2cwbyte &H05 ' Powerup Analog Output
7
I2cstop
8
End Sub
Der RFGND wird laut Datenblatt nur bei AM Betrieb benötigt und
beschaltet.
Ich habe jetzt die Frequenz fest auf 9400 engestellt, da ich dort weiss
welcher Sender läuft ( auf dem Display steht 14076) .. Am Anfang des
Programms lasse ich diese Frequenz einstellen. Er findet keinen Sender
.. Wenn ich dann noch einmal Aufwaertssuche per Code starte, findet er
den gewollten Sender und zeigt auf dem Display 14076 an, also genau das
was vorher auch stand.
Zur Einstellung der Refclock verwende ich folgenden Code:
derLemmi schrieb:> Sub Fm_tune_status()> I2cstart>...> I2cstop> End Sub
Sehe gerade, dass Du die LCD-Ausgabe noch in der I2C-Routine machst.
Setz mal I2Cstop direkt hinter "I2crbyte R7 , Nack".
macht auf jeden Fall Sinn.. ich denke mal das i2cstop ist irgendeinem
Änderungsversuch zum Opfer gefallen. Hat aber leider nichts an den
falschen Frequenzen geändert. Aber zumindest bleibt bei dem fest
eingestellten Sender jetzt R2 und R3 gleich. :P
Vielen Dank nochmal euch Allen für die Hilfe
Gruß
RFGND ist nun auf Masse .. Antennenanschluss für AM ist nun auch
vorgesehen.
Frequenzen immer noch Sch***e. Schaltungstechnisch nochmal alles
kontrolliert und mit Beschaltung aus dem Datenblatt verglichen ....
Check.
Sender werden empfangen.. Musik kommt raus .. Frequenzen werden immer
noch falsch angezeigt.
Es sollte auf dem Display 9400 stehen .. es steht 14076 mit R2 = 54 und
R3 = 252.
Gruß
Hallo,
ich habe mal mit meinem eigenen Code verglichen und kann auf Anhieb
keinen Fehler ausmachen. Du könntest höchstens die Initialisierung noch
wie folgt erweitern:
1
// Setup Tuner Parameters
2
si4735_setProperty(REFCLK_FREQ,REFCLOCK_FREQUENCY);// set refclock input
3
si4735_setProperty(REFCLK_PRESCALE,0x0001);// set refclock prescaler to 1
4
si4735_setProperty(FM_DEEMPHASIS,0x0001);// set deemphasis to 50µs (Europe)
5
si4735_setProperty(FM_SEEK_FREQ_SPACING,0x0005);// set frequency spacing to 5kHz
An Deinem eigentlichen Problem wird sich aber dadurch vermutlich nichts
ändern.
Daher solltest Du mal versuchen, die Kommunikation systematisch zu
checken:
setze den Wert eines Register und lies diesen Register anschließend
wieder aus. Sind beide Werte gleich?
Hast Du überhaupt mal versucht, andere Register des Chips zu lesen? Du
kannst ja z.B. auch die Chip-ID auslesen, soweit ich mich erinnere. Wenn
Du da schon schwachsinnige Werte erhälst, dann weißt Du, dass mit der
Kommunikation (zumindestens im Lesemodus) grundlegend etwas nicht
stimmt.
Gruß
Daniel
derLemmi schrieb:> Hat noch jemand eine Idee für das Problem mit den falschen Frequenzen ?>> Vielen Dank im Voraus>> Gruß
Tja, so richtig weiß ich auch nicht mehr weiter. Schau mal nach dem, was
Daniel P. schrieb, und ich verweise auf meine Antwort weiter oben. Spiel
mal etwas mit "Config I2cdelay", vielleicht hilft das ja.
Falls vorhanden, "Config Twi = 400000" herausnehmen.
Falls vorhanden, $lib "i2c_twi.lbx" herausnehmen.
Setze hinter jeden "I2CStop" Befehl den Befehl "Print Err" oder LCD Err
und schau Dir die Ausgabe an. Wenn Err=0 ist, sollt die Kommunikation ok
sein.
hmm ich habe die 10k Pullups vom I2C Bus nochmal durch 4,7k geändert.
Jetzt steht bei Frequenz 65535 und bei RSSI, SNR , R2, R3 255
Also Alle Werte auf Maximum :(
Gruß
derLemmi schrieb:> Chipbeschaltung.png
Die I2C-Beschaltung passt nicht, da dürfen kein 10k Widerstände (R2/R4)
in den SCL/SDA Leitungen vorhanden sein, wie soll der Slave da was
vernünftig auf Low ziehen können ? Sollte das ein Pegelwandler werden ?
Bei Verwendung von $lib "i2c_twi.lbx" wird Hardware-I2C genutzt und dann
schaltet der Bascom-Befehl I2CInit die µC-internen Pullups (~20k) ein.
Etwas anderes macht der Befehl übrigens nicht.
Wenn der Slave SDA auf Low ziehen möchte, ergibt R2/R13 & interner
Pullup einen Spannungsteiler, das I2C-Interface des ATM8 sieht dann um
die 2,3V und kann das sicherlich nicht als Low betrachten.
Der korrekte Weg wäre vom SI4735 direkt zum ATM8 zu gehen, 2 Pullups auf
3,3V zu setzen und die internen Pullups im ATM8 aus zu lassen, also
I2CInit wegzulassen.
@derLemmi
ich hatte letztens auch mal ein bisschen mit dem SI-4735 rumgespielt,
was mir dabei aufgefallen ist, ist das der 32KHz Quarz des öfteren nicht
sauber anschwingt. Lag vielleicht auch am Steckbrett. Nachdem ich den
Ozsillator auf 4MHz umgebaut hatte, lief der SI-4735 einwandfrei.
Ich hatte im übrigen die selbe Fehlererscheinung wie bei dir
(falsche Frequenzanzeige).
Schau dir vielleicht das mal an: http://www.elexs.de/SI4735b.html
Gruß
Frank aus Köln
Hier ist SDA/SCL richtig beschaltet: http://www.elexs.de/SI4735h.html
Hier nicht: http://www.elexs.de/SI4735a.html
Und das hier zeugt davon, dass der Erbauer den I2C-Bus nicht verstanden
hat, Zitat von SI4735a.html:
> Das Interface zum UM232R verwendet drei Widerstände. Zwei der Leitungen> könnten zwar auch direkt verbunden werden, aber so wird eine größere> Fehlersicherheit erreicht.
Das Einzige was er damit tatsächlich erzeugt sind Fehler.
@MWS
Ich muss gestehen die anderen Seiten von denen habe ich mir nicht
angeschaut,
aber das mit dem 32KHz Quarz kann ich bestätigen, nachdem ich mit 4MHz
Clocksignal aus einem Quarzoszillator gearbeitet hatte, stimmte die
Frequenzanzeige auch nach jedem einschalten.
Gruß aus Köln
Frank
MWS schrieb:> Die I2C-Beschaltung passt nicht, da dürfen kein 10k Widerstände (R2/R4)> in den SCL/SDA Leitungen vorhanden sein, wie soll der Slave da was> vernünftig auf Low ziehen können ? Sollte das ein Pegelwandler werden ?
Würde mal meinen, dass es in Richtung Pegelwandler gehen sollte. Würde
ich persönlich nicht so machen.
MWS schrieb:> Hier ist SDA/SCL richtig beschaltet: http://www.elexs.de/SI4735h.html
Setzt aber voraus, dass der Mikrocontroller mit 3,3V betrieben wird.
Karl schrieb:> Setzt aber voraus, dass der Mikrocontroller mit 3,3V betrieben wird.
Nein, das ist nicht die Voraussetzung. Bei I2C kommunizieren sowohl
Master als auch Slave indem der Pegel aktiv auf Low gezogen wird, der
High-Pegel stellt sich nur über die Pullups ein, also eine Open
Collector Schaltung.
Wenn die Pullups auf 3,3V ziehen, dann sieht der Master als High-Pegel
nicht mehr als diese 3,3V, was für die Funktion ausreicht.
Solange man keine internen Pullups im µC aktiviert, welche dann
zusätzlich auf 5V ziehen würden, liefert der Master somit keine Spannung
auf den Bus, welche die Specs des Slave überschreiten würde.
Wenn ich aber einen 4MHZ Ozillator ( ist auf der Platine schon drauf für
den Atmega) verwende, muss ich ihm einen Refclk Prescaler von 122
mitteilen oder ? Ich werde erstmal die 10k Widerstände in der SCL und
SDA Leitung rausnehmen. Genau auf den oben genannten ELEXS Artikel bin
ich dann wohl reingefallen, dass das die Fehlersicherheit erhöhen soll
:(
Vielen Dank nochmal Euch Allen für die vielen Tipps.
Ich werde weiter berichten, was sich ergeben hat.
Gruß
@derLemmi
ich weiss es leider nicht mehr aus dem Kopf, muss heute aben mal zu
Hause nachschauen, aber die machen das in Bascom so:
Private Sub Xtal()
Prop &H202, 125 '4 MHz / 125 = 32 kHz
Prop &H201, 32000
DELAY 100
End Sub
Ich weiss nicht ob das so richtig ist. (unzuverlässige Quelle)
Gruß aus Köln
Frank
MWS schrieb:> Nein, das ist nicht die Voraussetzung. Bei I2C kommunizieren sowohl> Master als auch Slave indem der Pegel aktiv auf Low gezogen wird, der> High-Pegel stellt sich nur über die Pullups ein, also eine Open> Collector Schaltung.
Mein Kommentar bezog sich eher auf den gesamten Schaltplan.
Trotzdem, ich dachte immer, man müsste ein "Level shifting" wie hier
machen:
http://www.nxp.com/documents/application_note/AN10441.pdf
derLemmi schrieb:> dass das die Fehlersicherheit erhöhen soll
Du musst natürlich vorsichtig sein, denn wenn Du etwas falsch
konfigurierst, kannst Du den SI4735 in der Tat schreddern.
D.h. Du musst in Deinem Code darauf achten, dass die Portpins für SCL
und SDA niemals auf High und Ausgang konfiguriert werden.
Die Bascom Hardware-I2C I2CInit hat da speziell für Deinen Fall 'ne
kleine Schwäche, da sie erst PORT auf High (also Pullups ein) und dann
erst DDR auf Low setzt. Wenn in dieser Konstellation die Pins bereits
Ausgänge waren, liegen für 2/3 Zyklen die Portpins auf 5V.
Aber wie schon gesagt solltest Du die I2CInit sowieso nicht verwenden.
Beim Startup sind die Portpins immer Eingänge, da passiert nichts.
Und selbst wenn Du unter Bascom tatsächlich ein I2CInit reinschreiben
würdest, wärst Du mit 4,7k externen Pullups auf 3,3V und angenommenen
20k internen Pullups mit 3,62V gerade grenzwertig über dem erlaubten
Bereich VD +0,3V. Dass dabei bereits etwas kaputt ginge, glaube ich
kaum.
Wenn Du dagegen aktiv 5V reinhämmerst, wird's ein toter Käfer.
Deshalb habe ich die Jumper vorgesehen. Sieht man noch am linken
Bildrand einen Teil von. Das habe ich auch schon gelesen, dass man den
SI4735 schnell ins Nirvana befördern kann. Jedesmal wenn ich flashe,
nehme ich die Jumper ab.
Übrigens VIELEN VIELEN VIELEN DANK an MWS. die 10k Widerstände in der
SCL und SDA Leitung rausgenommen und er zeigt die richtigen Frequenzen
an freu
Gruß
Karl schrieb:> Trotzdem, ich dachte immer, man müsste ein "Level shifting" wie hier> machen:
Ja, sicher so wär's richtig wenn Du einen 3,3V Bus mit einem 5V Bus
verbindest, da kannst Du nicht sicher sein, ob die 5V Devices mit dem
3,3V Level klarkommen. Hier ist's aber überschaubar, ein Master und ein
Slave, der High-Pegel des Slave muss sicher über und der Low-Level
sicher unter der jeweiligen Threshold des Masters liegen.
Lt. DB des ATM8 liegt bei VCC = 5V die Threshold für High bei ~1,8V, bei
Low bei~1,3V.
Mit 3,3V für High liegt man sicher drüber.
Hab's mal mit ein paar Widerständen und der Schaltung wie oben
simuliert, da kommen folgende Spannungen wie sie der Master sieht raus:
Ohne zusätzliche interne Pullups, also kein I2CInit:
Slave SDA offen: 3,3V
Slave SDA zieht low: 1,65V
Mit zusätzlichen Pullups 20k per I2CInit:
Slave SDA offen: 3,87V
Slave SDA zieht low: 2,32V
Simulation ist idealisiert, wenn also der SI4735 bei Low nicht auf 0V,
sondern z.B. 0,6V zieht, dann ändern sich die Pegel nochmal.
Man sieht daran, dass es mit 10k und ohne interne Pullups eigentlich
schon nicht mehr funktioniert, mit internen Pullups geht's zuverlässig
nicht mehr.
Wenn man noch 'ne kleine Sicherheit haben möchte, dass ein falsch
gesetzter Pin nicht zum Tod des SI4735 führt, könnte man noch über die
Verkleinerung von R2/R4 auf 3k3 nachdenken, da sind die Pegel dann
vorteilhafter, Low 1,27V, High 3,3V und der maximale Strom bei 5V wäre
begrenzt. Ob's tatsächlich hilft - keine Ahnung. Dazu müsste man wissen,
ob Clamp-Dioden an den SI4735-Eingängen die Überspannung ableiten
können.
derLemmi schrieb:> Das habe ich auch schon gelesen, dass man den> SI4735 schnell ins Nirvana befördern kann.
Eigentlich dürfte während des Flashens nichts passieren, da die Pins
dabei Eingänge sind.
> zeigt die richtigen Frequenzen
Prima :D
MWS schrieb:> Lt. DB des ATM8 liegt bei VCC = 5V die Threshold für High bei ~1,8V, bei> Low bei~1,3V.
Ja, das macht Sinn. Vielen Dank auch von mir für die Erläuterung.