timer1 atmega88

Gast #2008489
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:
1
volatile unsigned int timer1 ;
2

3
//--------------------------------------------
4
//Einschalten des Interrupts von Timer 1 COMPA
5
//--------------------------------------------
6

7
void trapan()
8
  {
9
      // Timer 1 16bit
10
      //Setzen des Prescalers auf 1024, Einschalten des compare Modus
11
      TCCR1B |= (1<<CS12) | (1<<CS10) | (1<<WGM12);     
12
    // Berechnung der Zeit
13
    //Frequenz 18432000 Hz
14
    //Prescaler 1024
15
      // (18432000/1024) = 18000   entspricht 1s
16
    // (18432000/1024)*2=36000   entspricht 2s
17
    // (18432000/1024)*3=54000   entspricht 3s
18
                                                                  OCR1A=54000-1;                     
19
     // compare interrupt erlauben  
20
      TIMSK1 |= (1<<OCIE1A);
21
      // Global Interrupts aktivieren
22
      sei();
23
  }
24

25
//------------------------------
26
//Timer 1 COMPA Interrupt Vektor
27
//------------------------------
28

29
ISR (TIMER1_COMPA_vect)
30
  {
31
  
32
    timer1++;
33
  }
34
//---------------------
35
//Ausgabe bei Interrupt
36
//---------------------
37

38
void trap (volatile unsigned int timer1)
39
{
40
if(timer1>=20)
41
{
42
//Initialisierung Ausgabestring
43
    char z[]="Pause!!!!!";
44
    //Ausgabe des strings
45
    uart_puts (z);
46
    //Ausgabe des strings auf dem Lcd
47
    lcdausgabe(z);
48
    timer1 = 0;
49
    }
50

51
}
52

53
int main(void) 
54
  {
55
      
56

57

58
  
59
    while(1)
60
      {    
61
        void trap ();
62
        
63
      }
64
    return 0;  
65
  
66
  }

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
Angehängte Dateien:
Gast #2008560
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.
#2008631
Hier zb
1
void uart_puts (char *s)
2
  {  
3
    //senden solange *s ungleich 0,dem string Endzeichen, ist
4
      while (*s)
5
        {   
6
        //Übergabe des Zeichen
7
        uart_putc(*s);
8
        //Inkrementierung des Pointers
9
            s++;
10
        }
11
    //Inkrementierung des Pointers
12
    s++;
13
    //Zuweisung von '/n' um einen Zeilenumbruch zu senden
14
    *s = '\n';
15
    //Übergabe des Zeichens
16
    uart_putc(*s);
17
  }
veränderst du den übergebenen String. Nicht gut!

Warum so kompliziert in der Ausgabe eines \n?
1
void uart_puts (char *s)
2
  {  
3
    //senden solange *s ungleich 0,dem string Endzeichen, ist
4
      while (*s)
5
        {   
6
        //Übergabe des Zeichen
7
        uart_putc(*s);
8
        //Inkrementierung des Pointers
9
            s++;
10
        }
11
    uart_putc( '\n' );
12
  }

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

Sowas
1
void help()
2
  {  
3
    //Initialisierung des Ausgabestrings
4
    char h[]="led an";
5
    //Ausgabe des strings
6
    uart_puts (h);
7

8
...

ist extrem unübersichtlich, ohne guten Grund.
1
void help()
2
{  
3
  uart_puts( "led an" );
4
  uart_puts( "led aus" ); 
5
  uart_puts( "led blinken" );
6
  uart_puts( "taster 1" );
7
  ....
8
}

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?"
Gast #2008727
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
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.