Hallo Leute. Hab einen Frequenzzähler programmiert aber folgendes Problem.... Beim Einschalten (schalter ist oben) zeigt es die richtige Herzzahl(MODUS0) an (vorher rechnerisch ermitelt).. bei betätiges des schalters wird eine gerindere Herzzahl erwartet (rechnerrisch ermittelt) es zeigt diese Zahl an, ABER es wächselt sich ständig mit einer andere zahl (die gleich bleibt) ab (eigentlich MODUS1, da freq zwischen 10 und 100)... das gleiche, wenn eine freq kleiner 10 kommt.... beim wieder hochschalten der schalters kommt wieder die 250 Hz (richtige Herzzahl in MODUS0).. Ich hoffe ich habe mich deutlich ausgedrückt... mfg
Hi Hans, Du Leigeplagter vom Dienst vom heute (jeder von uns ist mal dran, sich die Zähne auszubeißen...) Aus Deinem Programm: void main(void) { i=0; ... while(1); } Dies "while(1);" ist eine Endlosschleife, vermutlich, bis ein Watchdog anschlägt und das Programm erneut startet. Auch dies kommt mir verdächtig vor: data unsigned int ausgabeFreq=0; void rechnung() { ... { ausgabeFreq = 1000000/(256*TH0+TL0+i*65536); } else { ausgabeFreq = 1000000/(256*TH0+TL0+i*65536); } } Bei meinen AVR's ist int 16 Bit breit, schmäler als "1000000". Du findest hier im Forum Beiträge von Kollegen, die sich mit long long (also 64 Bit) herum geschlagen haben. Wenn ich 1 GHz auf 1 Hz auflösen will, (ganz egal, dass mein Messsender das gar nicht kann), käme ich auf 30 Bit. Ciao Wolfgang Horn
Ein Fehler ist schonmal, daß Du im Forum Codesammlung postest. Lesen müßte man können: "Forum: Codesammlung Wenn ihr eigene Programme oder Anleitungen geschrieben habt könnt ihr sie hier posten. Fragen werden gelöscht!" Peter
Hallo, ja das ist mir bereits selber aufgefallen. Wenn ich jedoch es zu einem double mache steht die Fehlermeldung: to many types. Ich habe den code etwas abgeändert:
1 | #include <at89c5131.h> |
2 | #include <stdio.h> |
3 | extern void initlcd (void); // Initialisierung LCD-Display an P0 |
4 | extern void loeschenlcd (void); |
5 | extern void textlcd (unsigned char *text,unsigned char zeile); |
6 | #define MODUS0 0 |
7 | #define MODUS1 1 |
8 | #define MODUS2 2 |
9 | |
10 | void initTimer0undExtInt0(); |
11 | |
12 | void isrTimer0(void); |
13 | void isr_extInt0(void); |
14 | void ausgabeLCD(void); |
15 | void zwischenRoutine(void); |
16 | |
17 | void stoppen(void); |
18 | void rechnung(void); |
19 | void modusWahl(void); |
20 | void einstellungLaden(void); |
21 | void start(void); |
22 | |
23 | |
24 | data int i; |
25 | data unsigned int freq=0; |
26 | data unsigned int ausgabeFreq=0; |
27 | |
28 | unsigned char modus; |
29 | |
30 | //Variablendeclaration global: |
31 | code unsigned char ueberschrift [] = "Frequenzmesser"; |
32 | code unsigned char zeile2 [] = "Freq: Hz "; |
33 | //mit dem Vorsatz code wird das array nicht im internen RAM (ziemlich klein)+ |
34 | data unsigned char buf[20]; |
35 | |
36 | |
37 | void main(void) |
38 | { |
39 | i=0; |
40 | modus = MODUS0; //geändert |
41 | initlcd (); // Initialisierung LCD-Display an P0 |
42 | loeschenlcd (); // Anzeige löschen |
43 | textlcd(ueberschrift,1); |
44 | textlcd(zeile2,2); |
45 | initTimer0undExtInt0(); |
46 | while(1); |
47 | |
48 | |
49 | } |
50 | |
51 | void zwischenRoutine(void) |
52 | { |
53 | stoppen(); |
54 | modusWahl(); //eig nach rechnug() |
55 | rechnung(); |
56 | ausgabeLCD(); |
57 | einstellungLaden(); |
58 | i=0; |
59 | freq=0; |
60 | start(); |
61 | } |
62 | |
63 | void stoppen() |
64 | { |
65 | EA=0; |
66 | TR0 = 0; |
67 | } |
68 | |
69 | void modusWahl() |
70 | { |
71 | |
72 | if(modus==MODUS0) |
73 | { |
74 | if(freq>=100) |
75 | { |
76 | modus=MODUS0; |
77 | } |
78 | |
79 | else if(freq<100 && freq>=10) |
80 | { |
81 | modus=MODUS1; |
82 | } |
83 | |
84 | else |
85 | { |
86 | modus=MODUS2; |
87 | } |
88 | } |
89 | else |
90 | { |
91 | modus = MODUS0; |
92 | } |
93 | } |
94 | |
95 | void rechnung() |
96 | { |
97 | if(modus== MODUS0) |
98 | { |
99 | ausgabeFreq = freq; |
100 | } |
101 | else if(modus == MODUS1) |
102 | { |
103 | ausgabeFreq = 10/((256*TH0+TL0+i*65536)*1000); |
104 | } |
105 | else |
106 | { |
107 | ausgabeFreq = 1/((256*TH0+TL0+i*65536)*1000); |
108 | } |
109 | } |
110 | |
111 | |
112 | void ausgabeLCD() |
113 | { |
114 | sprintf(buf,"Freq:%5d Hz",ausgabeFreq); |
115 | textlcd (buf,2); |
116 | } |
117 | |
118 | |
119 | |
120 | |
121 | void einstellungLaden() |
122 | { |
123 | if (modus==MODUS0) |
124 | { |
125 | TH0 = 0x3C; // Timer0 vorladen |
126 | TL0 = 0xB0; // 65536 - 50000 = 15536 = D8F0h (50ms) |
127 | } |
128 | else if(modus==MODUS1) |
129 | { |
130 | TH0 = 0x00; // Timer0 fungiert als Zeitmesser |
131 | TL0 = 0x00; |
132 | } |
133 | else |
134 | { |
135 | TH0 = 0x00; // Timer0 fungiert als Zeitmesser |
136 | TL0 = 0x00; |
137 | } |
138 | } |
139 | |
140 | void start() |
141 | { |
142 | TR0 = 1; |
143 | EA=1; |
144 | |
145 | } |
146 | |
147 | |
148 | void initTimer0undExtInt0() |
149 | { |
150 | TMOD = 0b00000001; // Timer0 konfigurieren, Modus1: 16 bit Zaehler |
151 | TH0 = 0x3C; // Timer0 vorladen |
152 | TL0 = 0xB0; // 65536 - 50000 = 15536 = D8F0h (50ms) |
153 | TR0 = 1; // Start Timer0 |
154 | ET0 = 1; // Freigabe Timer0. Bit im Reg IE, Reg.-Adresse A8h |
155 | IT0 = 1; // Start extit0 |
156 | EX0 = 1; |
157 | EA = 1; // Globale INT Freigabe. Bit im Reg IE |
158 | } |
159 | |
160 | |
161 | void isrTimer0(void) interrupt 1 |
162 | { |
163 | |
164 | i++; |
165 | if (modus==MODUS0) |
166 | { |
167 | TH0 = 0x3C; // Timer0 vorladen |
168 | TL0 = 0xB0; // 65536 - 50000 = 15536 = D8F0h (50ms) |
169 | |
170 | if(i==20) |
171 | { |
172 | zwischenRoutine(); |
173 | } |
174 | } |
175 | } |
176 | |
177 | |
178 | void isr_extInt0(void) interrupt 0 |
179 | { |
180 | |
181 | freq++; |
182 | |
183 | if(modus==MODUS1) |
184 | { |
185 | // zwischenRoutine(); |
186 | if(freq==10) |
187 | { |
188 | zwischenRoutine(); |
189 | } |
190 | } |
191 | else if(modus==MODUS2) |
192 | { |
193 | if(freq==1) |
194 | { |
195 | zwischenRoutine(); |
196 | } |
197 | } |
198 | } |
Ich war ausch so schlau und habe meine Taktgeberdatei geändert und eine größere Schleife eingebaut, sodass ich eine beringere frequenz erhalte. Was war? ... Ich habe trz. nur die 250 Hz angezeigt bekommen. Nun weiß ich nicht wieso das so ist. Nun bin ich hingegangen und habe einen neues Code geschrieben, der etwas einfacher gestaltet ist:
1 | #include <at89c5131.h> |
2 | #include <stdio.h> |
3 | extern void initlcd (void); // Initialisierung LCD-Display an P0 |
4 | extern void loeschenlcd (void); |
5 | extern void textlcd (unsigned char *text,unsigned char zeile); |
6 | |
7 | void initTimer0undExtInt0(); |
8 | |
9 | void isrTimer0(void); |
10 | void isr_extInt0(void); |
11 | void messung(); |
12 | //double frequenzErmitteln(); |
13 | void ausgabeLCD(); |
14 | //void takt(); |
15 | |
16 | sbit exmesser = P3^2; |
17 | |
18 | data int i; |
19 | data unsigned int freq=0; |
20 | data unsigned int mfreq=0; |
21 | //data unsigned int zeit=0; |
22 | |
23 | //Variablendeclaration global: |
24 | code unsigned char ueberschrift [] = "Frequenzmesser"; |
25 | code unsigned char zeile2 [] = "Freq: Hz "; |
26 | //mit dem Vorsatz code wird das array nicht im internen RAM (ziemlich klein)+ |
27 | data unsigned char buf[20]; |
28 | |
29 | |
30 | |
31 | void main(void) |
32 | { |
33 | i=0; |
34 | initlcd (); // Initialisierung LCD-Display an P0 |
35 | loeschenlcd (); // Anzeige löschen |
36 | textlcd(ueberschrift,1); |
37 | textlcd(zeile2,2); |
38 | // ausgabeLCD(); |
39 | initTimer0undExtInt0(); |
40 | // init_ExtInt0(); |
41 | while(1); |
42 | |
43 | |
44 | } |
45 | |
46 | //double frequenzErmitteln() |
47 | //{ |
48 | |
49 | // mfreq=freq/zeit; |
50 | // return mfreq; |
51 | //} |
52 | |
53 | void initTimer0undExtInt0() |
54 | { |
55 | TMOD = 0b00000001; // Timer0 konfigurieren, Modus1: 16 bit Zaehler |
56 | TH0 = 0x3C; // Timer0 vorladen |
57 | TL0 = 0xB0; // 65536 - 50000 = 15536 = D8F0h (50ms) |
58 | TR0 = 1; // Start Timer0 |
59 | ET0 = 1; // Freigabe Timer0. Bit im Reg IE, Reg.-Adresse A8h |
60 | IT0 = 1; // Start extit0 |
61 | EX0 = 1; |
62 | EA = 1; // Globale INT Freigabe. Bit im Reg IE |
63 | } |
64 | |
65 | |
66 | void isrTimer0(void) interrupt 1 |
67 | { |
68 | TH0 = 0x3C; // Timer0 vorladen |
69 | TL0 = 0xB0; // 65536 - 50000 = 15536 = D8F0h (50ms) |
70 | i++; |
71 | if(i==20) |
72 | { |
73 | i=0; |
74 | TR0 = 0; // Stopp Timer0 |
75 | EA = 0; // alle Interrupts ausschalten Freigabe Timer0. Bit im Reg IE, Reg.-Adresse A8h >>> DEAKTIVIEREN |
76 | //-------------------------------------------------------------------------- |
77 | //frequenzErmitteln(); // frequenz ermitteln |
78 | ausgabeLCD(); // DisplayAusgabe |
79 | freq=0; // Variablen zurück setzen |
80 | //------------------------------------------------------------------------- |
81 | TH0 = 0x3C; // Timer0 vorladen |
82 | TL0 = 0xB0; // 65536 - 50000 = 15536 = D8F0h (50ms) |
83 | TR0 = 1; // Start Timer0 |
84 | EA = 1; // Freigabe Timer0. Bit im Reg IE, Reg.-Adresse A8h |
85 | |
86 | } |
87 | } |
88 | |
89 | |
90 | void isr_extInt0(void) interrupt 0 |
91 | { |
92 | freq++; |
93 | } |
94 | |
95 | void ausgabeLCD() |
96 | { |
97 | sprintf(buf,"Freq:%5d Hz",freq); |
98 | textlcd (buf,2); |
99 | } |
... Nun erhalte ich die verschiedene Frequenzen: .. Bei und wenn ich die die schleiße doppel so groß mache, so erhalte ich auch eine halb so große frequenz.... ich werde es wahrscheinlich so lassen. aber wenn jmd. den fehler von mir erkennt, so bitte melde sich der dieser.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.