K (WTV020 wurde nach WTV020-Soundmodul am AVR-Microcontroller verschoben) |
|||
| Zeile 1: | Zeile 1: | ||
| − | |||
*Inhaltsverzeichnis | *Inhaltsverzeichnis | ||
Version vom 25. Juni 2014, 21:02 Uhr
- Inhaltsverzeichnis
- Einleitung
- Voraussetzungen
- Benötigte Hardware
- Hinweise zum Aufbau
- Funktionstest
- Anschluss an den Controller
- Troubleshooting
- Beispielcode mit AVR-assembler
- Autor:
Inhaltsverzeichnis
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 (Ich habe einen Attiny13 verwendet).
- Mehrere Micro-SD-Karten (max. 2GB),da nicht alle Karten funktionieren (Ich verwende ein 1GB-Karte).
- Ein Lautsprecher (8 Ohm). Ich weiss nicht, ob 4 Ohm für den WTV020 eine zu grosse Last sind.
- Die üblichen Elektronik-Kleinteile zur Beschaltung der IC's.
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 bei mir sowieso nicht funktioniert. Der WTV020 kann zwar auch theoretisch auf der Rückseite auf 5-Volt-Betrieb umgelötet werden. Dies hat bei mir ebenfalls nicht funktioniert und hat mich viel Zeit gekostet.
Funktiostest:
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.
Troubleshooting:
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 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-Diagrams 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
Autor:
- schachwolf (E-Mail: Schachwolf@web.de)