Forum: Compiler & IDEs Finde meinen Fehler nicht :(


von Hans P. (bmwi)


Angehängte Dateien:

Lesenswert?

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

von Wolfgang Horn (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

verschoben

von Hans P. (bmwi)


Lesenswert?

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
Noch kein Account? Hier anmelden.