Adafruit Stereo FM Transmitter with RDS RBDS Breakout - Si4713

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Adafruit Stereo FM Transmitter with RDS RBDS Breakout - Si4713

      Hallo,

      hat von Euch schon mal einer was mit dem FM Transmitter Si4713 gemacht?

      Für Arduino gibt es da Beispiele aber bisher habe ich da nichts mit Bascom gefunden.

      Hier ist mal das Datenblatt Si4713

      Jetzt ist es ja mit Bascom ja nicht schwer Daten über I2C zu senden - mein Problem liegt mehr im Bereich "wie liest man ein Datenblatt".

      Im Datenblatt sind die einzelnen Befehle aufgeführt aber wie man das letztendlich in Bascom umsetzt ist mir nicht bekannt.

      Wie würde man z.B. per Bascom den Befehl zum Setzen der TX Frequenz umsetzen?

      Klar ist es einfach die Sache mit Arduino und den vorgegebenen Beispielen zu lösen aber ich möchte das schon besser verstehen und nicht nur einige Zeilen in der Arduino IDE ändern.

      Ich finde mit Bascom kann man da viel freier Arbeitet darum eben diese Verständnisfrage auch wenn es eventuell blöd klingt.

      Danke und Gruß
      dnwalker
    • Ich habe mit diesem Teil zwar noch keine Erfarung gemacht, aber die entscheidenden Kapitel im Datenblatt sind 5.12.1 und 5.12.2.

      Ich verstehe es so in etwa:

      Um das Interface auf I2C zu setzen, muss der SCLK-Pin auf High gesetzt und dann eine steigende Flanke an RST generiert werden.

      Der Rest ist "normale" I2C-Kommunikation:
      Als erstes kommt das Adress Byte, dessen ersten 7 Bits bei diesem Chip entweder 0010001 oder 1100011 sind (je nach Pegel am SEN-Eingang).Das letzte Adress-Bit ist 0 für "Daten schreiben" und 1 für "Daten lesen".
      Empfängt der Chip die korrekte Adresse bestätigt er dies mit einem ACK, und dann kann das Kommando-Byte folgen (siehe Liste in Kapuitel 6).
      Wie auf Seite 28 beschreben ist, können dem Kommando-Byte bis zu 8 Daten-Bytes folgen.
      Auf die Einstellung der Frequenz wird im Kapitel 5.1 eingegangen, der Wert in MHz mit 100 multipliziert ergibt die beiden zu sendenden Bytes. Für 99,5 MHz z.B.also 9950 = &b100110 11011110, das High-Byte wäre &b00100110 und das Low-Byte &b11011110.

      Um den Sender auf 99,5 MHz einzustellen, würde ich also folgendes versuchen (Low am SEN-Pin) :

      BASCOM Source Code

      1. I2cstart
      2. I2cwbyte &b00100010 '7 Adress-Bits + Write-Bit
      3. I2cwbyte &b00110000 'TX_TUNE_FREQ = 0x30 = 48 dezimal = 00110000 binär
      4. I2cwbyte &b00100110 'High-Byte von 9950
      5. I2cwbyte &b11011110 'Low-Byte von 9950
      6. I2cstop

      Aber wie gesagt - alles ohne Gewähr! :)
    • Hallo,

      der Chip ist da und funktioniert unter dem Beispiel für Arduino ohne Probleme.

      Bei dem Beispiel werden außer der Spannungsversorgung lediglich 3 Steuerleitungen verwendet.

      Also SCA, SCL und der Reset-Pin.

      Der Reset-Pin wird bei Start kurz auf Low gezogen wohl um den Chip in den I2C Bus zu schalten.

      Das habe ich mit dem Oszi gemessen.

      Ach ja - default Addresse bei dem Board ist die 0x63.

      Jetzt habe ich versucht das ganze unter BASCOM anzusteuern - leider mit wenig Erfolg.

      Um da als Anfänger irgendwie mal eine Grundlage zu bekommen habe ich im Netz folgenden Code gefunden und versucht damit mit meinem Chip weiter zu kommen.

      Ich habe jetzt keinen ATMEGA8 sondern einen ATMEGA16 auf meinem Testboard.

      Bisher war ich immer der Meinung das man auf jedem Pin eines ATMEGA16 die Leitungen für den I2C Bus konfigurieren kann.

      In dem Code wird aber die Lib "i2c_twi.lbx" verwendet und dabei sind die Pins nicht mehr frei zu konfigurieren.

      Bei meinem ATMEGA16 habe ich die Pins C1 und C0 verwendet.

      Da wäre dann meine Frage was bringt die Lib an Vorteilen und sind die Pins C1 & C0 für meinen ATMEGA16 richtig?

      Ach ja nicht das einer meint ich versuche auf meinen Chip die Portkommandos wie im Beispiel zu senden.

      Das man da einen Fehler bekommt ist mir klar. Was für mich wichtig wäre wie ich überprüfen kann ob mein ATMEGA überhaupt mit dem Senderchip eine Verbindung über I2C aufnehmen kann.

      Gruß
      dnwalker

      Source Code

      1. '******************************************************
      2. 'Projekt: Atmel-Programmierung für Einsteiger
      3. '
      4. 'Prozessor: ATMega 8-16
      5. 'Bascom-Version: 1.11.8.1
      6. '
      7. 'Programm 9: Der I2C-Bus
      8. '
      9. 'Hardware:
      10. 'LCD-Display an Port B
      11. 'I2C-Bus an C.4 (SDA) und C.5 (SCL)
      12. 'PCF8574 8-Bit Port-Expander für I2C-Bus:
      13. '-> Vier LED´s an P0 bis P3
      14. '-> Vier Schalter an P4 bis P7
      15. '
      16. '11.03.2006 T. Gietenbruch
      17. '
      18. '******************************************************
      19. '======================================================
      20. 'System-Einstellungen
      21. '======================================================
      22. 'Definition für Mega 8
      23. $regfile "m8def.dat"
      24. 'Angabe der Taktfrequenz (4Mhz)
      25. $crystal = 8000000
      26. 'Einbindung der LCD-Bibliothek für ein 2-Prozessor-Display
      27. $lib "lcd4e2.lbx"
      28. 'Einbindung der I2C-Bibliothek
      29. $lib "i2c_twi.lbx"
      30. '======================================================
      31. 'Konfigurationen
      32. '======================================================
      33. 'Angabe der Display-Größe
      34. Config Lcd = 20 * 4
      35. 'Angabe der I2C-Bus-PIN´s (mit i2c_twi.lbx nicht veränderbar!)
      36. Config Sda = Portc.4
      37. Config Scl = Portc.5
      38. 'Konfiguration der Ports
      39. Config Portd = Output
      40. '======================================================
      41. 'Deklarationen
      42. '======================================================
      43. 'Variable für Umschaltung der Displayhälfte - Namen so lassen!
      44. Dim ___lcde As Byte
      45. Dim I2c_state As Bit
      46. Dim Portpcf_in As Byte
      47. Dim Portpcf_out As Byte
      48. Dim Portpcf_old As Byte
      49. Dim N As Byte
      50. '======================================================
      51. 'Initialisierungen
      52. '======================================================
      53. 'Schreib-Adresse für PCF8574P - einstellbar mit Jumpern
      54. Const Pcf_w_adr = 64
      55. 'Lese-Adresse für PCF8574P - immer Schreib-Adresse + 1
      56. Const Pcf_r_adr = Pcf_w_adr + 1
      57. Portd = &B11111111
      58. Portpcf_out = &B11111010
      59. 'Anschaltung des I2C-Busses
      60. I2cinit
      61. '======================================================
      62. 'Aufbau der LCD-Maske
      63. '======================================================
      64. 'Umschaltung auf die obere Hälfte
      65. ___lcde = 0
      66. 'Das Display löschen
      67. Cls
      68. 'Text der ersten Zeile (max. 27 Zeichen!)
      69. Locate 1 , 1
      70. Lcd "*** AVR EINSTEIGERKURS ***"
      71. 'Text der zweiten Zeile
      72. Locate 2 , 1
      73. Lcd "***** I2C-BUS-TEST *****"
      74. 'Den Cursor ausschalten
      75. Cursor Off
      76. 'Umschaltung auf die untere Hälfte
      77. ___lcde = 1
      78. Cls
      79. Lcd "I2C-Status: "
      80. 'Den Cursor ausschalten
      81. Cursor Off
      82. '======================================================
      83. 'Hauptprogramm-Schleife
      84. '======================================================
      85. Do
      86. If I2c_state = 1 Then
      87. 'Eingangsbyte vom PCF8574 lesen
      88. I2cstart
      89. I2cwbyte Pcf_r_adr
      90. I2crbyte Portpcf_in , Nack
      91. 'Ausgangsbyte zum PCF8574P schreiben
      92. I2cstart
      93. I2cwbyte Pcf_w_adr
      94. I2cwbyte Portpcf_out
      95. End If
      96. 'Der I2C-Bus liefert ein ERR-Bit bei Schreibfehler
      97. If Err = 1 Or I2c_state = 0 Then Gosub I2c_statecheck
      98. 'Eingangsbyte aufs Display schreiben
      99. If Portpcf_in <> Portpcf_old Then
      100. Portpcf_old = Portpcf_in
      101. Locate 2 , 1
      102. Lcd Bin(portpcf_in)
      103. End If
      104. 'Statusänderung der PCF8574-Ausgänge
      105. For N = 0 To 3
      106. Toggle Portpcf_out.n
      107. Next N
      108. 'Status-Life-Bit für Hauptprogramm
      109. Toggle Portd.0
      110. Waitms 500
      111. Loop
      112. 'Programmende (nur formal)
      113. End
      114. '======================================================
      115. 'Subroutine: I2C-Bus prüfen
      116. '======================================================
      117. I2c_statecheck:
      118. I2cstart
      119. I2cwbyte Pcf_w_adr
      120. If Err = 1 Then
      121. I2c_state = 0
      122. Portpcf_in = 0
      123. Locate 1 , 13
      124. Lcd "FEHLER "
      125. Else
      126. I2c_state = 1
      127. Locate 1 , 13
      128. Lcd "OK "
      129. End If
      130. Return
      Display All

      The post was edited 1 time, last by dnwalker ().

    • dnwalker wrote:

      In dem Code wird aber die Lib "i2c_twi.lbx" verwendet
      Mit der LIB schaltest du den ATMega in den Hardware I2C/TWI Modus und somit sind die Pins nicht mehr frei wählbar. Ohne LIB kannst du fast jeden beliebigen Pin wählen und dann hast du Soft-I2C/TWI.

      dnwalker wrote:

      Da wäre dann meine Frage was bringt die Lib an Vorteilen
      Hardware I2C/TWI läuft im Hintergrund und belastet den Prozessor weniger.

      dnwalker wrote:

      sind die Pins C1 & C0 für meinen ATMEGA16 richtig?
      genau das sind die Hardware Pins für I2C/TWI.

      dnwalker wrote:

      wie ich überprüfen kann ob mein ATMEGA überhaupt mit dem Senderchip eine Verbindung über I2C aufnehmen kann.
      Am besten benutzt du dafür einen I2C-Scanner. Damit kannst du prüfen, ob dein Slave reagiert.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Danke für die Info.

      So einen i2C Scanner werde ich mal testen.

      Im Grunde habe ich mir in der Zwischenzeit auch so etwas in der Art in Bascom erstellt.

      So wie es aussieht scheint der Chip aber nicht auf Anfragen über I2C zu reagieren.

      Das Problem dürfte darin liegen das ich den Chip irgendwie nicht in den I2C Bus Modus geschaltet bekomme was über die Reset- Leitung gemacht wird.

      Wenn der Chip im passenden Modus ist muss man den erst mit einem "Power-Up" Kommando aufwachen lassen. Wenn ich die Beschreibung richtig verstehe nimmt der Chip auch keine anderen Befehle als den "Power-Up" Befehl an. Erst danach kann man weitere Befehle an den Chip senden.

      Aktuell stehe ich total auf dem Schlauch und komme nicht weiter.

      Gruß
      dnwalker
    • Das sollte man wohl sowieso nie tun: Start während Reset =O
      Die Adresse ist umschaltbar entweder C6/7 oder 22/23 (wenn sen=0). Auf 64 darf er eigendlich nicht reagieren.
      Eine gute Idee mit dem Reset den Bus zu bestimmen. So braucht man nur ein Layout für beide Busse ohne irgendwelche Jumperbrücken. :thumbsup:
    • Jetzt habe ich gleich einen Bit-Krampf a_32_d623ea7e

      Im Datenblatt steht irgendwo "CS - This is the Chip select pin, used in SPI mode. It also determines the I2C address. When pulled high (it is bydefault) the I2C address is 0x63. If this pin is shorted to ground, the I2C address is 0x11"

      Dann habt Ihr natürlich Recht wenn es dann 62 zum Lesen und 63 ist also 62+1 wobei dann die 1 ja eigentlich das Schreib-Bit ist richtig?

      Wird wenn eine I2C Adresse genannt wird immer die "Schreib" Adresse genannt oder gibt es da auch keinen Standard?

      Und bei steigernder Flanke an dem Reset-Pin sollte der Chip dann in den I2C Modus schalten - richtig?

      Danke für eure Hilfe .....

      Gruß
      dnwalker
    • dnwalker wrote:

      Dann habt Ihr natürlich Recht wenn es dann 62 zum Lesen und 63 ist also 62+1 wobei dann die 1 ja eigentlich das Schreib-Bit ist richtig?

      Flanke an dem Reset-Pin sollte der Chip dann in den I2C Modus schalten - richtig?

      gibt es da auch keinen Standard?
      Nur das 62 die 7bit sind also "110 0011" +"1" = 1100 0111 (C7) zum Lesen. Schreiben mit 0 bzw C6 (daher r/w)

      Wenn dann auch Sda und Scl high sind. (Niemand spricht - kein Reset während andere I2C sprechen)

      Nö, man kann froh sein die Adresse irgendwo im kleingedruckten der 100sten Seite zu finden und muß sich dann anhand der Anzahl der Bit denken ob es 7 oder 8 sind.
      Warum steht sie nicht auf der ersten Seite a_166_29aea317

      The post was edited 1 time, last by Pluto25 ().

    • Hallo zusammen,

      erst mal vielen Dank für Eure Hilfe und die Adressen c6 und c7 scheinen wohl zu funktionieren - hoffentlich sehe ich das auch richtig?

      Ich hänge mal meinen Bascom Versuchscode hier an - ja ja ist von einem Anfänger also bitte nicht so streng urteilen ;)

      Wenn ich mit den vorherigen falschen Adressen gearbeitet habe ist bei der Ausgabe LCD Err immer eine 1 angezeigt worden.

      Jetzt mit c6 und c7 wird immer eine 0 Ausgegeben was ich als "kein Fehler" deute.

      Jetzt habe ich auch noch eine schöne Anleitung unter dem Link P-Guide gefunden.

      Wie man an meinem Code sehen kann habe ich da lustig getestet aber leider das Ding nicht zum Senden gebracht.

      Jetzt sagt Ihr ja Bascom sendet immer mit 8Bit. Wie sieht das denn jetzt mit den Kommandos bei dem Chip aus?

      Sind da jetzt die Kommandos auch in 7Bit oder 8Bit?

      So richtig habe ich das noch nicht geschnallt.

      Nicht das schon mein Power-up Befehl völlig falsch ist.

      Zum Ende hin habe ich versucht um überhaupt mal zu sehen ob der Chip meine Befehle an nimmt die GPIO Ausgänge einzuschalten.

      Leider war das auch kein Erfolg...... :( langsam ernährt sich das Eichhörnchen

      So jetzt wäre es klasse wenn Ihr Experten da mal wieder helfen könntet.

      danke schon mal und Gruß
      dnwalker







      Source Code

      1. '--------------------------------------------------------------
      2. ' (c) 1999-2003 MCS Electronics
      3. '--------------------------------------------------------------
      4. ' file: LCD.BAS
      5. ' demo: LCD, CLS, LOWERLINE, SHIFTLCD, SHIFTCURSOR, HOME
      6. ' CURSOR, DISPLAY
      7. '--------------------------------------------------------------
      8. $crystal = 16000000
      9. $regfile = "m16def.dat"
      10. $framesize = 32
      11. $swstack = 32
      12. $hwstack = 32
      13. 'REMOVE the above command for the real program !!
      14. '$sim is used fr faster simulation
      15. 'note : tested in PIN mode with 4-bit
      16. Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
      17. 'These settings are for the STK200 in PIN mode
      18. 'Connect only DB4 to DB7 of the LCD to the LCD connector of the STK D4-D7
      19. 'Connect the E-line of the LCD to A15 (PORTC.7) and NOT to the E line of the LCD connector
      20. 'Connect the RS, V0, GND and =5V of the LCD to the STK LCD connector
      21. Rem with the config lcdpin statement you can override the compiler settings
      22. Dim A As Byte
      23. Config Lcd = 16 * 2 'configure lcd screen
      24. 'other options are 16 * 4 and 20 * 4, 20 * 2 , 16 * 1a
      25. 'When you dont include this option 16 * 2 is assumed
      26. '16 * 1a is intended for 16 character displays with split addresses over 2 lines
      27. '$LCD = address will turn LCD into 8-bit databus mode
      28. ' use this with uP with external RAM and/or ROM
      29. ' because it aint need the port pins !
      30. 'Einbindung der I2C-Bibliothek
      31. '$lib "i2c_twi.lbx"
      32. Config Sda = Portc.1
      33. Config Scl = PortC.0
      34. CONFIG PORTD.4 = output
      35. rest alias portd.4
      36. Const Pcf_w_adr = &Hc6
      37. Const Pcf_r_adr = &Hc7
      38. rest = 1
      39. Cls 'clear the LCD display
      40. Lcd "Vor I2C" 'display this at the top line
      41. wait 1
      42. toggle rest
      43. waitms 300
      44. toggle rest
      45. ' Config I2cdelay = 10 ' je höher der Wert umso langsamer der Bus
      46. I2cinit
      47. cls
      48. LCD "Demo I2C"
      49. wait 2
      50. I2cstart
      51. I2cwbyte Pcf_w_adr
      52. I2cwbyte &H01 'Power-up
      53. I2cwbyte &Hc2
      54. I2cwbyte &H50
      55. I2cstop
      56. cls
      57. LCD "Start durch"
      58. locate 2,1
      59. LCD Err
      60. wait 2
      61. I2cstart
      62. I2cwbyte Pcf_w_adr
      63. I2cwbyte &H30 'Frequenz
      64. I2cwbyte &H00
      65. I2cwbyte &H27
      66. I2cwbyte &H7e
      67. I2cstop
      68. cls
      69. LCD "Frequenzeinstellung durch"
      70. locate 2,1
      71. LCD Err
      72. wait 2
      73. I2cstart
      74. I2cwbyte Pcf_w_adr
      75. I2cwbyte &H31 'TX Power
      76. I2cwbyte &H00
      77. I2cwbyte &H00
      78. I2cwbyte &H7e
      79. I2cstop
      80. cls
      81. LCD "TX Power durch"
      82. locate 2,1
      83. LCD Err
      84. wait 2
      85. I2cstart
      86. I2cwbyte Pcf_w_adr
      87. I2cwbyte &H12 'TX Component enable
      88. I2cwbyte &H00
      89. I2cwbyte &H21
      90. I2cwbyte &H00
      91. I2cwbyte &H00
      92. I2cwbyte &H03
      93. I2cstop
      94. cls
      95. LCD "TX Component enable durch"
      96. locate 2,1
      97. LCD Err
      98. wait 2
      99. I2cstart
      100. I2cwbyte Pcf_w_adr
      101. I2cwbyte &H80 'GPIO_
      102. I2cwbyte &He
      103. I2cstop
      104. cls
      105. LCD "GPIO Func"
      106. locate 2,1
      107. LCD Err
      108. wait 2
      109. I2cstart
      110. I2cwbyte Pcf_w_adr
      111. I2cwbyte &H81 'GPIO_
      112. I2cwbyte &H07
      113. I2cstop
      114. cls
      115. LCD "GPIO set"
      116. locate 2,1
      117. LCD Err
      118. End
      Display All
    • dnwalker wrote:

      Jetzt sagt Ihr ja Bascom sendet immer mit 8Bit. Wie sieht das denn jetzt mit den Kommandos bei dem Chip aus?

      Sind da jetzt die Kommandos auch in 7Bit oder 8Bit?

      So richtig habe ich das noch nicht geschnallt.
      I2C sendet immer 8 Bit.
      Die Adresse wird oft in 7 Bit angegeben aber immer 8 Bit gesendet.
      An die 7 Bit Adresse wird als LSB noch das Schreib-Lese Bit angehängt.
      Damit hat die Adresse auch 8 Bit.
    • Ohne jetzt das Datenblatt studiert zu haben :
      Frag ihn was. Daran erkennt man meiß recht gut ob er richtig angesprochen wird.
      Sind da evt Zeiten zu beachten? (wait2)
      Gibs da noch andere Datenblätter nach dem das ich hier habe wäre Power_Up nur 01,
      Der GpO mit 80,01 als Output und 81,01 einzuschalten?

      The post was edited 1 time, last by Pluto25 ().

    • Schau Dir mal in dem Guide etwas weiter hinten die Beispiele für den Transmitter an.

      Dort steht bei Power_up ein anderer Wert.

      Die Chips gibt es wohl als Receiver und Transmitter und dann auch noch in verschiedenen Ausführungen.

      Ja eine Abfrage wäre eine Idee die ich auch schon machen wollte nur werden ja bei gewissen Abfragen mehrere Bytes als Antwort gesendet und ich weiß noch nicht wie ich da eine Abfrage mache und die Empfangenen Bytes in Variable packe und auf meinem LCD ausgebe.

      Wie gesagt ich habe bisher noch nie mit dem I2C gearbeitet und wenn ich mich da so im Netz umsehe muss das wohl nicht nur für mich ein Buch mit sieben Siegeln sein.

      Aber irgendwie werde ich diesen Chip schon dahin bringen wo ich will .... ;)

      Weitere Datenblätter habe ich nicht gefunden und leider auch kein Beispiel in Bascom.

      Wenn ich die Ahnung von c hätte würde ich mich durch das Beispiel von der Arduino IDE arbeiten aber leider habe ich c nie gelernt und kann mich auch mit der Syntax einfach nicht anfreunden.

      Gruß
      dnwalker