Aus RN-Wissen.de
Wechseln zu: Navigation, Suche


Einleitung:

Dieser Artikel richtet sich an Einsteiger, die das Soundmodul WTV020-SD16-P am AVR-Controller betreiben wollen. Er soll bei der Lösung von Problemen helfen, die bei der Inbetriebnahme des WTV020 auftreten. Er erhebt nicht den Anspruch auf Vollständigkeit, behandelt aber alle Tücken, die ich erlebt habe. Ziel ist es, dem Bastler die mehrtägige Fehlersuche, die ich erleiden musste, zu ersparen. Es richtet sich auch an Anwender, die an Stelle von BASCOM oder C lieber mit Assembler programmieren.

Voraussetzungen:

  • elektronische Grundkenntnisse
  • Grundkenntnisse in AVR-assembler
  • Das WTV020 Manual

Benötigte Hardware:

  • Ein Steckboard, um die Schaltung schnell aufzubauen (und Beschädigungen beim Löten zu vermeiden).
  • Ein WTV020-SD16-P (Das WTV020-SD20-S sollte ebenfalls funktionieren).
    Ich empfehle, gleich 2 Stück zu kaufen (das sollte bei einem Preis von ca. 3 Euro kein Problem sein). Ich habe 2 Stück gebraucht, bis es funktioniert hat!
  • Ein AVR-Controller (Hier wurde ein Attiny13 verwendet).
  • Mehrere Micro-SD-Karten (max. 2GB), da nicht alle Karten funktionieren (Ich verwende ein 1GB-Karte).
  • Ein Lautsprecher (8 Ohm). 4 Ohm könnten für den WTV020 eine zu grosse Last sein und zu einer Beschädigung führen.
  • Die üblichen Elektronik-Kleinteile zur Beschaltung der IC's.


Wtv020belegung deutsch490.jpg

Hinweise zum Aufbau:

Ich empfehle, die Schaltung auf einem Steckboard aufzubauen und mit einer 9-Volt Batterie mit 5-Volt Spannungsregler (7805) zu betreiben.
Dies hat den Vorteil, dass im Falle einer falschen Verdrahtung die Überlebens-Chancen der IC's steigen, da die Batterie nur einen begrenzten Strom liefert. Natürlich müssen noch 2 Dioden in die Versorgungsleitung eingebaut werden, um die Spannung auf ca. 4V herabzusetzen. Keine Angst! 4 Volt sind kein Problem. Unterhalb von 3,6 Volt hat das Teil im Test sowieso nicht funktioniert. Der WTV020 kann auch an der Rückseite auf 5-Volt-Betrieb umgelötet werden aber auch das hat in der Testschaltung nicht funktioniert. Daher sollte man diesen Eingriff erst ganz am Schluss vornehmen.

Funktionstest:

Formatiere die SD-Karte mit FAT16 -nicht FAT32!-.
Verwende auf jeden Fall zuerst die Beispieldateien im AD4-Format, die Du Dir vom Internet herunterladen kannst. Vermeide zunächst WAV-Dateien aus gerippten CD's. Diese haben bei mir nur ein total übersteuertes Krächzen erzeugt.
Teste das Teil zunächst im Tastermodus. Dies ist wirklich sehr einfach (s. WTV020-Manual).
Du hörst nichts? -> s. Troubleshooting. Es hat geklappt? - Dann geht es jetzt weiter.

Anschluss an den Controller:

Wichtig! Verbinde alle Leitungen zwischen dem WTV020 und dem Controller über 470 oder 510 Ohm (reset, busy, data, clk).
Wenn Du das nicht beachtest, wird sich der WTV020 höchstwahrscheinlich verabschieden. Bei einem Controllerboard mit 3,3V (wie z.B. RN-Avr Universal) können die Widerstände natürlich entfallen.

Troubleshooting:

WTV020 im Tastermodus:

  • Totenstille
    • Überprüfe Betriebsspannung und die Funktion des Lautsprechers (3,3 Volt sind unter Umständen nicht ausreichend). Ist hier alles in Ordnung, dann ist das Modul offensichtlich defekt. Es wurde bereits von kalten Lötstellen am Modul berichet.
  • Kein Sound, aber Knacken bei der Betätigung eines Tasters hörbar.
    • SD-Karte sitzt nicht korrekt im Slot (Kontaktproblem). Dies ist gar nicht so selten.
    • SD-Karte falsch formatiert. Diese muss mit FAT16 formatiert werden.
    • SD-Karte zu gross. Maximal 2 GB zulässig.
    • Unverträglichkeit mit SD-Karte. Nicht alle Karten funktionieren.
    • Falsches Format der Sound-Datei. Der WTV020 funktioniert nur mit Dateinamen die aus einer 4-stelligen Zahl und dem WAV- oder AD4-Format bestehen (z. B. "0001.AD4").
    • Modul defekt.

WTV020 am AVR (Two Line Serial Mode):

  • Totenstille
    • Modul defekt, obwohl dieses im Tastermodus funktioniert.
  • Knacken beim Einschalten, aber kein Sound.
    • Modul defekt, obwohl dieses im Tastermodus funktioniert. Das war bei meinem ersten Modul der Fall.
    • Programmfehler (zu kurze Timings). Die Warteschleifen lieber etwas länger lassen (Die Angaben im Datenblatt des WTV020 sind scheinbar etwas knapp bemessen).
    • Programmfehler (die Musikdatei, die im Programm angegeben ist, existiert nicht auf der SD-Karte).
    • Andere Programmfehler

Beispielcode mit AVR-assembler:


/*
 * WTV020.asm
 *
 *  Created: 22.05.2014 07:18:47
 *  Author: schachwolf@web.de
 */ 

/* 
 *  Dieses Programm wurde für den "attiny13" geschrieben, der mit 1MHz Taktfrequenz betrieben wird (Standardeinstellung).
 *  Die Warteschleifen wurden gemäß dem Timing-Diagram des WTV020 erstellt aber bewusst etwas länger gewählt, um eine
 *  zuverlässige Funktion des WTV020-Moduls zu gewährleisten.
 */

#include "tn13def.inc"		

.org 0x00
     rjmp start

.equ reset = 0				;alias-Namen für die einzelnen Portbits  
.equ data = 1
.equ busy = 2
.equ clk = 3
.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
.def temp4 = r19

start:

ldi temp1, RAMEND
out SPL, temp1	
ldi temp1, 0b00001011	                ;alle Ports ausser PB2 (busy) auf Ausgang
out DDRB, temp1
sbi PORTB, reset		        ;kein Reset
sbi PORTB, clk			        ;kein Takt

rcall warte_300ms		        ;Initialisierungsphase
cbi PORTB, reset 		        ;Diese Sequenz wurde gemäss dem Timing-Diagramm
rcall warte_5ms	                        ;aus dem WTV020-Datenblatt erstellt
sbi PORTB, reset		
rcall warte_300ms
					;Jetzt geht s los! Welche Titelnummer soll gespielt werden?
ldi temp1, 0b00000001                   ;Titelnummer (entspricht 0001.AD4 bzw. 0001.wav auf SD-Karte) -> low-byte
ldi temp2, 0b00000000                   ;Titelnummer -> high-byte
rcall uebergebe

warte_auf_WTV020:                       ;nun wird gewartet, bis der WTV020 fertig ist 
sbic PINB, busy
rjmp warte_auf_WTV020
rcall warte_300ms                       ;kleine Pause, bevor der nächste Titel gespielt wird
					;jetzt geht es zum nächsten Titel (0511)
ldi temp1, 0b11111111                   ;Titelnummer (entspricht 0511.AD4 bzw. 0511.wav auf SD-Karte) -> low-byte
ldi temp2, 0b00000001                   ;Titelnummer -> high-byte
rcall uebergebe

rjmp ende
		
uebergebe:                              ;Diese Funktion liest den Inhalt von temp1/temp2 und übergibt die Daten Bit für Bit an den WTV020  
     rcall hole_daten                   ;Das erste bit (Startbit) wird geholt 
     cbi PORTB, clk			; -> und an den WTV020 übergeben
     rcall warte_3ms                    ;Das Startbit braucht etwas mehr Zeit  (s. WTV020-Datenblatt)
                                        ;(Laut Datenblatt 2ms. 3ms sind sicherer) 
     ldi temp4, 15                      ;Die nächsten 15-bit müssen noch geholt und zum Soundmnodul übertragen werden
     sbi PORTB, clk
     uebergebe_1:			;Dies geschieht mit der Schleife "uebergabe_1"
     rcall warte_200us
     dec temp4				
     rcall hole_daten
     cbi PORTB, clk
     rcall warte_200us
     sbi PORTB, clk
     cpi temp4, 0
     breq uebergebe_ende								
     rjmp uebergebe_1
     uebergebe_ende:
ret	

ende:
	rjmp ende




hole_daten:                             ;das 16-bit-Datenregister (temp1/ temp2) wird insgesamt 16x 
     lsl temp1                          ;nach links geschoben und in Abhängigkeit vom carry-bit
     rol temp2                          ;wird anschliessend das Datenbit gesetzt bzw. nicht gesetzt  
     brcc hole_daten_2
     sbi PORTB, data
     rjmp hole_daten_ende
     hole_daten_2:
     cbi PORTB, data
     hole_daten_ende:
ret	

warte_3ms:                              ;warte 3,45 ms
     push temp1
     push temp2								
     clr temp1
     clr temp2
     warte_3ms_1:
     inc temp2	
     warte_3ms_2:
     inc temp1
     cpi temp1, 90							
     brne warte_3ms_2
     cpi temp2, 4
     brne warte_3ms_1
     pop temp2
     pop temp1
ret

warte_5ms:                              ;warte 5,6 ms
     push temp1
     push temp2								
     clr temp1
     clr temp2
     warte_5ms_1:
     inc temp2	
     warte_5ms_2:
     inc temp1
     cpi temp1, 90							
     brne warte_5ms_2
     cpi temp2, 6
     brne warte_5ms_1
     pop temp2
     pop temp1
ret

warte_200us:                            ;warte 270 us
     push temp1
     clr temp1				
     warte_200us_1:
     inc temp1
     cpi temp1, 65
     brne warte_200us_1
     pop temp1
ret

warte_300ms:                            ;warte 300 ms
     push temp1
     push temp2
     push temp3
     clr temp1
     clr temp2
     clr temp3
     warte_300ms_1:
     inc temp3	
     warte_300ms_2:								
     inc temp2
     clr temp1
     warte_300ms_3:
     inc temp1
     cpi temp1, 100							
     brne warte_300ms_3
     cpi temp2, 250
     brne warte_300ms_2
     cpi temp3, 3
     brne warte_300ms_1
     pop temp3
     pop temp2
     pop temp1
ret

Bascom Beispielprogramm

'##############################################################
'wtv020_ansteuerung.bas
'
'Ein  Testprogramm für die Universalplatine RN-AVR UNIVERSAL
'
'Das Programm zeigt wie man das Sprachausgabemodul wtv020 ansteuert
'und beliebige Sound Dateien abspielen kann
'
'Bezug: Sprachmodul; Speicherkarte; RN-AVR UNIVERSAL www.robotikhardware.de
'Weitere Beispiele auf DVD oder im www.Roboternetz.de und rn-wissen.de
'######################################################################

'Portbelegung bzw. Modulverbindung
'DATA  PB1
'BUSY  PB2
'CLK   PB3
'RESET RESET
'GND   GND
'3V    3V



Declare Sub Speakout(byval Song_nr As Word)
Declare Sub Warteaudio()



$programmer = 12                                            'MCS USB  (Zeile weglassen wenn anderer Programmer)
$prog &HFF , &HFF , &HD9 , &HFE                             'Fusebits richtig programmieren (Quarz ein,Jtag aus)

$regfile = "m644pdef.dat"
$framesize = 32
$swstack = 32
$hwstack = 64

$crystal = 8000000                                          'QuarzFrequenzuenz
$baud = 9600
Baud = 9600

' ************ Hilfsfunktionen zur Kommunikation mit Spachausgabemodul wtv020 (c) Robotikhardware.de **************
'  (nähere Infos im Datenblatt des Sprachausgabemoduls auf der www.Robotikhardeware.de DVD)
Dout Alias Portb.1
Clk Alias Portb.3
Config Dout = Output
Config Clk = Output
Config Pinb.2 = Input
Busy Alias Pinb.2


Dout = 0
Clk = 1
Wait 3
' ************  **************  ************  ************** ************  ************** ************  ***********


Config Pind.6 = Output                                      'LED
Led1 Alias Portd.6



 Led1 = 0                                                   'ein

 Do

 Call Speakout(450)
 Warteaudio
 Call Speakout(451)
 Warteaudio
 Call Speakout(1)
 Warteaudio
 Call Speakout(2)
 Warteaudio
 Call Speakout(3)
 Warteaudio

 wait 15
 Loop


' ************ Hilfsfunktionen zur Kommunikation mit Spachausgabemodul (c) Robotikhardware.de **************
'  (nähere Infos im Datenblatt des Sprachausgabemoduls siehe www.Robotikhardeware.de oder DVD)


'Spielt die Datei mit der Songnummer als Dateiname
Sub Speakout(byval Song_nr As Word)
'  Waitms 2                                                  'Startimpulse
  Clk = 0
  Waitms 2
  Shiftout Dout , Clk , Song_nr , 1 , 16 , 200              'Liednummer übertragen
  Waitms 30
  Clk = 1
  Waitms 10
End Sub


'Wartet bis Audio Datei abgespielt wurde
Sub Warteaudio()
  Do
  Loop until Busy = 0
  Waitms 10
End Sub

Video zum Sprachmodul


Autor:

  • schachwolf (E-Mail: schachwolf@web.de)

Weblinks