Zeile 10: | Zeile 10: | ||
**Troubleshooting | **Troubleshooting | ||
**Beispielcode mit AVR-assembler | **Beispielcode mit AVR-assembler | ||
+ | **Autor: | ||
===Einleitung:=== | ===Einleitung:=== |
Version vom 25. Juni 2014, 20:55 Uhr
Inhaltsverzeichnis
WTV020 Soundmodul am AVR-Microcontroller
- Inhaltsverzeichnis
- Einleitung
- Voraussetzungen
- Benötigte Hardware
- Hinweise zum Aufbau
- Funktionstest
- Anschluss an den Controller
- Troubleshooting
- Beispielcode mit AVR-assembler
- Autor:
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)