kleines Timerproblem

OP #1515407
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?
Gast #1515429
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.
OP #1515435
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
}
Gast #1515440
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.
OP #1515446
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren