- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 21

Thema: Timer atmega 128

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    oh ähm ja klar timer1 .. dann isses natürlcih CS12 hab mich von dem typo hiniressen lassen ... immer dieses blöde copy&paste

    in der doku steht ja CSn0 CSn1 und CSn2 wobei n für dne timer steht haha
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10
    ja danke :-D
    ich habe jetzt noch eine doofe frage aber was soll schon passieren..
    also die 1 ms habe ich jetzt aber ich soll ja jede zweite LED 9 ms leuchten lassen.
    muss ich dafür einen zweiten timer einfügen oder reicht dass mit diesem invertierenden befehl bei else? ist das programm denn sonst richtig??

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.655
    Zitat Zitat von zrmba Beitrag anzeigen
    .. also die 1 ms habe ich jetzt aber ich soll ja jede zweite LED 9 ms leuchten lassen ..
    Und - bist Du schon weiter ?
    Ciao sagt der JoeamBerg

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10
    grüss dich,
    Ich habe noch etwas am quellcode geändert.
    Wenn ich das programm laufen lasse, funktioniert es immernoch nicht so wie gewünscht...
    Angehängte Dateien Angehängte Dateien
    • Dateityp: c main.c (1,8 KB, 17x aufgerufen)

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    36
    Beiträge
    106
    Code:
    ISR (TIMER1_OVF_vect)
    {
     
        long timer_1 = 0 ;                          // Variable "Timer1" deklarieren
        long timer_2 = 0 ;                          // Variable "Timer2" deklarieren
       
     while (1)
     
     {
        
       timer_1 ++;                          // Vorladewert von 0 an inkrementieren
         
       PORTB = 0xAA ;                      // ungerade LED´s werden für 1 ms beleuchtet
       
       if (timer_1 = preload_value_1) 
     
       {
     
         TIMSK = (1 << TOIE1);                // 1 ms ist vergangen -> Interrupt einschalten
      
      }
       
      
      else { 
       
       timer_2 ++;
         
        PORTB=0x55 ;               // gerade LED´s werden für 9 ms beleuchtet
         
       if (timer_2 = preload_value_2)
       { 
        TIMSK = (1 << TOTIE1);             //  9 ms sind vergangen-> Interrupt einschalten
       }
                
      }
     }
    }
    warum hast du in dein Interrupt eine Endlosschleife?

    Code:
    int main (void)
    {
     DDRB |=(1<<PB2);           // Output 1
     DDRB |=(1<<PB3);           // Output 2
         
      
    sei ();
      
      
       
    }
    Dein Programm ist schneller beendet, als der Timer1 sein Interrupt auslöst.
    Und du greifst gar nicht auf deine init_Timer1 Funktion zu. Also läuft dieser erst gar nicht an.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10
    ja ich habe eine endlosschleife benutzt, weil der wechsel zwischen 1 ms und 9 ms ewig stattfinden soll.
    achso, ja wo kommt das sei() dann genau hin?

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    36
    Beiträge
    106
    Okay... ich erkläre es dir, aber ich sehe hier ein großes Wissensdefizit im Bereich Progammierung von Microcontroller in der Sprache C bzw. C++!
    (Und ja... ich bin auch nicht der super Programmierer)

    sei(); gibt hier die Interrupt global frei. Soll heißen, dass du den Controller erlaubst auf Interrupt zu reagieren. cli(); ist dem entsprechen die Sperrung von Interrupt.

    Deine Endloschleife (oder auch Arbeitsschleife genannt) sollte in der Main Funktion sein (hinter der Initialisierung).
    Interrupts sollten immer so kurz und knapp programmiert werden wie möglich, um die Unterbrechung vom Programm möglichst kurz zu halten (ist aber in deinem Fall egal).

    von daher würde ich dein Code so strukuieren:
    Code:
    - Einbinden von Headerdatein
    
    - Funktionen und Interruproutinen 
    
    -Hauptfunktion
      + Portrichtung konfigurieren
      + Timer initialisieren
      + Interrups global freigeben
    
      + Arbeitsschleife
    Sry, dass ich meine Antwort möglichs oberflächlich halte. Aber ich lese aus deinem ersten Post herraus, dass du den Auftrag hast den Code zu entwickeln bzw. dir Gedanken dazu zu machen sollst. Wir sind alle bereit dir zu helfen, aber ich werde dir keinen fertigen Code anbieten.

    Darf man hier fragen, wer dich dazu verdammt hat?

Ähnliche Themen

  1. Atmega Timer problem
    Von Technik_Amateur im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 22.11.2013, 17:07
  2. ATMEGA 16 TIMER-Problem
    Von fulltime im Forum C - Programmierung (GCC u.a.)
    Antworten: 29
    Letzter Beitrag: 16.03.2012, 14:36
  3. Atmega 8 Timer
    Von woodeye im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 25.09.2009, 15:44
  4. Atmega mit >3 Timer
    Von manhunt im Forum AVR Hardwarethemen
    Antworten: 12
    Letzter Beitrag: 14.12.2008, 14:10
  5. Probleme mit Timer und ATMega 32
    Von steffen21m im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 07.01.2008, 19:17

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test