www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik kleines Timerproblem


Autor: Chris Tian (chris0086)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute hab ein kleines Problem mit einem Timer.
Dazu folgender Code mit Fehlerbeschriebung:
//Timer initialisieren
    TCCR0 |= (1<<CS00)|(1<<CS02);
    TIMSK =(1<<TOIE0);
    sei();//interrupts aktivieren
.
.
.
.
ISR (TIMER0_OVF_vect)  //Timerroutine <--Hier folgender Fehler s.u.
{
  TCNT0 = 0;
  DDRC = 0xFD;
  counter++;
  if(counter==10)
    DDRC = 0xFF;
}
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?

Autor: Er (Gast)
Datum:

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

Autor: Chris Tian (chris0086)
Datum:

Bewertung
0 lesenswert
nicht 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
.

Autor: Er (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris Tian (chris0086)
Datum:

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

Autor: Er (Gast)
Datum:

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

Autor: Chris Tian (chris0086)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok hier ist der Code:
/*
 * main.c
 *
 *  Created on: 11.03.2009
 *      Author: chris
 */
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h> // Für "strcmp"



#define Takt 16000000
#define BAUD1 115200          // Baudrate
//BAUDRATE 2 AKTIV !!!
#define UBRR_VAL1 ((Takt/16/BAUD2)-1)   // Schnittstelle BUS

#define BAUD2 9600          // Baudrate
#define UBRR_VAL2 ((Takt/16/BAUD2)-1)   // Schnittstelle KESSEL

int CheckSumm;     //CheckSumme RX Global
int Tempstatus = 0;


//Einzelne Zeichen senden
void USART1_Transmit( char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSR1A & (1<<UDRE1)) )
    ;
  /* Put data into buffer, sends the data */
  UDR1 = data;
};
void USART2_Transmit( char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSR0A & (1<<UDRE0)) )
    ;
  /* Put data into buffer, sends the data */
  UDR0 = data;
};

uint8_t usart1_getc(void)
{
    while (!(UCSR1A & (1<<RXC1)))   // warten bis Zeichen verfuegbar
        ;
    return UDR1;                   // Zeichen aus UDR an Aufrufer zurueckgeben
};


char USART1_getchar(void)
{
  // Ist schon ein Zeichen im Buffer?
  PORTC = 0xFE;  //rechte LED an
  while (!bit_is_set(UCSR1A, RXC1))
    ;
  PORTC = 0xFF; //Rechte LED aus
    return UDR1;

}



//Daten empfangen Routine
unsigned char USART1_readcommand(unsigned char *Nutzdaten, char *Steuerdaten, char *h)
{
  unsigned char  NextByte;
   char  Len;
  unsigned int   i;
  unsigned int   CheckSummCalc;
  unsigned int   CheckSummRead;

  CheckSummCalc = 0;
  Steuerdaten[0] = USART1_getchar();   // CommandoByte 1
  CheckSummCalc += Steuerdaten[0];
  Steuerdaten[1] = USART1_getchar();   // CommandoByte 2
  CheckSummCalc += Steuerdaten[1];


 // Anzahl der Datenbytes lesen
  Len = USART1_getchar();
  CheckSummCalc += Len;
  // Jetzt kommen die Datenbytes

  if(h==0) //für Initialisierung h wird später auf 1 gesetzt
    {
    Len = 11;
    }

  for( i = 0; i < Len; i++ )
  {
    NextByte = USART1_getchar();
    CheckSummCalc += NextByte;
    Nutzdaten[i] = NextByte;
  }

  // Daten sind gelesen. Jetzt kommen noch 2 Bytes Checksumme
  CheckSummRead = USART1_getchar();
  CheckSummRead = ( CheckSummRead << 8 ) + USART1_getchar();



  if (CheckSummRead != CheckSumm && Steuerdaten[1] == 0X31) //Tempwerte änderung
  {
    Tempstatus = 1;
      //Testfunktionen
      USART2_Transmit(CheckSummRead);
      USART2_Transmit(CheckSumm);
    CheckSumm = CheckSummRead;
  }

            if(h==0)
            {
             Steuerdaten[0]=0X4D;
             Steuerdaten[1]=0X41;
             Steuerdaten[2]=0X01;
             Steuerdaten[3]=0X01;
             Steuerdaten[4]=0X00;
             Steuerdaten[5]=0X90;

             for(i=0; i<=5 ;i++)
                    {
                      USART1_Transmit(Steuerdaten[i]);
                    }
            }

  return Len;
}



void USART2_ValuesTransmit(unsigned char *Nutzdaten)
{
  unsigned char Sendstring[31];
  int j;
  Sendstring[0]=0x66; // f
  Sendstring[1]=0x62; // b
  Sendstring[2]=0x73; // s
  Sendstring[3]=0x30; // 0
  Sendstring[4]=0x35; // 5
  Sendstring[5]=0x2F; // /
  Sendstring[6]=0x30; // 0 Hauptlinie hb
  Sendstring[7]=0x31; // 1 Hauptlinie lb
  Sendstring[8]=0x2F; // /
  Sendstring[9]=0x62; // b Mittellinie
  Sendstring[10]=0x2F; // /
  Sendstring[11]=0x00; // 0 Teilnehmer
  Sendstring[12]=0x00; // 0 Teilnehmer
  Sendstring[13]=0x00; // 0 Teilnehmer     1. Temperatur
  Sendstring[14]=0x3D; // =

  for(j=0; j<=20 ;j++) //Erste Temperatur senden
  {
    USART2_Transmit(Sendstring[j]);

  }

  Sendstring[11]=0x00; // 0 Teilnehmer
  Sendstring[12]=0x00; // 0 Teilnehmer
  Sendstring[13]=0x00; // 0 Teilnehmer    2. Temperatur

  for(j=0; j<=20 ;j++) //Zweite emperatur senden
    {
      USART2_Transmit(Sendstring[j]);

    }
  //Status senden

      Sendstring[11]=0x00; // 0 Teilnehmer
      Sendstring[12]=0x00; // 0 Teilnehmer
      Sendstring[13]=0x00; // 0 Teilnehmer

      if(Nutzdaten[1] == 2)
      {
      Sendstring[15]='A';
      Sendstring[16]='n';
      Sendstring[17]='h';
      Sendstring[18]='e';
      Sendstring[19]='i';
      Sendstring[20]='z';
      Sendstring[21]='e';
      Sendstring[22]='n';
      Sendstring[23]=0x0D; // CR
      Sendstring[24]=0x0A; // LF
      }
      if(Nutzdaten[1] == 3)
        {
        Sendstring[15]='H';
        Sendstring[16]='e';
        Sendstring[17]='i';
        Sendstring[18]='z';
        Sendstring[19]='e';
        Sendstring[20]='n';
        Sendstring[21]=0x0D; // CR
        Sendstring[22]=0x0A; // LF
        }
      if(Nutzdaten[1] == 4)
          {
          Sendstring[15]='F';
          Sendstring[16]='e';
          Sendstring[17]='u';
          Sendstring[18]='e';
          Sendstring[19]='r';
          Sendstring[20]='h';
          Sendstring[21]='a';
          Sendstring[22]='l';
          Sendstring[23]='t';
          Sendstring[24]='u';
          Sendstring[25]='n';
          Sendstring[26]='g';
          Sendstring[27]=0x0D; // CR
          Sendstring[28]=0x0A; // LF
          }
      if(Nutzdaten[1] == 6)
          {
          Sendstring[15]='T';
          Sendstring[16]='u';
          Sendstring[17]='e';
          Sendstring[18]='r';
          Sendstring[19]='-';
          Sendstring[20]='o';
          Sendstring[21]='f';
          Sendstring[22]='f';
          Sendstring[23]='e';
          Sendstring[24]='n';
          Sendstring[25]=0x0D; // CR
          Sendstring[26]=0x0A; // LF
          }
      if(Nutzdaten[1] == 0)
        {
        Sendstring[15]='S';
        Sendstring[16]='t';
        Sendstring[17]='o';
        Sendstring[18]='e';
        Sendstring[19]='r';
        Sendstring[20]='u';
        Sendstring[21]='n';
        Sendstring[22]='g';
        Sendstring[23]=0x0D; // CR
        Sendstring[24]=0x0A; // LF
        }
      if(Nutzdaten[1] == 5)
        {
        Sendstring[15]='F';
        Sendstring[16]='e';
        Sendstring[17]='u';
        Sendstring[18]='e';
        Sendstring[19]='r';
        Sendstring[20]='-';
        Sendstring[21]='A';
        Sendstring[22]='u';
        Sendstring[23]='s';
        Sendstring[24]=0x0D; // CR
        Sendstring[25]=0x0A; // LF
        }
  for(j=0; j<=30 ;j++) //Status senden
          {
            USART2_Transmit(Sendstring[j]);

          }

}

//Funktion Temperatur anfordern
unsigned char Tempanfordern()
{
  unsigned int j;
  unsigned char Tempstring[8];
  Tempstring[0]=0X4D;     //M2
  Tempstring[1]=0X32;
  Tempstring[2]=0X01;
  Tempstring[3]=0X01;
  Tempstring[4]=0X00;
  Tempstring[5]=0X81;

      for(j=0; j<=5 ;j++)
      {
        USART1_Transmit(Tempstring[j]);

      }
  Tempstring[0]=0X52;    //Rb
  Tempstring[1]=0X62;
  Tempstring[2]=0X03;
  Tempstring[3]=0X00;
  Tempstring[4]=0X00;
  Tempstring[5]=0X01;
  Tempstring[6]=0X00;
  Tempstring[7]=0XB8;
  for(j=0; j<=7 ;j++)
    {
      USART1_Transmit(Tempstring[j]);

    }
  for( j = 0; j < 6; j++ )    //Erste Zeichen des Antwortstrings verwerfen
    {
      Tempstring[j] = USART1_getchar();

    }

  return 1;
}



int main(void)
{

    UCSR0B |= (1<<TXEN0);                // USART1 TX einschalten
    UCSR1B |= (1<<TXEN1);                // USART2 TX einschalten
    UCSR0B |= (1<<RXEN0);
    UCSR1B |= (1<<RXEN1);
    UCSR0C |= (1<<URSEL0)|(3<<UCSZ00);    // USART1 Asynchron 8N1
    UCSR1C |= (1<<URSEL1)|(3<<UCSZ10);    // USART2 Asynchron 8N1

    UBRR0H = UBRR_VAL1 >> 8;
    UBRR1H = UBRR_VAL2 >> 8;
    UBRR0L = UBRR_VAL1;
    UBRR1L = UBRR_VAL2 ;

    while (!bit_is_set(UCSR0A, UDRE0));
    //Timer initialisieren
    TCCR0 |= (1<<CS00)|(1<<CS02);
    TIMSK =(1<<TOIE0);
    sei();//interrupts aktivieren



//Globale Daten:
    struct {
       unsigned initstatus:1; // Initialisierung Ra
       unsigned tempstatus:1; // Temperatur angefordert
       unsigned Tempchange:1; // Temperatur geändert
       unsigned b2Bits:5;    // Dieses Feld ist 2 Bits breit

    } ctlbits;
    ctlbits.initstatus = 0;
    ctlbits.tempstatus = 0;
    ctlbits.Tempchange = 0;
  char Steuerdaten[8];
  char Steuerdatenalt[2];
  int zaehler;
  int counter=0;
  DDRC = 0xFF; //Led

    unsigned char Nutzdaten[60];
    uint16_t Datenlaenge = 0;

    for(zaehler=0;zaehler<60;zaehler++) //Erstmal Array mit Endzeichen füllen
    {
      Nutzdaten[zaehler]='\0';
    }

ISR (TIMER0_OVF_vect)  //Timerroutine
{
  TCNT0 = 0;
  DDRC = 0xFD;
  counter++;
  if(counter==10)
    DDRC = 0xFF;
}


//Initialisierungsstring senden:

  Steuerdaten[0]=0X52;      //Ra
  Steuerdatenalt[0]=0X52;
  Steuerdaten[1]=0X61;
  Steuerdatenalt[1]=0X52;
  Steuerdaten[2]=0X03;
  Steuerdaten[3]=0X00;
  Steuerdaten[4]=0X00;
  Steuerdaten[5]=0X01;
  Steuerdaten[6]=0X00;
  Steuerdaten[7]=0XB7;
  for(zaehler=0; zaehler<=7 ;zaehler++)
  {
    USART1_Transmit(Steuerdaten[zaehler]);

  }

  Steuerdaten[0]=0X4D;      //Ma
  Steuerdaten[1]=0X41;
  Steuerdaten[2]=0X01;
  Steuerdaten[3]=0X01;
  Steuerdaten[4]=0X00;
  Steuerdaten[5]=0X90;
  for(zaehler=0; zaehler<=5 ;zaehler++)
  {
    USART1_Transmit(Steuerdaten[zaehler]);

  }

//Initialisierung Ende



//Daten empfangen und Bestätigungskommando schicken
Kommunikation:
  cli(); //Interrupts sperren
     Datenlaenge = USART1_readcommand(Nutzdaten, Steuerdaten,ctlbits.initstatus);
    sei(); //Interrupts zulassen
     if(ctlbits.initstatus==0)//Für erste Antwort, wird verworfen
     {
       ctlbits.initstatus=1;
       goto Kommunikation;

     }

     //Kommando für Temperaturwerte schicken (nur einmal)
     if(ctlbits.tempstatus == 0 && Steuerdaten[1] == 0X32)
     {
         ctlbits.tempstatus = Tempanfordern();
         goto Kommunikation;
     }
     //Werte an den Bus senden
     if(Tempstatus == 1)
     {
       //Temperaturen senden

       USART2_ValuesTransmit(Nutzdaten);
       Tempstatus = 0;

     }


     Steuerdatenalt[0]=Steuerdaten[0];
     Steuerdatenalt[1]=Steuerdaten[1];
     Steuerdaten[5]= Steuerdaten[0]+Steuerdaten[1]+2;
     PORTC = 0xFB; //LED links an
     for(zaehler=0; zaehler<=5 ;zaehler++)
       {
         USART1_Transmit(Steuerdaten[zaehler]);
       }

     PORTC = 0xFF; //LED links aus
     goto Kommunikation;


while(1);
}


Autor: Er (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
ISR (TIMER0_OVF_vect)  //Timerroutine
{
  TCNT0 = 0;
  DDRC = 0xFD;
  counter++;
  if(counter==10)
    DDRC = 0xFF;
}

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.

Autor: Chris Tian (chris0086)
Datum:

Bewertung
0 lesenswert
nicht 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.
ISR (TIMER0_OVF_vect)  //Timerroutine
{
  TCNT0 = 0;
  DDRC = 0xFD;
  counter++;
  if(counter==100)
  {
    DDRC = 0xFF;
    counter = 0;
  }
}

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

Autor: MeinerEiner (Gast)
Datum:

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

Autor: Chris Tian (chris0086)
Datum:

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

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

Autor: Er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte. Gern geschehen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christian Hohmann (chris0086)

>ok hier ist der Code:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.