MoinMoin,
anbei der C-Quelltext für ein elektronisches Metronom, welches
hardwareseitig mit einem ATmega8, einer 7-Segmentanzeige, einem
Piezo-Summer und 3 Tastern realisiert wurde.
Der Quelltext sollte ausreichend kommentiert sein, sodass man auch die
Schaltung herauslesen kann. Ansonsten findet man hier eine kleine
Beschreibung zu dem Projekt:
http://www.bralug.de/wiki/Elektronisches_Metronom
Grüße Uwe
Gast schrieb:
> Wäre ein "Ticken", "Klicken", "Klacken" oder "Knacken" nicht besser als> ein "Piepen"?
ja, wäre natürlich besser und würde ich auch implementieren, wenn mir
jemand einen Tipp gibt, wie man den authentischen Metronomton (auf der
gegebenen Hardware) erzeugen könnte.
Uwe
Vielleicht mit nem Lautsprecher statt Piezo und dann Ein und wieder
Ausschalten. Evt ein Kondensator in Reihe wegem Gleichstrom. Weiß aber
nicht ob das laut genug ist und ob du das ganze noch so umabauen willst
;)
Ansonnsten find ich das Projekt nicht schlecht.
Karl schrieb:
> Vielleicht mit nem Lautsprecher statt Piezo und dann Ein und wieder> Ausschalten. Evt ein Kondensator in Reihe wegem Gleichstrom.
So habe ich das zumindest schon mehrfach gesehen. Es sollte also
funktionieren.
> Weiß aber nicht ob das laut genug ist
Es ist nur eine Frage der Spannung/Strom/Kapazität und des
Lautsprecherdurchmessers.
Ein großer Kondensator erzeugt eher ein Plop, für ein Tack müsste man
vermutlich die die Kapazität kleiner machen und Spannung erhöhen (wegen
der Lautstärke).
Hallo,
ich habe grad versucht, dieses Metronom nachzubauen.
Leider bis jetzt ohne Erfolg. Ich habe einen "normalen" Mega16ß für die
schaltung verwendet. Ausserdem habe ich die controllerbeinchen etwas
anders belegt:
meine Schaltung | gegebene Schaltung
------------------------------------
PC0 |PD7
PC1 |PD7
PC2 |PD7
PC3 |PD7
PC4 |PD7
PC5 |PD7
PC6 |PD7
PC7 |PD7
PA0 |PD7
PA1 |PD7
PA2 |PD7
PA3 |PD7
PA4 |PD7
PA5 |PD7
Daraufhin habe ich den Code (so gut ich konnte) angepasst - also einfach
die neuen Werte eingetragen. (siehe Anhang)
Leide bleibt das metronom mit dem Code einfach dunkel. es passiert
einfach garnichts. Kann mir bitte jemand helfen, und mir sagen, ob ich
etwas großartig falsch gemacht hab? (also beim code)?
Die Schaltung habe ich nun schon etliche male kontrolliert. Ich bin mir
einfach sicher dass die richtig ist.
Liebe Grüße,
Hannes
Hallo Hannes,
... ich dachte du hast das Ding schon aufgebaut und es funktioniert...,
aber was soll's, das bekommen wir schon hin ;-).
Ich gehe mal davon aus, das die Tabelle in deinem Posting oben nicht
stimmt, rechts steht überall PD7 drin.
Ist der angehangene Quelltext dein modifizierter? Beim ersten
drüberschauen fällt mir folgendes auf, was da nicht stimmen wird:
1
#define SEGM_DDR DDRD
2
#define SEGM_PORT PORTD
3
#define SEGM_A PC2
4
#define SEGM_B PC3
5
#define SEGM_C PC5
6
#define SEGM_D PC6
7
#define SEGM_E PC7
8
#define SEGM_F PC1
9
#define SEGM_G PC0
Du musst natürlich auch SEGM_DDR und SEGM_PORT anpassen, wenn du die
Pins eines anderen Ports benutzt:
1
#define SEGM_DDR DDRC
2
#define SEGM_PORT PORTC
3
#define SEGM_A PC2
4
...
Desweiteren meinst du mit Mega16ß einen Mega168? beim m168 heissen ein
paar Register (vorallem die für die Timer) anders. Aber da müsstest du
schon Compilerfehler bekommen haben....
Grüße Uwe
PS.: Berichte mal, wenn es läuft. Bzw. wenn nicht frage nochmal...
Hallo, danke für die Antwort!
Oh mann, da waren wohl doch einige schreibfehler in meinem Posting:
1. es handelt sich um einen mega16. wahlweise auch mega32.
2. ja, die Tabelle ist natürich nicht richtig
so sollte sie aussehen:
meine Schaltung | gegebene Schaltung
------------------------------------
PC0 |PD7
PC1 |PD6
PC2 |PD0
PC3 |PD1
PC4 |PB0
PC5 |PD3
PC6 |PD4
PC7 |PD5
PA0 |PC0
PA1 |PC1
PA2 |PC2
PA3 |PC3
PA4 |PC4
PA5 |PC5
3. Danke für den Hinweis, dass ich ja auch (natürlich) SEGM_DDR und
SEGM_PORT anpassen muss!
Nun sieht das ganze schon sehr sehr viel besser aus!
Es bleiben nur 2 Probleme üprig, die behoben werden sollten ;)
1. ich höre aus dem piezo pieper keinen pieps. Wenn ich direkt 5V
Anlege, dann funktioniert das ding.
2. Es funktionierten segmente nicht. Undzwar: a,b und c. Das betrifft
alle der 4 7-Segmet anzeigen. und vor allen dingen leuchten sie nicht
egal was ich einstelle.... -> woran kanns liegen? code oder Schaltung?
Vielen Danke trotzdem für die schnelle Antwort!
hannes schrieb:
> 1. ich höre aus dem piezo pieper keinen pieps. Wenn ich direkt 5V> Anlege, dann funktioniert das ding.>
hmm, hast du einen aktiven oder passiven Piezo? Aktiv heißt, wenn du
eine entsprechechende Gleichspannung anlegst, piepst das Ding schon. Bei
passiven Piezos hört man nur einen kuzes Knacken.
Meine Schaltung/Sofware ist für einen passiven Piezo ausgelegt und der
Ton wird vom AVR erzeugt.
Wie sieht es mit der Taktfrequenz aus, ich verwende die internen 1Mhz
des Mega8, das Programm ist dafür auch so ausgelegt.
> 2. Es funktionierten segmente nicht. Undzwar: a,b und c. Das betrifft> alle der 4 7-Segmet anzeigen. und vor allen dingen leuchten sie nicht> egal was ich einstelle.... -> woran kanns liegen? code oder Schaltung?>
hmm, vielleicht doch ein Verdrahtungsfehler?
Die richtigen Widerstände hast du auch drin? Basiswiderstände 1K,
LED-Vorwiderstande 330Ohm (weil die 3 Ports sind in meiner Schaltung die
für die Stellentreiber, also Transistoren mit 1K-Basiswiderstand...)
Grüße Uwe
Hi,
ja, die richtigen Wiederstände sollten drin sein. Ich habe grad nochmal
alles Durchgemessen!
Vllt. hilft das ja weiter: http://tinyurl.com/362adjb So sieht das ganze
aus, wenn es strom bekommt.
Ich glaube, es handelt sich wirklich um einen Aktiven Piezopiepser, denn
er sagt etwas, wenn ich ihn mit strom (direkt 5V) betreibe.
Grüße,
Hannes
Hannes schrieb:> Ich glaube, es handelt sich wirklich um einen Aktiven Piezopiepser, denn>> er sagt etwas, wenn ich ihn mit strom (direkt 5V) betreibe.>
dann im Quelltext nur das entsprechenende Port auf Hight wenn Ton an und
auf Low, wenn Ton aus. Und den Timer, der bei mir die Frequenz für den
Piezo erzeugt, solltest du deaktivieren...
Alles andere später, ich muss mal kurz weg....
Grüße Uwe
... bin wieder kurz am Rechner.
Irgendwie sind Pins vertauscht. An der ganz linken Anzeige in deinem
Video bitzt auch das Segment e(?) im Takt auf. Es sollten aber lt.
Programm (und so ist es auch an meinem Teil, habe gerade nochmal
nachgesehen...) die Segmente a, g, d blinken.
Bitte überprüfe doch nochmal die Schaltung und/oder die neue
Portzuordnung in dem Quelltext...
Bis dann, Uwe
zu der Reihenfolge der Stellen: die scheint, zumindestens, wenn man nach
dem Video geht, richtig zu sein.
In dem Datenblatt ist die Anschlußbelegung nicht ersichtlich. Ich weis
auch nicht mehr so genau, ob in meinem Schaltplan die Zahlen für die
Display-Anschlüsse die sind, wie auch in der Realität, vielleicht habe
ich da in der Software etwas "ausgebessert"...
Also mal systematisch mit einem Testprogramm vorgehen:
* kopier mal das Programm und schmeisse in main() vor der while-Schleife
das write_text und write_zahl raus
* innerhalb der while-Schleife auch alles (das while an sich aber
lassen)
* die Elemente des Feldes value[] gezielt setzen:
Diese Feld ist quasie der Bildspeicher. jedes Element
value[0]...value[3] entspricht einer Anzeige-Stelle, jedes Bit eines
Feld-Elements einem Segment der entsprechenden Stelle. Wobei aber nur 7
Bit gebraucht werden, den Punkt scheine ich nirgendwo in dem Programm
anzusteuern. Es gibt relativ weit oben im Programm ein Kommentar welches
Bit des Feld-Elementes, welchem Segment bei MIR entspricht. Da ich den
Kommentar drin habe, denke ich mal, dass ich es durch probieren
ermittelt habe...
1. Test --> in value[0]...value[3] eine 255 (0xFF, 0b11111111)
reinschreiben. Es sollten allen Segmente angehen! Ansonsten liegt ein
Schaltungsfehler oder ein Fehler beim Ändern der Portzuordnung im
Programm vor!
Folgetests: jedes Bit mal einzeln setzen und sich merken, welches
Segment dann leuchtet.
Mit dieser Zuordnung musst du dann die wilden Bitmuster für die Zahlen
und Buchstabenfolgen ändern...
Versuche es bitte mal so.
Grüße Uwe
Hallo Hannes,
bist du schon weiter gekommen?
Ich denke mal, nachdem ich noichmal eine Nacht darüber geschlafen habe,
dass der Schaltplan, die Firmware auf meiner Projektseite und meine
aufgebaute Hardware nicht 100% kompatibel sind und ich im Nachhinein die
Firmware entsprechend angepasst habe bis das gewünschte Ergebnis da
war...
Grüße Uwe
Hallo,
danke für die Hilfe bisher, aber ich bin nicht weitergekommen. Ich habe
den code jetzt mal so geändert: (siehe anhang)
Das sollte ja dem entsprechen, was du geschieben hast. Es ist nun
folgendes Passiert: nichts leuchtet mehr, aber in der letzten 7-segment
anzeige blinken 2 leds...
irgendwie komisch.
Hast du noch irgendwelche ideen?
Lg.
Hannes
Hi!
>2. Es funktionierten segmente nicht. Undzwar: a,b und c. Das betrifft>alle der 4 7-Segmet anzeigen. und vor allen dingen leuchten sie nicht>egal was ich einstelle.... -> woran kanns liegen? code oder Schaltung?
Wenn Port C im Spiel ist,
einfach mal so aus dem Bauch raus: AVCC?? JETAG??
Viel Erfolg, Uwe
Hallo Hannes,
der "Uwe" vom letzten Post war ich nicht, die Anmerkung könnte aber
berechtigt sein...
Aber zu deinem abgeänderten Quelltext: stimmt fast, die vielen 0en und
1en für die Felder im PROGMEM hättest du lassen können.
Aber nimm noch die Zeile mit clear_all_digits() vor der While-Schleife
raus.
Was passiert jetzt?
Wenn nicht alle Segmente (ausser der 1.Stelle; siehe weiter unten)
leuchten, andere mal folgende Zeile
ab. (ich weis jetzt nicht aus dem Stehgreif, ob die Segmente bei einer 0
oder 1 leuchten müssen). Bei einer der Kombinationen müssen aber alle
Segmente der 2.,3. und 4.Stelle leuchten!
Dann sollest du 0xff (oder 0x00) durch andere Bit-Kombinationen
austauchen, am besten immer nur eine Bit-Stelle, damit du rausbekommst
welches Bit für welches Segment ist...
Das die erste Stelle (ganz links) weiter im Takt blinkt ist ok, weil die
wird in einer Timerroutine weiterhin entsprechend abwechselnd
gesteuert....
Grüße Uwe
Hi,
wenn ich die Zeile clear_all_digits() entferne, leuchten die elemente
d,e,f und g. A,b und c bleiben weiterhin aus (siehe einigie Posts weiter
oben).
Das bringt leider auch nichts, nur dass die anderen elemente die grad
noch leuchteten auch aus sind. hmm
Element A hängt an PC2 (TCK), Element B hängt an PC3 (TMS) und Element C
hängt an PC5 (TDI).
Was meinte der "andere" Uwe mit AVCC, JETAG?
Liebe Grüße,
Hannes
Ich hab jetzt mal manuell versucht, die elemente zum leuchten zu
bekommen, indem ich PC2, PC3 und PC5 mit PC1 verbunden habe. dann
leuchten alle. Also scheint es irgendwie doch ein Programmfehler zu sein
oder?
Liebe Grüße und danke für die Mühe!
Hannes
Hallo,
nun noch eine Nachricht von mir: Irgendwie ist das alles ziemlich
komisch! Ich habe jetzt mal aus frust eine Neue schaltung
zusammengeschustert, in der ich ganz simpel Leds an den PortC gehangen
habe. Also direkt (mit vorwiederstand ;) ). Das Programm dazu war
ähnlich simpel:
1
#include <avr/io.h>
2
3
int main (void) {
4
DDRC = 0xff;
5
while(1) {
6
}
7
return 0;
8
9
}
Das sonderbare ist nun, dass genau an den beinchen, wo Die Elemente A,B
und C hängen die Leds NICHT leuchten. (also PC2, PC3, PC5)?!?!?!
Warum zur hölle?! Ich habe das ganze jetzt auch schon mit einem Mega32
Probiert (hätte ja sein können, dass der Controller irgendwie kaputt
ist...)
Vielleicht zu meinem Setup: ich programmiere im Texteditor, habe
folgendes makefile benutzt: (anhang), ich schreibe das Programm mit
einem "mysmartUSB MK2" auf den Controller. mysmartUSB hängt an einem
Mac- und hat vorher auch nie Probleme gemacht.... Für den Transfer nutze
ich avrdude mit folgendem befehl: "avrdude -c avr911 -e -p m32 -P
/dev/tty.SLAB_USBtoUART -b 19200 -U flash:w:main.hex"
Und das ist die Ausgabe beim Schreiben des Programms:
1
macerei:Desktop hannes$ make
2
3
-------- begin --------
4
avr-gcc (GCC) 4.1.1
5
Copyright (C) 2006 Free Software Foundation, Inc.
6
This is free software; see the source for copying conditions. There is NO
7
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Ich weis wirklich nicht mehr weiter!!
Vielleicht kann ja mal jemand anderes dieses klitzekleine Programm
kompilieren, und die hex datei hier reinstellen, damit ich gucken, kann
ob es wirklich an mir liegt... (zur verfügung hab ich hier mega32 und
mega16...
Liebe Grüße,
Hannes
MoinMoin,
Hannes schrieb:> Was meinte der "andere" Uwe mit AVCC, JETAG?
Der Pin AVCC des MC sollte mit VCC (5V) verbunden sein.
JTAG: der Programer sollte nach dem Programmieren des Flashs wieder
rausgezogen werden, denke ich mal....; sonst könnte es ein paar lustige
Nebeneffekte geben.
Zu dem merkwürdigen Phänomän mit den Segmenten a, b, c: deine Test
deuten aber wirklich auf einen Verdrahtungsfehler in. Bist du dir
wirklich sicher, dass:
1) alle entsprechenden Kabel richtig verdrahtet sind und es auch kein
Kurzschluss irgendwo gibt --> Durchgangsprüfer (habe auch mal in einer
anderen Schaltung stundenlang einen Kurzschluss suchen müssen...)
2) die Anschlussbelegung deiner 7-Segment-Anzeigen auch richtig in
deiner Schaltung richtig umgesetzt sind. Probiere doch mal die einzelnen
Segmente einer Anzeige mit 5V und einem Vorwiderstand (ca. 330...1K)
durch....
3) du durch irgendeinen Test ausgerechnet diese Segmente zerschossen
hast (wäre aber sehr unwahrscheinlich, wenn es dann gleich alle 4
Anzeigen betroffen hätte)
Der Test mit 0xff (oben) muss alle Segmente zum leuchten bringen (ausser
die Stelle ganz links, die durch den einen Timer blinken sollte)!
Grüße Uwe (und gebe nicht auf...)
... achso, die Geschichte ohne Vorwiderstand und LEDs einschalten
solltest du nicht allzu oft machen. Auf Dauer raucht da was ab!
Grüße Uwe
PS.: ähm, habe gerade nochmal nachgelesen, du hattest doch
Vorwiderstände bei dem einen Test drin....;-)
1) alle entsprechenden Kabel richtig verdrahtet sind und es auch kein
2
Kurzschluss irgendwo gibt --> Durchgangsprüfer (habe auch mal in einer
3
anderen Schaltung stundenlang einen Kurzschluss suchen müssen...)
wie ich geschrieben habe, habe ich extra nochmal eine andere Schaltung
aufgebaut. Ganz simpel NUR led+ Vorwiederstand an den Controller. Auch
da leuchten die LEDs an PC2, PC3, PC5 nicht. Also genau die gleichen wie
in der Metronomschaltung.
1
2) die Anschlussbelegung deiner 7-Segment-Anzeigen auch richtig in
2
deiner Schaltung richtig umgesetzt sind. Probiere doch mal die einzelnen
3
Segmente einer Anzeige mit 5V und einem Vorwiderstand (ca. 330...1K)
4
durch....
Hauch das habe ich gemacht. (und auch im letzten Post beschrieben...)
Die Segmente sind technisch gesehen Funktionstüchtig.
Irgendwelche ideen, warum bei 2 Schaltungen die gleichen (undzwar
wirklich die gleichen...) Probleme Auftauchen können (auch mit
unterschiedlichen Controllern)?!?
Liebe Grüße
Hannes
MoinMoin
Hannes schrieb:> #include <avr/io.h>>> int main (void) {> DDRC = 0xff;> while(1) {> }> return 0;> }>
bei diesem Stück Programm (von oben), kann nichts schief gehen und
plötzlich 3 Ausgänge nicht durchschalten, wie du oben beschrieben
hast....
Grüße Uwe
Hallo,
kurz bevor du das geschrieben hast, habe ich es im Forum gelesen... Oh
mein Gott!!!
Es waren wirklich die fuses...
Naja ich weis grad nicht ob ich mir ärgern oder freuen soll ;)
Es funktioniert jeden falls nun die Anzeige. Was nicht geht ist der
Sleep modus und das Piepsen.
Zum Piepsen hattest du ja schon etwas geschrieben. Das bekomme ich hin.
Aber dieser Sleep Modus ist mir vollkommen ungleläufig. Das Problem ist,
dass er glaube ich eifnach nicht wieder aufwacht. Jedenfall bleibts
dunkel, wenn man das metronom wieder zum Leben erwecken will... Was mach
ich da am besten, um das zu fixen?
Liebe Grüße und ein Riesen DANKE,
Hannes
MoinMoin,
Hannes Häppi schrieb:> Aber dieser Sleep Modus ist mir vollkommen ungleläufig. Das Problem ist,> dass er glaube ich eifnach nicht wieder aufwacht. Jedenfall bleibts> dunkel, wenn man das metronom wieder zum Leben erwecken will... Was mach> ich da am besten, um das zu fixen?>
der entsprechende Taster hängt auch wirklich an PD2 (INT0)?
Grüße Uwe
Hi,
die Situation hat sich ein wenig geändert: das metronom geht in den
Sleep modus und wacht auch wieder auf. Komischerweise nur extrem selten.
Also es geht extrem selten in den sleep modus. Das ganze sieht dann etwa
so aus: http://tinyurl.com/35tk6yg
Woran kanns liegen?
Grüße ;)
Hannes
mit welcher Frequenz betreibst du denn deinen MC? Mein Quellcode ist für
1MHz ausgelegt! Es sieht so aus, dass meine, mit Sicherheit recht
primitive, Tastenentprellung nicht richtig wirkt, also die Pausen
(my_delay_ms())kürzer sind, als von mir geplant.
Grüße Uwe
Hey,
ich bin mir relativ sicher, dass ich das gerät auch mir 1Mhz betreibe.
Laut Fuses calculator, Makefile und Quelltext nutze ich den internen
Taktgeber mit 1Mhz...
Achso, und die Tasten für schneller bzw. langsamer sollten dann doch
auch nicht wirklich funktionieren oder? weil: die funktionieren genau so
wie ich mir das vorstelle...
gute Nacht und Grüße, ;-)
Hannes
MoinMoin,
...du hast die beiden Funktionsaufrufe write_text() aus den Zweig für
den Sleep-Mode rausgenommen? ... die machen indirekt die
Tastenentprellung in dem Fall, zwar unschön, aber funktioniert...
Grüße Uwe
jedenfalls bringt das irgendwie nichts.
Ich überlege grad, ob es nicht einfacher ist, einen An/aus schalter zu
nutzen. Wie müsste der code aussehen, wenn ich mit dem dritten schalter
das Pipsen an bzw aus schalten will?
LG.
Hannes
MoinMoin,
die beiden write_text()-Aufrufe sollten nicht auskommentiert sein, weil
sie impliziet die Pausen zum Entprellen des Tasters realisieren. Oder du
baust dafür entsprechende Pausen ein...
Natürlich kannst du auch einen Ein-/Aus-Schalter statt dessen einbauen
(wäre sogar stromsparender...).
Das mit dem Piepser lasse ich dir mal als "Hausaufgabe" ;-). Prinzipiell
musst du mit dem Taster (auch hier wäre ein sinnvolles Entprellen
wichtig!) ein Flag setzen/löschen, was du bei der Tonausgabe immer
abfragen musst. Überlege/probiere mal und frage, wenn du nicht klar
kommst...
Grüße Uwe