Ui. Da fehlts aber an allen Ecken und Enden.
Du solltest dir dringend ein Buch über C zulegen. So ein
Wizard ist kein Ersatz für fehlende Kentnisse.
> hab ich falsch abgeschrieben ...
Du sollst überhaupt nicht abschreiben. Denn beim Abschreiben
entstehen Tippfehler. Und dann jagen 20 Leute Tippfehlern hinterher,
die so gar nicht in deinem Code enthalten sind. Cut&Paste ist
schon lange erfunden.
Aber zur Sache:
1 | // Timer 1 overflow interrupt service routine
|
2 | interrupt [TIM1_OVF] void timer1_ovf_isr(void)
|
3 | {
|
4 | Overflow = Overflow + 1;
|
5 | }
|
6 |
|
7 | // Timer 1 input capture interrupt service routine
|
8 | interrupt [TIM1_CAPT] void timer1_capt_isr(void)
|
9 | {
|
10 | Dummy = TCNT1;
|
11 | Dummy = Dummy + 65536 * Overflow;
|
12 | Dummy = Dummy * 0,000000125;
|
13 | Impulse = 60 / Dummy;
|
14 |
|
15 | }
|
Ein C Compiler arbeitet deinen Source Code von oben nach unten durch.
Variablen müssen definiert (oder deklariert) werden, bevor sie
das erste mal benutzt werden können.
In deiner Overflow ISR benutzt du zb. eine Variable namens 'Overflow'.
Wenn ich aber von dieser Codestelle in Richtung Anfang des Source
Codes durchschaue, dann findet sich keine Variable dieses Namens.
Selbiges für die Variable Dummy und Impulse in der zweiten ISR.
Und by the way. Das hier
1 | // Declare your global variables here
|
2 | typedef unsigned char uint8_t Overflow ;
|
3 | typedef unsigned long uint32_t Dummy ;
|
4 | typedef unsigned char uint8_t Inmpulse ;
|
sind keine Variablendefinitionen, sondern die Vereinbarungen für
neue Datentypen. Du definierst, dass der Datentyp 'Overflow' synonym
zu einem unsigned char uint8_t sein soll. Halt, Moment, das
ist insgesamt noch nicht mal ein korrekter typedef sondern
ein Syntax Error.
Von diversen fehlenden ; reden wir mal gar nicht.
In Programmiersprachen wird normalerweise meistens eine
Dezimalpunkt als . geschrieben und nicht als ,
, hat in C eine ganz spezielle Bedeutung.
1 | // some data types to simplify typing
|
2 | typedef unsigned char uint8_t;
|
3 | typedef unsigned long uint32_t;
|
4 | typedef unsigned char uint8_t;
|
5 |
|
6 | // Declare your global variables here
|
7 | uint8_t Overflow;
|
8 | uint32_t Dummy;
|
9 | uint8_t Inmpulse;
|
10 |
|
11 | // Timer 1 overflow interrupt service routine
|
12 | interrupt [TIM1_OVF] void timer1_ovf_isr(void)
|
13 | {
|
14 | Overflow = Overflow + 1;
|
15 | }
|
16 |
|
17 | // Timer 1 input capture interrupt service routine
|
18 | interrupt [TIM1_CAPT] void timer1_capt_isr(void)
|
19 | {
|
20 | Dummy = TCNT1;
|
21 | Dummy = Dummy + 65536 * Overflow;
|
22 | Dummy = Dummy * 0.000000125;
|
23 | Impulse = 60 / Dummy;
|
24 | }
|
Ob bei der Multiplikation mit 0.000000125 jemals etwas anderes
als 0 herauskommen wird? Hängt wohl vom Wert für TCNT1 ab.
Mal nachrechnen. TCNT1 muss mindestens einen Wert von 8000000
haben, damit die Multiplikation etwas ergibt, was größer als 1
ist. Blöd ist nur, dass TCNT1 eine 16 Bit Variable ist und daher
niemals größer als 65535 werden kann. OK. Overflow könnte dich
noch retten und den Wert entsprechend hoch treiben. Dann mussten
aber pro Messung mindestens 123 Overflows anfallen.
In allen anderen Fällen ist Dummy dann einfach nur 0. Wodurch
sofort das nächste Problem entsteht
Impulse = 60 / Dummy;
Da Dummy den Wert 0 haben wird, ergibt das eine Division durch 0.
Autsch!
Also so gehts nicht. Da musst du dir schon eine andere Berechnung
einfallen lassen, um aus dem Timerwert auf die Frequenz zurückzurechnen.
Und denk dran: Du hast nur ganze Zahlen! Keine Kommastellen, auch
nicht in Zwischenergebnissen.
Im Übrigen bezweifle ich mal die letzte Umrechnung auf Impulse/Minute.
Wenn du in 1 Sekunde 1 Impuls misst, dann misst du in 1 Minute
60 Impulse.
Imulse = 60 * Dummy;