Forum: Compiler & IDEs timer1 atmega88


von Matze (Gast)


Angehängte Dateien:

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:
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

von Jörg G. (joergderxte)


Lesenswert?

Musst du 'trapan()' nicht aufrufen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

while(1)
      {
        void trap (); // Deklaration
      }

ist was anderes als

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

Wo hast du das Argument von trap()?

von Matze (Gast)


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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Möglicherweise ist deine Änderung nicht richtig.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Ü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?"

von Matze (Gast)


Angehängte Dateien:

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

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.