Hallo zusammen,
ich möchte meinen Röhrenvorverstärker mit einer Sprachausgabe erweitern. Dazu habe ich mir nach " Zitronenfalter " eine Platine angefertigt.
Ein Attiny45 setzt die I2C - Signale vom ATmega32 passend für das Soundmodul um.
Lautstärke ändern und einen Sound auswählen geht. Ich habe Probleme den Status des Busy auszulesen.
Der nähste Sound darf erst abgespielt werden wenn der vorrige fertig ist.
Wer hätte da mal eine Idee dazu.
Das Schaltbild ist die Platine mit dem Attiny welche ich über I2C ansprechen möchte.
Mein Testprogramm:
'*******************************************************************************
$regfile = "m32def.dat"
$crystal = 8000000
$hwstack = 256
$swstack = 256
$framesize = 256
Ddrd = &B00000000
Portd = &B11111111
'----------- Konfigation CD-Display -------------------
Config Lcd = 16 * 2 'LCD Zeichen Anzahl Options
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Cursor Off
Cursor Noblink
Cls
'-------------------------------------------------------------------------------
Config Sda = Portc.1 ' I2C Bus konfigurieren
Config Scl = Portc.0
Config I2cdelay = 5 ' je höher der Wert umso langsamer der Bus
Const Wtv020w = &H50
Const Wtv020r = &H51
I2cinit
Declare Sub Speakout(byval Song_nr As Word)
Declare Sub Wartewtv
Dim Busy As Byte
'###############################################################################
Test:
Locate 1 , 1 : Lcd " Sprachausgabe "
Do
If Pind.0 = 0 Then
Waitms 200
Locate 1 , 1 : Lcd " Spielt Sound 0 "
Call Speakout(00)
Call Wartewtv
Goto Test
End If
If Pind.1 = 0 Then
Waitms 200
Locate 1 , 1 : Lcd " Spielt Sound 1 "
Call Speakout(01)
Call Wartewtv
Goto Test
End If
Loop
'-------------------------------------------------------------------------------
' Lautstärke einstellen
I2cstart
I2cwbyte Wtv020w
I2cwbyte &HFF
I2cwbyte &HF7 ' &HF7 = volle Lautstärke
I2cstop
Waitms 300
'-------------------------------------------------------------------------------
' Spiel die Datei mit der Songnummer ab
Sub Speakout(byval Song_nr As Word)
I2cstart
I2cwbyte Wtv020w
I2cwbyte &H00
I2cwbyte Song_nr
I2cstop
Waitms 30
End Sub
'-------------------------------------------------------------------------------
' Wartet bis Datei abgespielt ist
Sub Wartewtv
Do
I2cstart
I2cwbyte Wtv020r
'I2crbyte &HFF , Nack
I2crbyte Busy , Ack
I2cstop
Waitms 30
Loop Until Busy = 0
Waitms 30
Locate 2 , 1 : Lcd Busy
End Sub
'-------------------------------------------------------------------------------
End 'end program
#####################################################################################################
I2C Steuerbefehle zum Attiny45
Für eure Hilfe wäre ich sehr dankbar.
Viele Grüße,
Wolfgang
Anhang anzeigen Platine_WTV020.zip
Anhang anzeigen Soundmodultester.pdf
ich möchte meinen Röhrenvorverstärker mit einer Sprachausgabe erweitern. Dazu habe ich mir nach " Zitronenfalter " eine Platine angefertigt.
Ein Attiny45 setzt die I2C - Signale vom ATmega32 passend für das Soundmodul um.
Lautstärke ändern und einen Sound auswählen geht. Ich habe Probleme den Status des Busy auszulesen.
Der nähste Sound darf erst abgespielt werden wenn der vorrige fertig ist.
Wer hätte da mal eine Idee dazu.
Das Schaltbild ist die Platine mit dem Attiny welche ich über I2C ansprechen möchte.
Mein Testprogramm:
'*******************************************************************************
$regfile = "m32def.dat"
$crystal = 8000000
$hwstack = 256
$swstack = 256
$framesize = 256
Ddrd = &B00000000
Portd = &B11111111
'----------- Konfigation CD-Display -------------------
Config Lcd = 16 * 2 'LCD Zeichen Anzahl Options
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Cursor Off
Cursor Noblink
Cls
'-------------------------------------------------------------------------------
Config Sda = Portc.1 ' I2C Bus konfigurieren
Config Scl = Portc.0
Config I2cdelay = 5 ' je höher der Wert umso langsamer der Bus
Const Wtv020w = &H50
Const Wtv020r = &H51
I2cinit
Declare Sub Speakout(byval Song_nr As Word)
Declare Sub Wartewtv
Dim Busy As Byte
'###############################################################################
Test:
Locate 1 , 1 : Lcd " Sprachausgabe "
Do
If Pind.0 = 0 Then
Waitms 200
Locate 1 , 1 : Lcd " Spielt Sound 0 "
Call Speakout(00)
Call Wartewtv
Goto Test
End If
If Pind.1 = 0 Then
Waitms 200
Locate 1 , 1 : Lcd " Spielt Sound 1 "
Call Speakout(01)
Call Wartewtv
Goto Test
End If
Loop
'-------------------------------------------------------------------------------
' Lautstärke einstellen
I2cstart
I2cwbyte Wtv020w
I2cwbyte &HFF
I2cwbyte &HF7 ' &HF7 = volle Lautstärke
I2cstop
Waitms 300
'-------------------------------------------------------------------------------
' Spiel die Datei mit der Songnummer ab
Sub Speakout(byval Song_nr As Word)
I2cstart
I2cwbyte Wtv020w
I2cwbyte &H00
I2cwbyte Song_nr
I2cstop
Waitms 30
End Sub
'-------------------------------------------------------------------------------
' Wartet bis Datei abgespielt ist
Sub Wartewtv
Do
I2cstart
I2cwbyte Wtv020r
'I2crbyte &HFF , Nack
I2crbyte Busy , Ack
I2cstop
Waitms 30
Loop Until Busy = 0
Waitms 30
Locate 2 , 1 : Lcd Busy
End Sub
'-------------------------------------------------------------------------------
End 'end program
#####################################################################################################
I2C Steuerbefehle zum Attiny45
Code:
' #########################################################################
' #
' # WAV-Soundmodul Attiny25/45/85 mit I2C Steuerung
' #
' # (c) HFEDV 06/2012 eMail: hal90009@aon.at
' # V 1.0.0
' #
' # Ausschließlich für den privaten Gebrauch!
' # Jedwede gewerbliche Nutzung ist untersagt!
' #
' #########################################################################
' #
' # Die Befehle werden über die I2C-Schnittstelle im Zwei-Byte-Format
' # gesendet.
' #
' # Die I2C-Geräteadresse ist vorerst auf hex50 bzw. dez80 festgelegt
' # kann aber 16 verschiedene Adressen annehmen (siehe Befehl FFAx)
' #
' # Hier ein Beispiel zum abspielen der Melodie hex34
' # I2Cinit-I2Cstart(50)-I2Cwrite(00)-I2Cwrite(34)-I2Cstop
' #
' # Ein weiteres Beispiel um das Modul zurückzusetzen
' # I2Cinit-I2Cstart(50)-I2Cwrite(FF)-I2Cwrite(EE)-I2Cstop
' #
' # Zum Abfragen des Status wird ein Byte wie folgt gelesen
' # I2Cinit-I2Cstart(51)-S=I2Cread()-I2Cstop
' #
' # Kommandos (alle Befehle in HEX von 0000 bis FFFF)
' # 00 00 bis 07 FF : Spielt Sound 0 bis 2047,
' # wenn belegt, dann wird nicht unterbrochen
' # sondern der Befehl verworfen
' #
' # 08 00 bis 0F FF : Spielt Sound 0 bis 2047,
' # wenn belegt, dann wird sofort unterbrochen
' # und sofort der neue Sound abgespielt
' #
' # FF F0 bis FF F7 : Setzt Lautstärke zwischen 0 bis 7 (0=min, 7=max)
' #
' # FF FE : Play/Pause
' #
' # FF FF : Stop
' #
' # FF EE : Reset Soundmodul
' #
' # FF 00 : Löscht das Error-Flag im Statusregister
' #
' # FF A0 bis FF AF : Setze I2C-Adresse von H50 bis H6E
' # Die Änderung wird erst nach neustart des Interfaces
' # aktiv.
' # Die Reset-Leitung wird nach erfolgter Änderung
' # für 250ms gesetzt (normal nur für 5ms, siehe Reset-Modul).
' #
' # Welche Adresse aktuell ist, kann mittels lesen des
' # Statusbytes ermittelt werden.
' # Bei ansprechen mit ungültiger Geräteadresse gibt das
' # Modul eben diese ungültige Adresse zurück
' # Bei Ansprecchen mit korrekter Adresse wird der Status
' # (siehe I2C-Lesen) zurückgegeben.
' # Es ist auch zwingend erforderlich, dass sich für diesen
' # Test nur das zu testende Modul am I2C-BNus befindet da
' # es anderenfalls zu Fehlinterpretationen kommen könnte!
' #
' # I2C-Lesen : Gibt Status als Byte zurück.
' # Die einzelnen Bits 76543210 bedeuten dabei
' # Bit 7 = 1 = Error, falsches Kommando
' # Wird gelöscht mit Clear after Status
' # Bit 1 = 1 = Pause (FFFE) activ"
' # Bit 0 = 0 = Busy, 1=Ready"
' #
' # Wird das Modul mit falscher Adresse angesprochen, wird
' # als Status die falsche Adresse zurückgegeben.
' #
' # Die Leseadresse ist I2C-Konform immer ungerade bzw.
' # um den Wert 1 erhöht.
' # Wenn die Schreibadresse 50 ist die Leseadresse 51.
' #
' #########################################################################
' #
' # HINWEIS: Beim µC wird der RESET-Pin als I/O-Port verwendet!
' # Daher ist eine ISP-Programmierung nicht möglich!
' #
' # Mögliche µCs sind jedenfalls die Tiny25/45/85
' #
' #########################################################################
Für eure Hilfe wäre ich sehr dankbar.
Viele Grüße,
Wolfgang
Anhang anzeigen Platine_WTV020.zip
Anhang anzeigen Soundmodultester.pdf