Forum: Projekte & Code Elektronisches Metronom


von Uwe B. (boerge) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

von Klaus2 (Gast)


Lesenswert?

...und, wie kam`s an?

Klaus.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

... kann ich noch nicht sagen, die Projektseite habe ich heute erst 
geschrieben, also übermorgen überreiche ich erst das Geschenk...

Uwe

von Klaus2 (Gast)


Lesenswert?

Gut, wusste nicht, dass das SO aktuell ist (eher ungewöhnlich) - hab 
aber auch nicht nach einem datum geschaut. Dann "good luck" :)

Klaus.

von Gast (Gast)


Lesenswert?

Wäre ein "Ticken", "Klicken", "Klacken" oder "Knacken" nicht besser als 
ein "Piepen"?

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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

von Karl (Gast)


Lesenswert?

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.

von Benedikt K. (benedikt)


Lesenswert?

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).

von hannes (Gast)


Angehängte Dateien:

Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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...

von hannes (Gast)


Lesenswert?

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!

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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

von Hannes (Gast)


Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

... 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

von hannes (Gast)


Lesenswert?

Hallo,
ist "DIS1" die anzeige ganz links oder ganz rechts?

Grüße

von hannes (Gast)


Angehängte Dateien:

Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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

von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hannes (Gast)


Lesenswert?

Wie müsste denn der code aussehen (so minimal wie möglich) um nur die 
segmente leuchten zu lassen?

Grüße,

Hannes

von Uwe (Gast)


Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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
volatile uint8_t value[4] = {0xFF, 0xFF, 0xFF, 0xFF};

in
1
volatile uint8_t value[4] = {0x00, 0x00, 0x00, 0x00};

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

von Hannes (Gast)


Lesenswert?

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
volatile uint8_t value[4] = {0x00, 0x00, 0x00, 0x00};
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

von Hannes (Gast)


Lesenswert?

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

von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

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.
8
9
10
Size before:
11
main.elf  :
12
section    size   addr
13
.text       148      0
14
.stab      1632      0
15
.stabstr   1820      0
16
Total      3600
17
18
19
20
21
Creating load file for EEPROM: main.eep
22
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
23
  --change-section-lma .eeprom=0 -O ihex main.elf main.eep
24
avr-objcopy: there are no sections to be copied!
25
avr-objcopy: --change-section-lma .eeprom=0x00000000 never used
26
make: [main.eep] Error 1 (ignored)
27
28
Size after:
29
main.elf  :
30
section    size   addr
31
.text       148      0
32
.stab      1632      0
33
.stabstr   1820      0
34
Total      3600
35
36
37
38
Errors: none
39
-------- end --------
40
41
macerei:Desktop hannes$ avrdude -c avr911 -e -p m32 -P /dev/tty.SLAB_USBtoUART -b 19200 -U flash:w:main.hex
42
43
Connecting to programmer: .
44
Found programmer: Id = "AVR ISP"; type = S
45
    Software Version = 2.5; Hardware Version = 2.0
46
Programmer supports auto addr increment.
47
Programmer supports buffered memory access with buffersize=512 bytes.
48
49
Programmer supports the following devices:
50
    Device code: 0x01
51
    Device code: 0x02
52
    Device code: 0x03
53
.
54
.
55
.
56
    Device code: 0x7c
57
    Device code: 0x7d
58
    Device code: 0x7e
59
    Device code: 0x7f
60
61
avrdude: AVR device initialized and ready to accept instructions
62
63
Reading | ################################################## | 100% 0.05s
64
65
avrdude: Device signature = 0x1e9502
66
avrdude: erasing chip
67
avrdude: reading input file "main.hex"
68
avrdude: input file main.hex auto detected as Intel Hex
69
avrdude: writing flash (148 bytes):
70
71
Writing | ################################################## | 100% 0.16s
72
73
74
75
avrdude: 148 bytes of flash written
76
avrdude: verifying flash memory against main.hex:
77
avrdude: load data flash data from input file main.hex:
78
avrdude: input file main.hex auto detected as Intel Hex
79
avrdude: input file main.hex contains 148 bytes
80
avrdude: reading on-chip flash data:
81
82
Reading | ################################################## | 100% 0.08s
83
84
85
86
avrdude: verifying ...
87
avrdude: 148 bytes of flash verified
88
89
avrdude: safemode: Fuses OK
90
91
avrdude done.  Thank you.
92
93
macerei:Desktop hannes$


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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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...)

von Uwe B. (boerge) Benutzerseite


Lesenswert?

... 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....;-)

von Hannes (Gast)


Lesenswert?

Hi, danke für die
1
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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

stelle mal das Fuse-Bit JTAGEN auf disable!!!!

Dann sollte es gehen...

Grüße Uwe

von Hannes H. (hannesf)


Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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

von Hannes H. (hannesf)


Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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

von Hannes H. (hannesf)


Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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

von Hannes H. (hannesf)


Lesenswert?

Hi,


ich weis nicht so richtig was du meinst. Meinst du das hier:
1
  while (1){
2
    switch (getkey()) {
3
      case ON_OFF:  {  // OFF-Schalter (nochmal druecken, dann ON durch INT0)
4
               // write_text(1);              // byebye
5
                clear_all_digits();            // Anzeige loeschen
6
                set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // Sleep-Mode einstellen
7
                sleep_mode();              // Sleep-Mode einschalten
8
                //write_text(0);              // ... wieder aufgewacht...
9
                write_zahl(bpm);            // bpm-Wert wieder ausgeben
10
                break;
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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.