Mikrocontroller: ATMega 8
Programmierumgebung: WinAVR und myAVR ProgTool
Hallo,
versuche gerade eine "Beep" über einen Piezo-Schallwandler bei einem
Tastendruck zu generieren.
Ich habe hierzu den Timer0 aktiviert:
1 | (TCCR0 = (1 << CS00 | 1 << CS01);)
|
Nun habe ich in der While Schleife im Main den Ausgang Q_C5 im Toggle
Betrieb durch eine EXOR Verknüpfung. Diese wird durch die If-Bedingung
und dem Timerregister mit Übereinstimmung des Vorgegebenen Bitmusters
getoggelt ( if (TCNT0 & 0x07) ). Eine Vorgeschaltete if Bedingung
wiederrum aktiviert diesen Vorgang ( if (Taster2) -> Taster2 ist so
definiert: #define Taster2 !(PINB & (1<<PINB4)) ).
Nun habe ich das Problem, dass die Frequenz des Beeps unterschiedlich
wird, wenn ich noch mehrere Unterprogramme aufrufe... Liegt das dann an
der Zykluszeit oder habe ich einen anderen Denkfehler?
Ist der Gedanke einen Beep so zu generieren Grundsätzlich falsch oder
macht man so etwas normalerweise über einen Interupt?
Ein weiteres komisches Phänomen ergibt sich dadurch, wenn ich im else
Teil der Tasterabfrage den Ausgang Q_C5 durch Q_C &= ~(1 << Q_C4 | 1 <<
Q_C5); auf FALSE bringe, verändert sich die Frequenz auch. Nehme ich den
Zusatz " | 1 << Q_C5 " aus der Programmierung, ist die Frequenz höher.
Der else sollte doch normalerweise nur Wirksam sein, wenn der Taster2
wieder "aus" ist.
1 | int main(void)
|
2 | {
|
3 | initialisierung();
|
4 | while (1)
|
5 | {
|
6 | unsigned char FP2;
|
7 | MatrixEinlesen();
|
8 |
|
9 | if (Taster2)
|
10 | {
|
11 | Q_C |= (1 << Q_C4);
|
12 |
|
13 | if (TCNT0 & 0x07)
|
14 | {
|
15 | Q_C ^= (1 << Q_C5);
|
16 | }
|
17 |
|
18 | }
|
19 | else
|
20 | {
|
21 | Q_C &= ~(1 << Q_C4 | 1 << Q_C5);
|
22 | }
|
23 | }
|
24 | return 0;
|
25 | }
|