- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: TIMER,Interrupts und Pulse zählen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26

    TIMER,Interrupts und Pulse zählen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Moin zusammen!
    Ich möchte mit einem ATMEGA 32/16Mhz an PB0 externe Rechteckimpulse zählen(für ene bestimmte Zeit )also zusätzlich noch einen internen Timer benutzen!(Drehzahl Bestimmung max 16000 impulse pro Minute)
    Nun werde ich wohl um das Thema Interrupt routinen und Timer nicht herumkommen!
    Ich habe mich nun intensivst mit den beiden Themen beschäftigt aber nach nun knapp einer Woche bin ich leider zu noch überhaupt keinem Ergebnis gekommen!
    Ich verstehe das mit den Registern und den Timern ...etc. einfach nicht!
    Dabei benötige ich ja eigentlich nur wenige Befehle!
    Ich programmiere in C!

    Weiterhin möchte ich eine Spannnung an PA7 abfragen und dann einen Schaltzustand an einem Port erwirken!
    Wenn PA7 zwischen 1000 und 1024(High) dann soll PC4 HIGH sein
    ...aber nach nochmaligen betätigen soll PC4 wieder LOW sein!

    Die Abfrage der Ports und das Schalten der Zustände ist klar , aber bei meinen Programmierversuchen funktioniert immer nur der Zustand der in der Syntax als erstes steht!Habe es mit Pointern probiert um die AN/AUS Bedingungen gegeneinander zu verriegeln aber geht auch nicht!!!

    Ich befürchte das hier eine Interrupt Routine angebracht ist aber auch mit diesem Thema habe ich wahrlich noch keine Fortschritte erzielen können!
    Habe nun schon viele Tutorien durch, verstehe aber nichts!

    Vielleicht könnt Ihr mir ja etwas auf die Sprünge helfen!

    Viele Grüße Stephan

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Vielleicht könntest du mal zeigen womit du nicht zurecht kommst, ist sicher einfacher.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    Ich weiß nicht , wie ich die Funktion :
    int zähl_Pulse(void)
    mit Pulsen an PB0 für 500 ms zählen...

    und einen Interrupt programmieren soll der mir bei der Betätigung eines Tasters (High an PB7) einen anderen Port auf HIGH/LOW schaltet

    Grüße Stephan

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Im Timer0 gibt es die Option Ext. Clock Source.
    Interrupt Timer Overflow aktivieren, im Interrupt eine Variable hochzählen.
    Mit Timer1 eine Zeitbasis generieren mit alle 0,5sec. ein Interrupt.
    Mit Start von Timer1 wird auch Timer0 gestartet, nach 0,5sec werden beide Timer gestoppt.
    Anzahl der Überläufe von Timer0 *256 + dem Zählerstand von Timer0 ergibt die Anzahl der Takte in 0,5sec.
    Tastenerkennung machst du am besten durch pollen, prellen der Taste berücksichtigen.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    Erstmal vielen Dank für die Antwort! Aber ich weiß einfach nicht welche Befehle ich für welchen Timer nehmen muß oder welche Register ich wann auslesen muß und wie die heißen!Ich habe echt null Ahnung von Timern und Interrupts!Auch was Polling ist weiß ich nicht!

    Egal was ich darüber lese ich kann aus keinem Tutorial etwas sinnvolles für mich herausfiltern!

    Viele Grüße Stephan

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    So, ich habe mal was probiert aber es klappt nicht!!!

    int drehzahl_MOT(void)
    {

    int n = 0;


    OCR1AH = 0x0c; //Torzeit festlegen 200ms (16Mhz/1024)/5
    OCR1AL = 0x35;

    TCCR1A = TCCR1A | ~(1<< COM1A1) | ~(1<< COM1A0); //TIMER 1 NORMAL PORT OPERATIONS
    TCCR0 = TCCR0 | (1<< CS02) | (1<< CS01) | (1<< CS00); //TIMER0:EXT. Takt an PB0 Steigende Flanke zählen
    TCCR1B = TCCR1B | (1<< CS12) | ~(1<< CS11) | (1<< CS10); //TIMER1:PRESCALE 16MHZ/1024 START

    while((1<< OCF1A))n = TCNT0; //Abfrage COMPARE Register Timer 1 wenn TORZEIT erreicht ---->dann weiter

    TCCR0 = TCCR0 | ~(1<< CS02) | ~(1<< CS01) | ~(1<< CS00); //TIMER0 STOPP
    TCCR1B = TCCR1B | ~(1<< CS12) | ~(1<< CS11) | ~(1<< CS10); //Timer1 STOPP
    TIFR = TIFR | (1<< OCF1A); //COMPARE-FLAG rücksetzen
    TCNT0 = 0x00;
    TCNT1H = 0x00;
    TCNT1L = 0x00;

    return n;

    }


    ich weiß echt nicht weiter !Ich kappiere das einfach nicht mit den Timern und den Interrupts!!!

    WER KANN MIR HELFEN???


    Viele Grüße Stephan

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Zum einen verwendest du hier keinen Interrupt.
    Bits in einem Register löscht man so:
    TCCR1B &= ( ~(1<< CS12) | ~(1<< CS11) | ~(1<< CS10)); //Timer1 STOPP
    Schau dir mal diese Tutorial an:
    http://www.mikrocontroller.net/artic...R-GCC-Tutorial
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Hier kannst auch mal reingucken (aufmerksam lesen und versuchen es zu verstehen) http://www.rn-wissen.de/index.php/Timer/Counter_(Avr)

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    Also ich habe diese tutorials jetzt zum xten mal durch aber mir erschließt sich einfach nicht das Zusammenspiel der Timer und der Interrupts und die Anwendung der dazugehörigen Befehle!!!!

    Ich möchte doch nur für eine frei wählbare Zeit Pulse an PB0 zählen!

    Tut mir leid ich verstehe das alles nicht!

    Vielen Dank für eure Hilfe und viele Grüße Stephan

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    So, der letzte Versuch!! Was mache ich falsch der Compiler macht nichts daraus!!!

    Vielleicht könnt ihr mir ja mal etwas tatkräftiger unter die Arme greifen anstatt dauernd auf die Tutorials zu verweisen!!!Das hilft mir auch nicht allzusehr weiter!


    int n = 0;

    TCCR1A = 0x00; //TIMER1 kein PWM ,Normale Portfunktion
    TCCR1B = 0xcd; //Fette Modifizierung
    OCR1AH = 0x30; //Schreiben Torzeit Kompare-Register High-Byte
    OCR1AL = 0xd4; //Schreiben Torzeit Kompare-Register Low-Byte
    TCCR0 = 0x07; //Grob:TIMER0 zähler bei steigender Flanke

    TIMSK |= (1<<OCIE1A); // Compare Interrupt erlauben
    sei(); // Global Interrupts aktivieren

    ISR (TIMER1_COMPA_vect)
    {
    n = TCNT0;
    TCNT0 = 0;
    TCCR0 = 0x07; //Grob:TIMER0 zähler bei steigender Flanke
    }


    das habe ich mitten in die Main gepflanzt und habe gehofft das nun n von jeder Stelle im Programm gelesen werden könnte!

    Viele Grüße Stephan

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress