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.