Bascom Tea5767 Modul

wolverine

Neues Mitglied
23. Mai 2012
24
0
0
Sprachen
  1. BascomAVR
Tea5767 Radio Modul

Hallo

für die welche es nicht wissen, das Tea5767 ist ein digitales Radiomodul.
Ich habe diese Frage auch schon in einem anderen Forum gestellt, sie konnten mir aber nicht weiterhelfen.
Das Modul Tea5767 habe ich vor kurzem gekauft und habe auch schon den Code geschrieben.
Auf dieser Seite gibt es ein beispiel allerdings in C: http://www.electronicsblog.net/arduino-fm-receiver-with-tea5767/
passendes PDF dazu: http://www.sparkfun.com/datasheets/Wireless/General/TEA5767.pdf und http://www.rockbox.org/wiki/pub/Main/DataSheets/application_note_tea5767-8.pdf

gekauft habe ich das Modul hier: http://www.mikroshop.ch/Zubehoer.html?gruppe=10&artikel=218

Mein bisheriger Code:
Code:
$crystal = 8000000
$regfile = "m8def.dat"
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db7 = Portd.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portb.4 , Rs = Portb.5
Cursor Off
Cls

Config Sda = Portc.4
Config Scl = Portc.5
I2cinit

Taster1 Alias Pinb.1
Config Taster1 = Input

Taster2 Alias Pinb.2
Config Taster2 = Input

Dim Frequenz As Single
Dim Pll As Single
Dim Pllfrequenz As Word
Dim 1st As Byte
Dim 2nd As Byte
Dim 3rd As Byte
Dim 4th As Byte
Dim 5th As Byte

Const Modulfrequenz = 32768
Const Frequenzi = 225000
Const Adresse_schreiben = &B11000000
Const Adresse_lesen = &B11000001
Frequenz = 103

Do
Pll = Frequenz * 1000000
Pll = Pll + Frequenzi
Pll = Pll * 4
Pll = Pll / Modulfrequenz
Pllfrequenz = 12234                                         'Int(pll)
1st = High(pllfrequenz)
Reset 1st.6                                                 'Kein Suchen
Reset 1st.7                                                 'Kein Mute
2nd = Low(pllfrequenz)
3rd = &B00010000
4th = &B00010010
5th = &B00000000
I2cstart
I2cwbyte Adresse_schreiben
I2cwbyte 1st
I2cwbyte 2nd
I2cwbyte 3rd
I2cwbyte 4th
I2cwbyte 5th
I2cstop
Locate 1 , 1
Lcd "Radio"
Locate 2 , 1
Lcd Frequenz ; " mhz"
Wait 3
Loop
End

Ich habe bisher einfach einen Kopfhörer an die Ausgänge gehalten, aber man kann nicht viel hören.
Die Pull-Up Widerstände habe ich eingesetzt. Als Antene verwende ich ein 50cm langes isoliertes Drahtstück.

Woran könnte es noch liegen, dass es nicht funktioniert?

Danke für eure Hilfe!!
 
Hallo !

Vor einiger Zeit habe ich mich mit dem Datenblatt des TEA5767 auch mal beschäftigt......
Mehr allerdings auch nicht. :wink:

Ich bin daher geneigt zu sagen, dass deine Config für das Modul nicht vollständig ist.
Es müssen zu Beginn einige Parameter (vier oder fünf Byte) per I2C eingestellt werden, bevor man die Empfangsfrequenz übergeben kann.

Genau weiß ich es jetzt aber nicht mehr. :hmmmm:
Schau doch noch mal ins Datenblatt, da wird das ganz gut beschrieben.
Es gibt auch extra eine App-Note dazu (PDF 1,1MB), die ich hier aber wegen der Größe leider nicht anhängen kann.


Ich habe hier auch immer noch ein Radiomodul liegen.......
bin aber nicht sicher oder es das TEA5767 oder das AR1000 ist.

Tatsache ist aber, dass beide Module maximal nur mit 3V oder 3,3V laufen und man einen Leveltranslater verwenden muss, wenn der AVR mit 5V betrieben wird!


Grüße,
Cassio
 
Hallo !

Ja, genau!
Die AppNote habe ich gemeint.

Damit hast du schon mal eine gute Basis zur Hand.


Die 5V max. gilt als absolutes Maximum.
Gedacht sind die kleinen Chips für den Batteriebetrieb.... also bis ca. 3,3V.
Ich wäre deshalb mit den 5V vorsichtig.



Ich habe noch mal geschaut......
Leider habe ich hier nur den AR1010 liegen und kein TEA5767.

Grüße,
Cassio
 
Hab mir gerade die Application Note etwas näher angesehen und dann das gefunden:


Data transfer to and from the TEA5767HN can begin when a start condition is created. This is the case if a
transition from HIGH to LOW on the SDA line occurs while the SCL is HIGH (see ).
The first byte transferred represents the address of the IC plus the data direction. A LOW LSB of this byte
indicates data transmission (WRITE) while a HIGH LSB indicates data request (READ).
Each data put on the SDA must be 8-bits long (Byte) and each byte sent should be acknowledged by “ACK” bit.
In case a byte is not acknowledged, the transmitter should generate a stop condition or restart the transmission.

At power on, the mute bit (bit 7 of data byte 1) is set. All other bits are set to low. To initialise the IC all bytes
should be transferred. If a stop condition is created before the whole transmission is completed, the remaining
bytes will keep their old setting. In case a byte is not completely transferred, the new bits will change their
setting but a new tuning cycle will not be started.



Was ist dieses ACK bit und wie kann ich das senden?

Hier das Bild dazu:
tea5767.JPG
 
Also meiner Meinung nach sollte genau das mit i2cstart bzw i2cstop geschehen.
Was mir an Deinem Code bisher spontan aufgefallen ist:
-Du berechnest erst (relativ kompliziert = Fließkommazahl) dieses 14-bit-PLL-Wort, verwendest aber stattdessen 'ne (andere) Konstante.
-Nach der Berechnung/Zuweisung auf die entsprechende high/low-Variable löschst Du nochmals die beiden MSB. Die sollten aber bereits 0 sein.
-Du legst mit Deiner Konstante quasi eine Feste Frequenz fest, Search Mode ist ja aus. Das wiederholst Du ca alle 3s. Sicher, daß auf der Frequenz was zu hören ist?
 
Das hier will Bascom nicht annehmen.

Code:
I2cwbyte 1st , Ack

Und ja ich höre auf dieser Frequenz mit einem anderen Radio in guter Qualität. Habe jetzt aber trotzdem mal eine andere Frequenz genommen.
Resultat ist bisher das gleiche -> nichts zu hören

Noch mal den Code:
Code:
$crystal = 8000000
$regfile = "m8def.dat"
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db7 = Portd.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portb.4 , Rs = Portb.5
Cursor Off
Cls

Config Sda = Portc.4
Config Scl = Portc.5
I2cinit

Taster1 Alias Pinb.1
Config Taster1 = Input

Taster2 Alias Pinb.2
Config Taster2 = Input

Dim Frequenz As Single
Dim Pll As Single
Dim Pllfrequenz As Word
Dim 1st As Byte
Dim 2nd As Byte
Dim 3rd As Byte
Dim 4th As Byte
Dim 5th As Byte

Const Modulfrequenz = 32768
Const Frequenzi = 225000
Const Adresse_schreiben = &B11000000
Const Adresse_lesen = &B11000001
Frequenz = 105.8

Do
Pll = Frequenz * 1000000
Pll = Pll + Frequenzi
Pll = Pll * 4
Pll = Pll / Modulfrequenz
Pllfrequenz = Int(pll)
1st = High(pllfrequenz)
2nd = Low(pllfrequenz)
3rd = &B00010000
4th = &B00010010
5th = &B00000000
I2cstart
I2cwbyte Adresse_schreiben
I2cwbyte 1st
I2cwbyte 2nd
I2cwbyte 3rd
I2cwbyte 4th
I2cwbyte 5th
I2cstop
Locate 1 , 1
Lcd "Radio"
Locate 2 , 1
Lcd Frequenz ; " mhz"
Wait 3
Loop
End
 
Also wenn ich das recht verstanden habe, gibt der Sender immer für das 9te Bit die SDA frei (-> high über den externen Pullup). Ack oder Nack ist jetzt eine Reaktion des Recievers. Folglich sollte sich der eventuelle ack/nack-Parameter also nur bei i2crbyte finden lassen, und genau dort findet man es ja auch in der Onlinehilfe.
Dein Zitat spielt darauf an, daß der Master Transmitter, wenn er irgendwann ein Nack vom Reciever bekommt, eine Stopcondition generieren soll, und damit den Transfer abbrechen. Dazu müssen die TWS-Bits in TWSR ausgewertet werden.(*)
-Hast Du schon mal versucht, die 5 bytes zu lesen? Nach einem Power on Reset sollte sich dann ja im ersten byte das Muster 10000000bin (also nur Mute=1) lesen lassen (beim Lesen halt mit ack/nack).
-Hast Du schon mal versucht, ihn einen Sender suchen zu lassen (Searchmode in Byte1, SSLungleich0)?
-Kann man nicht SWP1/SWP2 als Output (cave!:SearchIndicator->Bit0 in Byte4 beachten) verwenden, und mal via I2C toggeln lassen? Dann sollte man zumindest mal 'ne Reaktion messen können, oder?

Edit:(*) betrifft den Hardware-TWI. Deine Konfiguration der SDA/SCL-Pins läßt vermuten, daß die gesammte Chose so in Software implementiert wird. Wie Du da als Master Reciever auf eventuelle Nacks des Slave Transmitters prüfen kannst, erschließt sich mir aus der online-Hilfe nicht.
 
Das lesen funtioniert dann etwa so:

Code:
...
I2cstart
I2cwbyte Adresse_lesen
I2cwbyte 1st
I2cwbyte 2nd
I2cwbyte 3rd
I2cwbyte 4th
I2cwbyte 5th
I2cstop
Locate 1 , 1
Lcd 1st
Wait 2
Locate 1 , 1
Lcd 2nd
...

Oder muss ich noch ein Ack an die "I2cwbyte 1st" hängen?
 
Nein nein,
-Als erstes wieder die Startcondition, ist klar.
-Dann läßt Du die Slave-Adresse schreiben - allerdings macht die Adresse ja nur die ersten 7Bits dieses Bytes aus, das LSB bestimmt, ob der Master für die folgenden Bytes (bis zur nächsten Stopcondition) zum Reciever wird. Du hast ja die Slave-Adresse bereits 2x definiert - einmal fürs lesen, einmal fürs Schreiben. Die unterscheiden sich wie? ;)
Also sendest Du die Adresse_lesen (mit i2cwbyte)
-jetzt forderst Du die 5 bytes nacheinander an, der Master soll die SDA ja frei lassen und auslesen, folglich verwendest Du hier je i2crbyte. Byte1..4 sollen mit Ack bestätigt werden, nach Byte5 (dem letzten) willst Du die Verbindung ordentlich beenden -> Nack
(wenn Du bereits eines der anderen Bytes mit Nack abschließen läßt, klinkt sich der Slave-Transmitter da bereits aus, klar?)
-als Letztes beendest Du (Master) die Kommunikation wieder mit einer Stopcondition

(P.S.: siehe auch mein Edit oben)
 
Woran könnte es noch liegen, dass es nicht funktioniert?

Hallo Wolverine!

Ich habe eeeendlich ein Programm zur Steuerung des AR1010 I2C-Radio-Moduls (welches mit dem TEA5767 identisch sein soll) in BASCOM gefunden! :D

Inzwischen habe ich die Software auch schon etwas modifiziert und................
es funktioniert! :dance3:


Wenn du noch Interesse haben solltest, kann ich dir das Programm hier gern zur Verfügung stellen.


Grüße :ciao:
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)