Hallo Gemeinde
Den folgenden Code habe ich versucht anzupassen. Er wird ohne Fehler
copieliert, bringt aber keine Funktion .- sagt gar nichts
Leider ist mir die Sache nicht klar was los ist.
Daten AT1284p, C, 16 MHZ, Taster PC2, Lsp. PC7
Inputformat der Melodien ist Nokias RTTTL-Format. Der Rest ist aus dem Quelltext ersichtlich!
4
Wobei im vorliegenden Programm aber der RTTTL-Parser gleich mit drin ist und somit ohne externen
5
Konverter auskommt. Man kann RTTTL-Klingeltoene ohne Anpassung an der entsprechenden Stelle im
6
Programm eingefuegt werden
7
* Nachteil: es wird etwas mehr Speicherplatz fuer das Programm verbraucht
8
* Hardware:
9
(ATtiny85) AT1284p in Standardbeschaltung Folgende Peripherie:
10
- an PC7 ist ein Lautsprecher angeschlossen. Ich habe dazu eine dieser laermenden Geburtstagskarten
11
gepluendert. Dieser Lautsprecher wurde direkt angeschlossen, eventuell sollten aber bei anderen Modellen Strombegrenzungswiderstaende vorgesehen werden.
12
- an PC2 ist ein Taster angeschlossen, der den Tiny aus dem Schlaf reisst und ihn die naechste Melodie dudeln laesst. Der geschlossene Taster legt GND an den Pin, es sollte ein PullUp-Widerstand von 10kOhm vorgesehen werden.
constcharm3[]PROGMEM="Peter Schilling - Major Tom:d=4,o=6,b=200:c.,8p,c,c,c.,8p,c.,8p,2a5,2c,c,8a#5,8a5,g.5,8p,2a#5,2d,2d,c.,8p,2a5,2c,c,8a#5,8a5,g.5,8p,2a#5,2d,2d,e.,8p,1f,2e,d,c,2d.,c,2d,e.,8p,1f,2e,d,c,2d.,c,2d,2";
{// lustiger Nebeneffekt des Zugriffs auf den Flash-RAM: die Zeit die dazu notwendig ist, fuegt // eine kleine Pause zwischen den Toenen ein, die auch ganz sinnvoll ist...
Achim Seeger schrieb:> Vielleicht könnte jemand drüber schauen
Ich würde mal prüfen, ob Du überhaupt die beabsichtigte Melodie ausliest
und nicht irgendwelchen Datenmüll.
Ich als Arduino-Programmierer verhaspele mich per default regelmäßig
dabei, auf ein Array of PROGMEM-Konstanten über ein Array von
PROGMEM-Pointern zuzugreifen und brauche dann stets serielles Debugging,
um mir das auszubaldowern, wie die Zugriffe mit Pointern und pgm_read...
in sich stimmig sind.
So auf Anhieb würde ich erstmal sagen, dass Deine Melodieanfänge im
Programm nicht "array of char" sein sollen:
1
constcharma[]PROGMEM="m4, m1, m2, m3";
sondern dass da ein "array of char pointer" definiert werden sollte, und
das nicht als String, sondern als Array of Pointer:
Habe die Zeile noch mal kontrolliert. War fehlerhaft übertragen. Habe es
jetzt geändert und bekomme ein Fehlermeldung:
Error 1 variable 'ma' must be const in order to be put into read-only
section by means of '__attribute__((progmem))'
Sorry, versteh nicht was ich machen soll.
achim
Achim Seeger schrieb:> Sorry, habe die Zeile und die übersetzung vergessen. Kommt sofort>>
1
>constchar*ma[]PROGMEM={m4,m1,m2,m3};
2
>
3
>/*
4
> \ Fehler 1 Variable 'ma' muss const sein, um mit Hilfe von '__attribute
5
> __ ((progmem))'
6
> E in Nur-Lese-Abschnitt gesetzt werden .c 63 13 Sound_V1_1
7
> */
8
>
>> Was sagt mir diese Zeile?
Die Fehlermeldung besagt, dass der Compiler den Code nicht fressen
möchte.
Das ist ja gediegen!
Ich habe es selbst gerade mal mit der Arduino-IDE getestet:
Mit einer alten AVR-GCC Compilerversion (Arduino 1.0.5) wird der Code
fehlerfrei compiliert.
Mit einer neuen AVR-GCC Compilerversion (Arduino 1.5.7) erzeugt der Code
beim Compilieren die Fehlermeldung.
Mit ist bekannt, dass am AVR-GCC etwas an der PROGMEM-Verarbeitung von
Flash-Konstanten geändert wurde, so dass es nun zwingend erforderlich
ist, PROGMEM-Konstanten als "const" zu deklarieren.
Aber dass sich auf die altbekannte Art überhaupt keine Stringtabellen
mehr vollständig im Flash-Speicher anlegen lassen, war mir neu. Ich
konnte auch nicht über Google herausfinden, was da die neue Alternative
sein soll. Mit ein bisschen Tüfteln bin ich auf diese Zeile gekommen,
die der Compiler akzeptiert:
Da String-Pointer auf 8-Bit AVRs ja im Endeffekt Integers sind, sollte
es damit funktionieren. Ich habe allerdings nur getestet, dass sich der
Code damit COMPILIEREN läßt. Das Funktionieren habe ich mangels Hardware
NICHT getestet.
Hallo Jürgen
habe es sofort versucht. Es lässt sich ohne Fehler compilieren. Leider
keine Funktion
Sorry, wenn du schon gediegen nimmst, was bleibt mir noch zu sagen.
Vermute das einiges Profis hier mitlesen. Vielleicht gibt es ein
klärendes wort dazu? Hallo ...
achim
Achim Seeger schrieb:> Hallo Jürgen> habe es sofort versucht. Es lässt sich ohne Fehler compilieren. Leider> keine Funktion
Also ich habe das Programm mit meiner Änderung mal in die Arduino-IDE
geladen und lasse mir in der Play-Funktion die zu spielenden Noten auf
dem "Seriellen Monitor" ausgeben.
Debug-Code der dekodierten Noten auf Arduino:
my_delay_ms(dauer_ms); // Ton fuer berechnete Dauer halten
12
ctc_off(); // Ton ausschalten
13
*/
14
}
Serielle Ausgabe der dekodierten Noten und der zu spielenden Frequenz
beim Song "Yesterday":
1
NoteOktaveFreq.Dauer
2
752550480
3
552864240
4
552864480
5
952271240
6
1152023240
7
161804240
8
261702240
9
461516480
10
561431240
11
461516480
12
261702240
13
261702480
14
261702240
15
261702240
16
061911240
17
1052144240
18
952271240
19
752550240
20
1052144240
21
952271240
22
952271240
23
952271480
24
752550480
25
552864480
26
952271240
27
752550240
28
752550480
29
253400240
30
552864480
Also wenn Du mit der Hardware diese Noten/Frequenzen mit den
Abspieldauern in Millisekunden ausgibst, sollte eigentlich etwas zu
hören sein.
Wenn nicht, dann dürfte entweder etwas mit der eigentlichen
Tongenerierung in Deinem Programm nicht stimmen. Oder es stimmt etwas
nicht mit der Hardwareschaltung für die Tonausgabe.
Achim Seeger schrieb:> Hallo Jürgen> es könnte sein das der verwendete PC7 gar nicht für sowas geht. Mal> sehen was ich an der Hardware schnell machen kann.
Ich muß mal sehen, ob ich irgendwo noch einen alten PC zur Entsorgung
abgestellt rumstehen habe, wo ich mir schnell mal einen
Kleinstlautsprecher zum Testen ausbauen kann. Dann könnte ich mal mit
einem Atmega328 probieren, ob mit Deinem Code Töne ausgegeben werden.
Aber mal eine andere Frage:
So wie ich im Thread Beitrag "Einfache Tonerzeugung" sehe,
spielst Du schon seit über zwei Jahren mit einfacher Piepstonausgabe auf
8-Bit AVR Controllern herum. Hast Du in den zwei Jahren noch keine
verlässliche Möglichkeit gefunden, "Sinustöne" bestimmter Piepsfrequenz
an einem Pin auszugeben?
In dem Fall wäre mein Rat, sich mal "Arduino" näher anzusehen. Da gibt
es für diverse Standardaufgaben entweder Funktionen in der Arduino
Core-Library, oder in mitgelieferten Libraries, oder von Leuten aus der
Arduino-Community, die eigene Libraries als Open Source anbieten. Zur
Tonerzeugung ist sogar direkt im Arduino-Core eine Funktion dabei:
http://arduino.cc/en/pmwiki.php?n=Reference/Tone
Damit zauberst Du quasi mit Null Aufwand und ohne irgendwelche Register
"zu Fuß" programmieren zu müssen, eine Audio-Tonfrequenz auf einen
Ausgabepin.
Mit direkter Registerprogrammierung der AVR-Controller kenne ich mich
selbst nur schlecht aus. Ich muß mal sehen, ob ich das in Deinem Sketch
nachvollziehen kann, zumindest auf Atmega328. Aber vorher benötige ich
erstmal einen Lautsprecher zum Testen.
Du müßtest auch darauf achten, dass die erzeugten Frequenzen wirklich
genau erzeugt werden. Wenn Du beispielsweise statt 1804 oder 1702 Hertz
andere Frequenzen erzeugst, die acht- oder sechzehnmal so hoch sind,
dürftest Du wohl kein hörbares Audiosignal mehr erhalten.
Hallo Jürgen
ist eigentlich eine einfache Sache. Im Jahre 2012 habe ich noch viel mit
dem Nibo 2 gemacht. Dieser hat den Ausgang mit dem OPV drauf. Habe
versucht was in Hardware und Bus dazu zu bauen und Erweiterungen zu
machen. Der Hersteller nutzt seine eigenen Libs usw. und gibt keine oder
sehr wenig Info. Dann noch alles open source. Irgendwann hatte ich keine
Lust mehr, blöde Fragen zu stellen und keine Antworten zubekommen. Habe
dann an dem I2C Bus weiter gemacht und einiges dazu gebaut und
programmiert. Verwende jetzt den AT1284p auf einem eigenen Board und ca.
20 zusätzliche Platinen. Alles in einem einheitlichen System mit
gleichen Anschlüssen. Dadurch kann ich alles zusammenstellen wie ich
möchte und ständig erweitern und umbauen und umstecken. Dazu zählen
Netzteile, Anzeigen, Relais, Triax, Fernbedienung, 8 und 16 Bit Ein- und
Ausgänge, die Kombinationen zwischen Bus und Port, Übertragung des Bus
auf Entfernung bis hin zum Multitasking und der Kombination aus beiden
Sachen. Zufällig habe ich auf dem PC7 einen Piezo Lautsprecher
eingebaut. Diesen wollte ich zur Ausgabe eines Tones nutzen. Mit einer
einfachen Art (delay) klappt es sehr gut. Vom Nibo kannte ich noch das
RTTTL und woltte es auch so machen. Das klappt leider nicht. Dietr hat
schon geschrieben, das der PC7 nicht da für geht. Da kein PWM. Wustte
ich nicht. Muss mir wohlwas anderes überlegen.
achim
Vielleicht erklärt hier mal jemand, wie sich das mit den PWM Ausgängen
der Timer verhält..
Wenn der Timer 0 benutzt wird, dann kommt der Pieps an einem Pin raus,
der auch als OC0 bezeichnet ist, wenn's der Timer1B ist, piepst's nur
wenn der Speaker an einem Pin mit der Zusatzbezeichnung OC1B hängt.
In "doc2467.pdf" (von Atmel Seite downloadbar) ab Seite 82 geht's los..
oder etwas auf deutsch:
[[http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR]]
und das mit den Titeladressarray geht bei mir so (im Studio 6)
1
/***************************************************** TITEL STARTADRESSE
2
3
-> nr = Titelindex (Titelnummer-1) in der songs[] Liste
4
5
<- Startadresse des RTTTL Notenstrings im Flash
6
Der Zeiger wird zur Titelanzeige mit show_titel() verwendet
7
und / oder an den RTTL Parser play_song() übergeben