mikrocontroller.net

Forum: Compiler & IDEs timer1 atmega88


Autor: Matze (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Abend zusammen.

Ich benutze den compare Interupt von Timer1.

Dies funktioniert auch ohne Probleme wenn ich meine Ausgabe direkt in 
die ISR schreibe.

Jetzt habe ich eine voaltile Variable deklariert,die in der ISR 
inkrementiert wird.

In einer Unterfunktion wird dann die Ausgabe ausgeführt.

Nur leider funktioniert es jetzt nicht mehr und ich finde den Fehler 
einfach nicht.

Hier mal der Code:
volatile unsigned int timer1 ;

//--------------------------------------------
//Einschalten des Interrupts von Timer 1 COMPA
//--------------------------------------------

void trapan()
  {
      // Timer 1 16bit
      //Setzen des Prescalers auf 1024, Einschalten des compare Modus
      TCCR1B |= (1<<CS12) | (1<<CS10) | (1<<WGM12);     
    // Berechnung der Zeit
    //Frequenz 18432000 Hz
    //Prescaler 1024
      // (18432000/1024) = 18000   entspricht 1s
    // (18432000/1024)*2=36000   entspricht 2s
    // (18432000/1024)*3=54000   entspricht 3s
                                                                  OCR1A=54000-1;                     
     // compare interrupt erlauben  
      TIMSK1 |= (1<<OCIE1A);
      // Global Interrupts aktivieren
      sei();
  }

//------------------------------
//Timer 1 COMPA Interrupt Vektor
//------------------------------

ISR (TIMER1_COMPA_vect)
  {
  
    timer1++;
  }
//---------------------
//Ausgabe bei Interrupt
//---------------------

void trap (volatile unsigned int timer1)
{
if(timer1>=20)
{
//Initialisierung Ausgabestring
    char z[]="Pause!!!!!";
    //Ausgabe des strings
    uart_puts (z);
    //Ausgabe des strings auf dem Lcd
    lcdausgabe(z);
    timer1 = 0;
    }

}

int main(void) 
  {
      


  
    while(1)
      {    
        void trap ();
        
      }
    return 0;  
  
  }


Also das ganze ist Teil eines Terminalservers.
Ich lese über uart einen Befehl ein.
Damit kann ich den Timer aktivieren.
Das funktioniert auch alles, wenn ich die Ausgabe von trap() direkt in 
die ISR reinschreibe. Sobald ich es so wie im geposteten Code mache geht 
es nicht mehr.
Im Anhang hab ich mal meinen ganzen Code hochgeladen.
Hoffe mir kann jemand helfen.
Bin jetzt schon ewig am rumsuchen und finde den Fehler einfach nicht
gruß Matze

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Musst du 'trapan()' nicht aufrufen?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while(1)
      {
        void trap (); // Deklaration
      }

ist was anderes als

    while(1)
      {
        trap(); // Funktionsaufruf
      }

Wo hast du das Argument von trap()?

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh man wie peinlich.

Hab das jetzt geändert.

Habe auch die Übergabe an die Funktion trap rausgemacht.
Die wird ja nicht benötigt oder?

Es funktioniert aber leider trotzdem nicht.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Möglicherweise ist deine Änderung nicht richtig.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier zb
void uart_puts (char *s)
  {  
    //senden solange *s ungleich 0,dem string Endzeichen, ist
      while (*s)
        {   
        //Übergabe des Zeichen
        uart_putc(*s);
        //Inkrementierung des Pointers
            s++;
        }
    //Inkrementierung des Pointers
    s++;
    //Zuweisung von '/n' um einen Zeilenumbruch zu senden
    *s = '\n';
    //Übergabe des Zeichens
    uart_putc(*s);
  }

veränderst du den übergebenen String. Nicht gut!

Warum so kompliziert in der Ausgabe eines \n?
void uart_puts (char *s)
  {  
    //senden solange *s ungleich 0,dem string Endzeichen, ist
      while (*s)
        {   
        //Übergabe des Zeichen
        uart_putc(*s);
        //Inkrementierung des Pointers
            s++;
        }
    uart_putc( '\n' );
  }

Durch das \n, das du da anhängst, könnte es jetzt sein, dass deine 
strcmp nicht mehr funktioniert haben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Überhaupt

Sowas
void help()
  {  
    //Initialisierung des Ausgabestrings
    char h[]="led an";
    //Ausgabe des strings
    uart_puts (h);

...

ist extrem unübersichtlich, ohne guten Grund.
void help()
{  
  uart_puts( "led an" );
  uart_puts( "led aus" ); 
  uart_puts( "led blinken" );
  uart_puts( "taster 1" );
  ....
}

Die Ausgagefunktionen sind alle so geschrieben, dass du denen direkt 
Text übergeben kannst. Du brauchst da keine Zwischenvariablen!


Lies dir mal zum Thema Kommentare das hier durch
Beitrag "Re: MEGA32, Speicher schon voll?"

Autor: Matze (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal danke für eure Hilfe.

Ich habe den Fehler jetzt gefunden.
Das Problem war, dass wenn kein Zeichen empfanegen wurde die Funktion 
dort stehen gebleiben ist und deshalb die trap() nicht aufgerufen wurde.
Hab das jetzt geändert.Jetzt funktionierts.

@Karl heinz Buchegger

Danke für ihre Hinweise.
Habe das mit den Ausgaben jetzt geändert.

Die Kommentare habe ich drin gelasen.
Ich bin C Anfänger und brauche diese deshalb unbedingt, bis ich mal 
richtig durchblicke.

Habe das fertige Programm auch nochmal angehängt, falls es jemand 
interessiert.

gruß Matze

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.