- LiFePO4 Speicher Test         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: Timer atmega 128

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10
    Anzeige

    E-Bike
    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??

  2. #12
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    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

  3. #13
    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)

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    37
    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.

  5. #15
    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?

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    37
    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?

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10
    ehm ich studiere elektrotechnik, und ja ich habe auch keine großartigen programmierkenntnisse, wir müssen aber auch nur sehr wenig programmieren.. :-D

    - - - Aktualisiert - - -

    der neue quellcode sieht dann bei mir so aus:
    Angehängte Dateien Angehängte Dateien
    • Dateityp: c main.c (1,9 KB, 6x aufgerufen)

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    37
    Beiträge
    106
    Bitte poste dein nächsten Code hier im Forum "lesbar"... also beim antworten den Button erweitern (unten rechts) klicken und dann im Menü "Code einfügen" benutzen und deinen Code reinkopieren. Dann kann man auch schneller lesen, ohne erst was runterladen zu müssen.

    Zu dein Code:

    Ich sortiere ihn mal
    Code:
    
    
    #include <avr/io.h>   // AVR headerfile, in dem die Ansteuerung der I/Os definiert wird
    #define F_CPU 16000000UL // Definiert die CPU-Frequenz auf 16MHz (entspricht Frequenz des verwendeten Quarzes)
    #include <util/delay.h>  // AVR Headerfile, das die Delay-Funktion definiert
    #include <avr/interrupt.h>  // Interrupt Bibliothek
    
    #define preload_value_1  62500    // 1. Vorladewert
    #define preload_value_2  562500   // 2. Vorladewert
    
    void init_timer_1 (void)
    {
      // hier den Timer1 initialisieren
    }
    
    ISR (TIMER1_OVF_vect)
    {
      // Hier dein Code um zwischen 1 ms und 9 ms zu unterscheiden   
    }
    
    int main (void)
    {
      // Portrichtung konfigurieren
      DDRB |=(1<<PB2);           // Output 1
      DDRB |=(1<<PB3);           // Output 2
    
      // Funktion aufrufen um den Timer1 zu initialisieren
      init_Timer_1();
    
      // Interrups global freigeben
      sei();
    
      // Arbeitsschleife
      while(1)
      {
      }
    }
    Den Inhalt von deiner ISR und init-Funktion habe ich mal weg gelassen.

    Aber mal eine andere Frage... du sollst die ungeraden LEDs 1ms und die geraden 9ms leuchten lassen...


    Alle wieviel ms soll sich der Vorgang wiederholen?


    Wie wills du das Ergebnis überprüfen? Denn 1ms und 9 ms sieht man nicht bzw. kaum. Hast du ein Oszilloskop um deine Arbeit zu prüfen?

  9. #19
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    okay grundlegendes(sorry wenn ich gerade nciht feinfühliger formulieren kann):

    deine ISR() hat nichts in der main() zu suchen und das mit der enfdlosschleife war jetzt ncith ganz verkehrt aber dir fehlt definitiv ein wenig grundlagenwissen

    dein controller arbeitet den code der main schleife ab, es sei denn ein interrupt tritt auf der abgearbeitet werden kann/muss

    wenn der controller das ende der main erreicht ist er in einem sog, undefiniertem zustand, sowas sollte grundsätzlich vermieden werden ist aber bei neuern controllern nicht mehr wirklich relevant da die compiler schon sorge dafür tragen dass der controller in einem definierten sicheren zustand bleibt

    also merke: niemals die main verlassen, immer eine while(TRUE) endlosschleife in der main() in der sich wiederholender code abgearbeitet wird

    du möchtest LEDs in festen zeitintervallen laufen lassen, das geht mit ISR auf 2 arten:

    Version 1: dein timer läuft in einem festen zeitintervall über (1mS) und jedesmal im OVF interrupt zählst du eine variable timer hoch (timer++ in der ISR, mehr nicht), in der main() schleife fragst du diese timer variable ab und reagierst entsprechend und steuerst deine LEDS (z.B. wenn (timer < 9) dann LED1 an, wenn (timer < 18 ) LED2 an und timer = 0 zum zurücksetzen des timers)

    Version 2: die elegantere lösung ist es die LED steuerung gleich innerhalb der ISR zu machen, also in der ISR dann so z.B.: wenn (timer < 9) dann LED1 an und timer++, wenn (timer < 18 ) LED2 an und timer = 0 zum zurücksetzen des timers

    Version 2 ist eleganter denn die while(true) in der main() kann leer bleiben und andere aufgaben übernehmen, aber bedenke dass eine ISR immer dazuführt dass der code der main an einer quasi beliebigen stelle unterbrochen werden kann und so vielleicht auch mal dein if in der main eine variable prüft, die im nachfolgenden prozessortakt schon wieder geändert wird udn der inhalt deiner if bedingugn eventuell ungültig wird!

    also merke ISRs sind elegant um aufgaben die von externen triggern (zeit ist in dem kontext der trigger) abhängig sind zu verarbeiten, sollten aber immer so geschrieben werden dass der code in der main davon während der ausführung nicht behindert werden kann

    solltest du in der main mal trotzdem ein KURZES stück code ausführen dass mit der variablen der ISR interagieren muss kannst du kurz vorher ein cli(); und danach ein sei machen also z.B:
    cli();
    <deine bedingung und der code der abhängig ist von der variable>
    sei();

    um alle interrupts kurzzeitig abzuschalten, aber dann kann es passieren dass deine timings nciht eganz exakt passen weil die ISR eventuell ein kleines stück verzögert werden dadurch


    ich weis das war jetzt viel theorie auf einmal aber du brauchst mal ein wenig verständnis, weil dein code im moment eher danach aussieht als ob du rumrätselst was wohin gehört

    ----------------------------
    EDIT: blöde auto smilies XD
    Geändert von Ceos (23.01.2018 um 10:04 Uhr)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2018
    Beiträge
    10
    @ jimmybot : ja richtig, ich soll die zeiten mit einem oszilloskop überprüfen.
    ja die ungeraden LED´s sollen 1ms leuchten und die geraden 9ms und das soll sich sofort abwechseln.

    - - - Aktualisiert - - -

    danke auch für die korrektur da habe ich ein paar sachen falsch gemacht stimmt.

    - - - Aktualisiert - - -

    auch danke an ceos
    ja das stimmt wohl, dass ich eher rumrätsel, ich habe mich, wie man sieht, auch noch nicht großartig mit der programmierung von microcontrollern beschäftigt, aber die neue if anweisungen für die beiden led ansteuerungen kann ich so gut nachvollziehen, danke.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

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

Berechtigungen

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

12V Akku bauen