Forum: Mikrocontroller und Digitale Elektronik kleines Timerproblem


von Chris T. (chris0086)


Lesenswert?

Hallo Leute hab ein kleines Problem mit einem Timer.
Dazu folgender Code mit Fehlerbeschriebung:
1
//Timer initialisieren
2
    TCCR0 |= (1<<CS00)|(1<<CS02);
3
    TIMSK =(1<<TOIE0);
4
    sei();//interrupts aktivieren
5
.
6
.
7
.
8
.
9
ISR (TIMER0_OVF_vect)  //Timerroutine <--Hier folgender Fehler s.u.
10
{
11
  TCNT0 = 0;
12
  DDRC = 0xFD;
13
  counter++;
14
  if(counter==10)
15
    DDRC = 0xFF;
16
}
Mein Eclpise kringelt die ISR Zeile und meint:previous declaration of 
'__vector_17' was here

hab nur das abgeschrieben was in meinem Buch steht um den timer erstmal 
Leben einzuhauchen aber irgendwo steckt ein Fehler.
Kann mir jemand sagen wo?

von Er (Gast)


Lesenswert?

Poste mal den kompletten Code. (Sollte man sowieso immer machen).
Der Fehler deutet darauf hin, das Du die ISR (mindestens) zweimal 
deklariert hast.

von Chris T. (chris0086)


Lesenswert?

Nein das steht nur einmal im Code, kann ich dir versichern
hier steht noch was dazu:
../main.c:356: error: static declaration of '__vector_17' follows 
non-static declaration
../main.c:356: error: previous declaration of '__vector_17' was here
.

von Er (Gast)


Lesenswert?

>Nein das steht nur einmal im Code, kann ich dir versichern

Das ist einer der Gründe warum ich (ausser der KFZ-Haftpflicht) keine 
weitere Versicherung habe. ;-)

>hier steht noch was dazu:
>../main.c:356: error: static declaration of '__vector_17' follows
>non-static declaration
>../main.c:356: error: previous declaration of '__vector_17' was here

Genau das deutet auf eine mehrfache Deklaration hin. Das Wort "previous" 
bedeutet "vorherige". Und "vorherige" macht ja nur bei mindestens einer 
zusätzlichen Deklaration Sinn.

von Chris T. (chris0086)


Lesenswert?

naja es ist nochmal in der iom162.h declariert also in den definitionen 
des Atmega162 aber da hab ich nix drin gemacht

von Er (Gast)


Lesenswert?

Nun, wie auch immer: Ich schrieb ja schon: Poste den kompletten Code.
Tu' es oder lass' es. Dein Problem. nicht mein's.

von Chris T. (chris0086)


Lesenswert?

ok hier ist der Code:
1
/*
2
 * main.c
3
 *
4
 *  Created on: 11.03.2009
5
 *      Author: chris
6
 */
7
#include <avr/io.h>
8
#include <stdint.h>
9
#include <avr/interrupt.h>
10
#include <util/delay.h>
11
#include <stdlib.h>
12
#include <string.h> // Für "strcmp"
13
14
15
16
#define Takt 16000000
17
#define BAUD1 115200          // Baudrate
18
//BAUDRATE 2 AKTIV !!!
19
#define UBRR_VAL1 ((Takt/16/BAUD2)-1)   // Schnittstelle BUS
20
21
#define BAUD2 9600          // Baudrate
22
#define UBRR_VAL2 ((Takt/16/BAUD2)-1)   // Schnittstelle KESSEL
23
24
int CheckSumm;     //CheckSumme RX Global
25
int Tempstatus = 0;
26
27
28
//Einzelne Zeichen senden
29
void USART1_Transmit( char data )
30
{
31
  /* Wait for empty transmit buffer */
32
  while ( !( UCSR1A & (1<<UDRE1)) )
33
    ;
34
  /* Put data into buffer, sends the data */
35
  UDR1 = data;
36
};
37
void USART2_Transmit( char data )
38
{
39
  /* Wait for empty transmit buffer */
40
  while ( !( UCSR0A & (1<<UDRE0)) )
41
    ;
42
  /* Put data into buffer, sends the data */
43
  UDR0 = data;
44
};
45
46
uint8_t usart1_getc(void)
47
{
48
    while (!(UCSR1A & (1<<RXC1)))   // warten bis Zeichen verfuegbar
49
        ;
50
    return UDR1;                   // Zeichen aus UDR an Aufrufer zurueckgeben
51
};
52
53
54
char USART1_getchar(void)
55
{
56
  // Ist schon ein Zeichen im Buffer?
57
  PORTC = 0xFE;  //rechte LED an
58
  while (!bit_is_set(UCSR1A, RXC1))
59
    ;
60
  PORTC = 0xFF; //Rechte LED aus
61
    return UDR1;
62
63
}
64
65
66
67
//Daten empfangen Routine
68
unsigned char USART1_readcommand(unsigned char *Nutzdaten, char *Steuerdaten, char *h)
69
{
70
  unsigned char  NextByte;
71
   char  Len;
72
  unsigned int   i;
73
  unsigned int   CheckSummCalc;
74
  unsigned int   CheckSummRead;
75
76
  CheckSummCalc = 0;
77
  Steuerdaten[0] = USART1_getchar();   // CommandoByte 1
78
  CheckSummCalc += Steuerdaten[0];
79
  Steuerdaten[1] = USART1_getchar();   // CommandoByte 2
80
  CheckSummCalc += Steuerdaten[1];
81
82
83
 // Anzahl der Datenbytes lesen
84
  Len = USART1_getchar();
85
  CheckSummCalc += Len;
86
  // Jetzt kommen die Datenbytes
87
88
  if(h==0) //für Initialisierung h wird später auf 1 gesetzt
89
    {
90
    Len = 11;
91
    }
92
93
  for( i = 0; i < Len; i++ )
94
  {
95
    NextByte = USART1_getchar();
96
    CheckSummCalc += NextByte;
97
    Nutzdaten[i] = NextByte;
98
  }
99
100
  // Daten sind gelesen. Jetzt kommen noch 2 Bytes Checksumme
101
  CheckSummRead = USART1_getchar();
102
  CheckSummRead = ( CheckSummRead << 8 ) + USART1_getchar();
103
104
105
106
  if (CheckSummRead != CheckSumm && Steuerdaten[1] == 0X31) //Tempwerte änderung
107
  {
108
    Tempstatus = 1;
109
      //Testfunktionen
110
      USART2_Transmit(CheckSummRead);
111
      USART2_Transmit(CheckSumm);
112
    CheckSumm = CheckSummRead;
113
  }
114
115
            if(h==0)
116
            {
117
             Steuerdaten[0]=0X4D;
118
             Steuerdaten[1]=0X41;
119
             Steuerdaten[2]=0X01;
120
             Steuerdaten[3]=0X01;
121
             Steuerdaten[4]=0X00;
122
             Steuerdaten[5]=0X90;
123
124
             for(i=0; i<=5 ;i++)
125
                    {
126
                      USART1_Transmit(Steuerdaten[i]);
127
                    }
128
            }
129
130
  return Len;
131
}
132
133
134
135
void USART2_ValuesTransmit(unsigned char *Nutzdaten)
136
{
137
  unsigned char Sendstring[31];
138
  int j;
139
  Sendstring[0]=0x66; // f
140
  Sendstring[1]=0x62; // b
141
  Sendstring[2]=0x73; // s
142
  Sendstring[3]=0x30; // 0
143
  Sendstring[4]=0x35; // 5
144
  Sendstring[5]=0x2F; // /
145
  Sendstring[6]=0x30; // 0 Hauptlinie hb
146
  Sendstring[7]=0x31; // 1 Hauptlinie lb
147
  Sendstring[8]=0x2F; // /
148
  Sendstring[9]=0x62; // b Mittellinie
149
  Sendstring[10]=0x2F; // /
150
  Sendstring[11]=0x00; // 0 Teilnehmer
151
  Sendstring[12]=0x00; // 0 Teilnehmer
152
  Sendstring[13]=0x00; // 0 Teilnehmer     1. Temperatur
153
  Sendstring[14]=0x3D; // =
154
155
  for(j=0; j<=20 ;j++) //Erste Temperatur senden
156
  {
157
    USART2_Transmit(Sendstring[j]);
158
159
  }
160
161
  Sendstring[11]=0x00; // 0 Teilnehmer
162
  Sendstring[12]=0x00; // 0 Teilnehmer
163
  Sendstring[13]=0x00; // 0 Teilnehmer    2. Temperatur
164
165
  for(j=0; j<=20 ;j++) //Zweite emperatur senden
166
    {
167
      USART2_Transmit(Sendstring[j]);
168
169
    }
170
  //Status senden
171
172
      Sendstring[11]=0x00; // 0 Teilnehmer
173
      Sendstring[12]=0x00; // 0 Teilnehmer
174
      Sendstring[13]=0x00; // 0 Teilnehmer
175
176
      if(Nutzdaten[1] == 2)
177
      {
178
      Sendstring[15]='A';
179
      Sendstring[16]='n';
180
      Sendstring[17]='h';
181
      Sendstring[18]='e';
182
      Sendstring[19]='i';
183
      Sendstring[20]='z';
184
      Sendstring[21]='e';
185
      Sendstring[22]='n';
186
      Sendstring[23]=0x0D; // CR
187
      Sendstring[24]=0x0A; // LF
188
      }
189
      if(Nutzdaten[1] == 3)
190
        {
191
        Sendstring[15]='H';
192
        Sendstring[16]='e';
193
        Sendstring[17]='i';
194
        Sendstring[18]='z';
195
        Sendstring[19]='e';
196
        Sendstring[20]='n';
197
        Sendstring[21]=0x0D; // CR
198
        Sendstring[22]=0x0A; // LF
199
        }
200
      if(Nutzdaten[1] == 4)
201
          {
202
          Sendstring[15]='F';
203
          Sendstring[16]='e';
204
          Sendstring[17]='u';
205
          Sendstring[18]='e';
206
          Sendstring[19]='r';
207
          Sendstring[20]='h';
208
          Sendstring[21]='a';
209
          Sendstring[22]='l';
210
          Sendstring[23]='t';
211
          Sendstring[24]='u';
212
          Sendstring[25]='n';
213
          Sendstring[26]='g';
214
          Sendstring[27]=0x0D; // CR
215
          Sendstring[28]=0x0A; // LF
216
          }
217
      if(Nutzdaten[1] == 6)
218
          {
219
          Sendstring[15]='T';
220
          Sendstring[16]='u';
221
          Sendstring[17]='e';
222
          Sendstring[18]='r';
223
          Sendstring[19]='-';
224
          Sendstring[20]='o';
225
          Sendstring[21]='f';
226
          Sendstring[22]='f';
227
          Sendstring[23]='e';
228
          Sendstring[24]='n';
229
          Sendstring[25]=0x0D; // CR
230
          Sendstring[26]=0x0A; // LF
231
          }
232
      if(Nutzdaten[1] == 0)
233
        {
234
        Sendstring[15]='S';
235
        Sendstring[16]='t';
236
        Sendstring[17]='o';
237
        Sendstring[18]='e';
238
        Sendstring[19]='r';
239
        Sendstring[20]='u';
240
        Sendstring[21]='n';
241
        Sendstring[22]='g';
242
        Sendstring[23]=0x0D; // CR
243
        Sendstring[24]=0x0A; // LF
244
        }
245
      if(Nutzdaten[1] == 5)
246
        {
247
        Sendstring[15]='F';
248
        Sendstring[16]='e';
249
        Sendstring[17]='u';
250
        Sendstring[18]='e';
251
        Sendstring[19]='r';
252
        Sendstring[20]='-';
253
        Sendstring[21]='A';
254
        Sendstring[22]='u';
255
        Sendstring[23]='s';
256
        Sendstring[24]=0x0D; // CR
257
        Sendstring[25]=0x0A; // LF
258
        }
259
  for(j=0; j<=30 ;j++) //Status senden
260
          {
261
            USART2_Transmit(Sendstring[j]);
262
263
          }
264
265
}
266
267
//Funktion Temperatur anfordern
268
unsigned char Tempanfordern()
269
{
270
  unsigned int j;
271
  unsigned char Tempstring[8];
272
  Tempstring[0]=0X4D;     //M2
273
  Tempstring[1]=0X32;
274
  Tempstring[2]=0X01;
275
  Tempstring[3]=0X01;
276
  Tempstring[4]=0X00;
277
  Tempstring[5]=0X81;
278
279
      for(j=0; j<=5 ;j++)
280
      {
281
        USART1_Transmit(Tempstring[j]);
282
283
      }
284
  Tempstring[0]=0X52;    //Rb
285
  Tempstring[1]=0X62;
286
  Tempstring[2]=0X03;
287
  Tempstring[3]=0X00;
288
  Tempstring[4]=0X00;
289
  Tempstring[5]=0X01;
290
  Tempstring[6]=0X00;
291
  Tempstring[7]=0XB8;
292
  for(j=0; j<=7 ;j++)
293
    {
294
      USART1_Transmit(Tempstring[j]);
295
296
    }
297
  for( j = 0; j < 6; j++ )    //Erste Zeichen des Antwortstrings verwerfen
298
    {
299
      Tempstring[j] = USART1_getchar();
300
301
    }
302
303
  return 1;
304
}
305
306
307
308
int main(void)
309
{
310
311
    UCSR0B |= (1<<TXEN0);                // USART1 TX einschalten
312
    UCSR1B |= (1<<TXEN1);                // USART2 TX einschalten
313
    UCSR0B |= (1<<RXEN0);
314
    UCSR1B |= (1<<RXEN1);
315
    UCSR0C |= (1<<URSEL0)|(3<<UCSZ00);    // USART1 Asynchron 8N1
316
    UCSR1C |= (1<<URSEL1)|(3<<UCSZ10);    // USART2 Asynchron 8N1
317
318
    UBRR0H = UBRR_VAL1 >> 8;
319
    UBRR1H = UBRR_VAL2 >> 8;
320
    UBRR0L = UBRR_VAL1;
321
    UBRR1L = UBRR_VAL2 ;
322
323
    while (!bit_is_set(UCSR0A, UDRE0));
324
    //Timer initialisieren
325
    TCCR0 |= (1<<CS00)|(1<<CS02);
326
    TIMSK =(1<<TOIE0);
327
    sei();//interrupts aktivieren
328
329
330
331
//Globale Daten:
332
    struct {
333
       unsigned initstatus:1; // Initialisierung Ra
334
       unsigned tempstatus:1; // Temperatur angefordert
335
       unsigned Tempchange:1; // Temperatur geändert
336
       unsigned b2Bits:5;    // Dieses Feld ist 2 Bits breit
337
338
    } ctlbits;
339
    ctlbits.initstatus = 0;
340
    ctlbits.tempstatus = 0;
341
    ctlbits.Tempchange = 0;
342
  char Steuerdaten[8];
343
  char Steuerdatenalt[2];
344
  int zaehler;
345
  int counter=0;
346
  DDRC = 0xFF; //Led
347
348
    unsigned char Nutzdaten[60];
349
    uint16_t Datenlaenge = 0;
350
351
    for(zaehler=0;zaehler<60;zaehler++) //Erstmal Array mit Endzeichen füllen
352
    {
353
      Nutzdaten[zaehler]='\0';
354
    }
355
356
ISR (TIMER0_OVF_vect)  //Timerroutine
357
{
358
  TCNT0 = 0;
359
  DDRC = 0xFD;
360
  counter++;
361
  if(counter==10)
362
    DDRC = 0xFF;
363
}
364
365
366
//Initialisierungsstring senden:
367
368
  Steuerdaten[0]=0X52;      //Ra
369
  Steuerdatenalt[0]=0X52;
370
  Steuerdaten[1]=0X61;
371
  Steuerdatenalt[1]=0X52;
372
  Steuerdaten[2]=0X03;
373
  Steuerdaten[3]=0X00;
374
  Steuerdaten[4]=0X00;
375
  Steuerdaten[5]=0X01;
376
  Steuerdaten[6]=0X00;
377
  Steuerdaten[7]=0XB7;
378
  for(zaehler=0; zaehler<=7 ;zaehler++)
379
  {
380
    USART1_Transmit(Steuerdaten[zaehler]);
381
382
  }
383
384
  Steuerdaten[0]=0X4D;      //Ma
385
  Steuerdaten[1]=0X41;
386
  Steuerdaten[2]=0X01;
387
  Steuerdaten[3]=0X01;
388
  Steuerdaten[4]=0X00;
389
  Steuerdaten[5]=0X90;
390
  for(zaehler=0; zaehler<=5 ;zaehler++)
391
  {
392
    USART1_Transmit(Steuerdaten[zaehler]);
393
394
  }
395
396
//Initialisierung Ende
397
398
399
400
//Daten empfangen und Bestätigungskommando schicken
401
Kommunikation:
402
  cli(); //Interrupts sperren
403
     Datenlaenge = USART1_readcommand(Nutzdaten, Steuerdaten,ctlbits.initstatus);
404
    sei(); //Interrupts zulassen
405
     if(ctlbits.initstatus==0)//Für erste Antwort, wird verworfen
406
     {
407
       ctlbits.initstatus=1;
408
       goto Kommunikation;
409
410
     }
411
412
     //Kommando für Temperaturwerte schicken (nur einmal)
413
     if(ctlbits.tempstatus == 0 && Steuerdaten[1] == 0X32)
414
     {
415
         ctlbits.tempstatus = Tempanfordern();
416
         goto Kommunikation;
417
     }
418
     //Werte an den Bus senden
419
     if(Tempstatus == 1)
420
     {
421
       //Temperaturen senden
422
423
       USART2_ValuesTransmit(Nutzdaten);
424
       Tempstatus = 0;
425
426
     }
427
428
429
     Steuerdatenalt[0]=Steuerdaten[0];
430
     Steuerdatenalt[1]=Steuerdaten[1];
431
     Steuerdaten[5]= Steuerdaten[0]+Steuerdaten[1]+2;
432
     PORTC = 0xFB; //LED links an
433
     for(zaehler=0; zaehler<=5 ;zaehler++)
434
       {
435
         USART1_Transmit(Steuerdaten[zaehler]);
436
       }
437
438
     PORTC = 0xFF; //LED links aus
439
     goto Kommunikation;
440
441
442
while(1);
443
}

von Er (Gast)


Lesenswert?

OK.

ISR sind syntaktisch normale Funktionen. Auch wenn der Compiler sie 
speziell behandelt. In C kannst Du Funktionen nicht innerhalb von 
anderen Funktionen definieren. Nimm also den Code
1
ISR (TIMER0_OVF_vect)  //Timerroutine
2
{
3
  TCNT0 = 0;
4
  DDRC = 0xFD;
5
  counter++;
6
  if(counter==10)
7
    DDRC = 0xFF;
8
}

aus main heraus und stelle in ausserhalb davon wieder in den Quelltext.

Du hast das vielleicht deswegen nicht gesehen, weil Du nicht korrekt und 
konsequent eingerückt hast. Tue das bitte in Zukunft. So ist das 
grauslich.

von Chris T. (chris0086)


Lesenswert?

Ah ok danke für deiner Hilfe jetzt gibts keine Fehler mehr.
Habe dennoch ein Problem wollte damit eine LED blinken lassen die an 
Port C angeschlossen ist.
1
ISR (TIMER0_OVF_vect)  //Timerroutine
2
{
3
  TCNT0 = 0;
4
  DDRC = 0xFD;
5
  counter++;
6
  if(counter==100)
7
  {
8
    DDRC = 0xFF;
9
    counter = 0;
10
  }
11
}

Aber leider blinkt sie nur einmal kurz  und dann nichtmehr.
Muss ich noch irgendwas zurücksetzen?

von MeinerEiner (Gast)


Lesenswert?

Die Variable Counter ist nicht volatile (für Variablen in ISRs 
notwendig).
Und Ports ein/ausschalten macht man mit PORT, nicht mit DDR.

von Chris T. (chris0086)


Lesenswert?

Habs jetzt so und so läufts:
ISR (TIMER0_OVF_vect)  //Timerroutine
{
  TCNT0 = 0;

  counter++;
  if(counter==10)
  {
    PORTC = ~PORTC;
    counter = 0;
  }
}

von Er (Gast)


Lesenswert?

Bitte. Gern geschehen.

von Falk B. (falk)


Lesenswert?

@Christian Hohmann (chris0086)

>ok hier ist der Code:

Wer lesen kann ist klar im Vorteil. Lies mal was über Netiquette!!!

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.