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
#1287728
...und, wie kam`s an? Klaus.
... kann ich noch nicht sagen, die Projektseite habe ich heute erst geschrieben, also übermorgen überreiche ich erst das Geschenk... Uwe
Gast
#1287734
Gut, wusste nicht, dass das SO aktuell ist (eher ungewöhnlich) - hab aber auch nicht nach einem datum geschaut. Dann "good luck" :) Klaus.
Gast
#1288250
Wäre ein "Ticken", "Klicken", "Klacken" oder "Knacken" nicht besser als ein "Piepen"?
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
Gast
#1288647
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).
Gast
#1692832
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Du musst natürlich auch SEGM_DDR und SEGM_PORT anpassen, wenn du die Pins eines anderen Ports benutzt:
1 | |
2 | |
3 | |
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...
Gast
#1692919
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
Gast
#1692975
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
Gast
#1693088
Hallo, ist "DIS1" die anzeige ganz links oder ganz rechts? Grüße
Gast
#1693138
Hallo, ich habe nochmal durchgemessen, und nichts feststellen können! bei meiner schaltung hängt alles so: Pin | am 7-seg. | Ohm ------------------------ PC0 | 10 | 328Ohm PC1 | 9 | 329Ohm PC2 | 7 | 328Ohm PC3 | 6 | 329Ohm PC4 | 5 | 328Ohm PC5 | 4 | 329Ohm PC6 | 2 | 328Ohm PC7 | 1 | 329Ohm Eigentlich sollte das doch so stimmen oder?! Das geht jedenfalls aus dem datenblatt der Anzeigen hervor: (siehe Anhang) Grüße
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
Gast
#1698073
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
Gast
#1698104
Wie müsste denn der code aussehen (so minimal wie möglich) um nur die segmente leuchten zu lassen? Grüße, Hannes
Gast
#1698163
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
1 | |
in
1 | |
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
Gast
#1700446
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).
1 | |
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
Gast
#1700449
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
Gast
#1700487
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
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....;-)
Gast
#1703386
Hi, danke für die
1 | |
2 | |
3 | |
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 | |
3 | |
4 | |
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
MoinMoin, stelle mal das Fuse-Bit JTAGEN auf disable!!!! Dann sollte es gehen... 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
Hi, ich weis nicht so richtig was du meinst. Meinst du das hier:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
