- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: ATtiny2313 PWM/ Timer ausprogrammieren

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2011
    Beiträge
    16
    Anzeige

    Powerstation Test
    Ich beziehe mich jetzt mal nur auf: http://www.mikrocontroller.net/artic...A4hler_des_AVR
    Da steht, so wie ich das verstehe (im Gegensatz zum 8bit Timer) bietet der 16bit Timer "Die PWM-Betriebsart zur Erzeugung eines pulsweitenmodulierten Ausgangssignals."
    Und zur PWM steht in dem 8bit Timer-Abschnitt ja auch gar nichts. Gut zu wissen, dass es da doch welche gibt^^

    Die Einstellungsregister für den 16bit Timer sind ja TCCR1A und TCCR1B. D.h. beide Register zum Einstellen des einen (zweiten) Timers. Und pro Timer hat man doch nur einen Zähler nämlich TCNT1H/TCNT1L.
    Wenn es so ist, dass man aber Zwei OCR-Werte zum Vergleichen hat, wo wird denn festgelegt, was beim Compare Match des zweiten gemacht wird? Für einen der beiden hat man ja in TCCR1A/TCCR1B festgelegt, dass ein PIN auf 0,1 gesetzt,getoggled werden soll, wo sagt man das für den zweiten.
    Oder gilt die eine Einstellung für beide Compare Matches und es wird in selber Weise der PIN auf 1,0 gesetzt, aber dann zu unterschiedlichen Zeitpunkten?
    Auf der Seite wird dazu gar nichts gesagt und man denkt es gäbe nur einen OCR.

    Und die andere Frage ist, wie man die PWM-Funktion beim 8bit Timer benutzt? Laut der Seite hat Timer0 nur ein TCCR0 für die Einstellungen (kein A oder B) und dort werden auch nur die ersten drei Bits benutzt, nämlich für den Prescaler.
    Scheinbar fehlen auf der Seite viele Erklärungen.

    Ich werde mir das Manual natürlich noch häufiger durchlesen, bis ichs eben verstanden hab, aber gibts vllt eine deutsche Seite, die das etwas vollständiger Erklärt?

  2. #12
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die 8 Bit timer sind nicht alle gleich. Bei den neueren AVRs haben auch die 8 Bit timer oft 2 OCR Register und man kann entsprechend damit auch 2 PWM Kanäle erzeugen. Wie es geht ließt man am besten im Datenblatt nach, denn Timer0 und Timer2 sind ggf auch etwas verschieden.

    Wie die PWM Pins reagieren kann man beim Tiny2313 im Register TCCR1A einstellen, für beide Kanäle getrennt. Der 2. Kanal fehlt nur im den Tutorial - keine Ahnung für welchen µC das ist.

  3. #13
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Erst mal was Grundsätzliches:
    Die Tutorials orientieren sich an einem konkreten Controller als Beispiel. Da die Tutorials meist schon älter sind, ist dann auch dieser "Referenz-Controller" schon älter. Im obigen Fall ist es der AT90S2313, und der ist nun wirklich schon steinalt. Die Tutorials sind also nur dafür gut, die Grundlagen und Prinzipien zu verstehen. Wenn es an die konkreten Details geht, gibt es für dich nur eine Referenz, nämlich das Datenblatt zu dem Controller, den du konkret verwenden willst. Die sind in Englisch, finde dich damit ab. Das Technik-Englisch in den Datenblättern ist einfach, und außerdem kommst du ums Englisch eh nicht drumherum, wenn du mit Elektronik basteln willst.

    Wenn es so ist, dass man aber Zwei OCR-Werte zum Vergleichen hat, wo wird denn festgelegt, was beim Compare Match des zweiten gemacht wird? Für einen der beiden hat man ja in TCCR1A/TCCR1B festgelegt, dass ein PIN auf 0,1 gesetzt,getoggled werden soll, wo sagt man das für den zweiten.
    In den selben Registern. Wenn es zwei PWM-Kanäle gibt, dann gibt es in TCCR1A sowohl Bits, die das für Kanal A festlegen (COM1A1/COM1A0), als auch welche für Kanal B (COM1B1/COM1B0).

    Auf der Seite wird dazu gar nichts gesagt und man denkt es gäbe nur einen OCR.
    Und die andere Frage ist, wie man die PWM-Funktion beim 8bit Timer benutzt? Laut der Seite hat Timer0 nur ein TCCR0 für die Einstellungen (kein A oder B) und dort werden auch nur die ersten drei Bits benutzt, nämlich für den Prescaler.
    Scheinbar fehlen auf der Seite viele Erklärungen.
    Nein, es fehlen keine Erklärungen, der AT90S2313 hat das nur alles noch nicht. Timer1 hat bei dem nur einen PWM-Kanal und Timer0 kann gar keine PWM.
    MfG
    Stefan

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2011
    Beiträge
    16
    Ok ich hätte mir wohl gleich das Datenblatt vornehmen sollen^^ Das hab ich soweit verstanden:

    8bit Timer:

    TCCR0A - WGM00/WGM01: Geben den Timer Modus an (zusammen mit WGM02 aus TCCR0B)
    COM0A1/COM0A0: Legen fest was mit dem PIN OC0A (je nach Modus) passieren soll.
    COM0B1/COM0B0: Legen fest was mit dem PIN OC0B (je nach Modus) passieren soll.
    TCCR0B - CS00/CS01/CS02: Setzten die Geschwindigkeit des Timers (den Prescaler)
    WGM02: Gehört zu WGM0:1 aus TCCR0A

    TCNT0 - Der 8bit Zählwert 0..255

    OCR0A - 8bit Vergleichswert für pin OC0A.
    OCR0B - 8bit Vergleichswert für pin OC0B.

    TIMSK - Bestimmt ob bei einem jeweiligen Compare Match/Overflow außer dem pin-umlegen
    auch noch ein Interrupt ausgelöst werden soll.
    OCIE0A: Wenn gesetzt -> Interrupt bei Compare Match von OCR0A.
    OCIE0B: Wenn gesetzt -> Interrupt bei Compare Match von OCR0B.
    TOIE0: Wenn gesetzt -> Interrupt bei Overflow von TCNT0.

    (TIFR - Enthält die Compare Match Flags bzw. das Overflow Flag)

    /* Zum Verständnis: Es gibt beim Timer keinen Compare Match-losen Modus. Wenn man die
    Möglichkeiten der Compare/Vergleich/Pinumlegungs-Modi nicht benutzen will, sondern
    z.B. nur den "normalen" Timer der bis 255 zählt und dann eine ISR aufruft haben will,
    lässt man die WGM0:2/OCR/COM-Bits einfach leer und startet den Timer einfach über
    CS00/CS01/CS02 in TCCR0B und setzt das Overflow-Interrupt-Bit TOIE0 in TIMSK.

    In diesem "normalen" Modus (WGM-Bits auf 0) einem der Vergleichswerte der OC-Bits einen
    Wert gibt und über die COM0-Bits sagt, wie der pin beim Compare Match gesetzt werden
    soll, passiert auch das. (pin als Ausgang schalten nicht vergessen)
    (wenn gleichzeitig noch ein Compare Match Interrupt ausgelöst werden soll->TIMSK)

    Im CTC-Modus wird das eine Compare-Register (OCR0A) benutzt um die Obergrenze von 255
    auf einen beliebigen, kleineren Wert zu setzten, bis zu dem der Timer dann immer zählt.
    Die Compare Match-Pinumlegungsmöglichkeiten hat man aber nach wie vor und OCR0B kann
    man immer noch frei in diesem Bereich bewegen. Lediglich der Compare-Match-Interrupt
    den OCR0A auslöst, findet gleichzeitig mit dem Overflow-Interrupt statt.

    Zu dem PWM-Modi zählen der Fast PWM-Modus, in dem der Timer, wie im "normalen" Modus,
    immer bis 255 zählt, aber im Gegensatz dazu wird ein OC-Bit hier nicht nur beim
    Compare Match verändert, sondern noch ein zweites Mal beim Overflow.
    (was in jedem Modus jeweils passiert wird über die COM-Bits festgelegt)

    Der zweite PWM-Modus ist der Phase Correct Modus, in dem der Timer wieder von 0..255
    zählt, dann jedoch keinen Overflow verursacht und wieder bei 0 anfängt, sondern
    anschließend rückwärts bis 0 zurück zählt. Auch hier werden die Bits (wie im Fast PWM)
    zweimal verändert. Einmal beim Compare Match, wenn der Zähler beim Hochzählen
    vorbeikommt und das zweite Mal beim Runterzählen.
    (einen Overflow Interrupt kann es also nicht geben)
    Beide PWM-Modi kann man auch CTC-artig benutzen, also dass nicht bis 255 sondern bis
    zu dem Wert gez#hlt wird, den man in OCR0A gesetzt hat. (WGM0:1:2 in Mode 5 bzw. 7) */




    Frage1: Wenn man den CTC-Modus benutzt, wird der TOP-Wert laut Datenblatt in OCR0A
    erwartet. Heißt das, dass man nur noch OCR0B frei setzten kann?

    Frage2: Im Datenblatt auf Seite 75 steht in der Tabelle zum Phase Correct PWM Mode, dass
    einmal ORC0B ge-cleart wird, dann dass OCR0B gesetzt wird, überall wird von OCR0B geredet
    dabei macht das doch gar keinen Sinn, weil es hier doch um den Port OC0B geht.
    Haben die (perfekten Atmel-Leute hier etwa einen Fehler reingebaut und überall ein R
    reingeschrieben, wo es nicht hin gehört?
    In der Tabelle für OC0A steht das nämlich alles ohne R da.

    Frage3: In Tabelle 40 auf Seite 75 des Datenblattes gibt es eine Spalte "Update of OCRx at"
    Warum wird OCRx ge-updatet und nicht der zugehörige Port OCx. Ich dachte die OCR0A/OCR0B
    Werte verändert nur der User, wie er sie braucht. Und wenn da tatsächlich die Output-Pins
    gemeint sind, warum steht dann nicht in jeder Zeile Immediate.
    Was würde es für einen Sinn machen den Pin, der z.B. im Mode1-Phase-Correct beim Hochzählen
    gesetzt werden soll, erst beim Erreichen von TOP zu updaten/zu setzten. Das ist dann doch
    ein ganz anderer Zeitpunkt. Und wenn anschließend runtergezählt wird, der Pin beim
    Compare Match beim Runterzählen wieder gesetzt werden sollte, wird er es auch nicht,
    sondern erst beim nächsten Erreichen von TOP? Das kann nicht sein.

  5. #15
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Im CTC-Modus ...
    Lediglich der Compare-Match-Interrupt den OCR0A auslöst, findet gleichzeitig mit dem Overflow-Interrupt statt.
    Nein, die Interrupts finden nicht gleichzeitig statt. Der Overflow-Interrupt passiert weiterhin beim Erreichen von MAX (nicht TOP). Da MAX im CTC-Modus ja aber gar nicht erreicht wird, gibt es auch keinen Overflow-Interrupt.

    Der zweite PWM-Modus ist der Phase Correct Modus, ...
    (einen Overflow Interrupt kann es also nicht geben)
    Doch gibt es, und zwar immer dann, wenn er wieder bei 0 angekommen ist.

    Die Spalte "TOV Flag Set on" in Tabelle 40 sagt dir, wann jeweils ein Overflow-Interrupt ausgelöst wird.


    Frage1: Wenn man den CTC-Modus benutzt, wird der TOP-Wert laut Datenblatt in OCR0A
    erwartet. Heißt das, dass man nur noch OCR0B frei setzten kann?
    Du kannst schon beide frei setzen und es wird auch bei beiden ein Compare-Match ausgelöst, nur dass halt OCR0A zusätzlich als TOP fungiert. Du kannst so den TOP-Wert bei laufenden Timer ändern.

    Frage2: Im Datenblatt auf Seite 75 steht in der Tabelle zum Phase Correct PWM Mode, dass
    einmal ORC0B ge-cleart wird, dann dass OCR0B gesetzt wird, überall wird von OCR0B geredet
    dabei macht das doch gar keinen Sinn, weil es hier doch um den Port OC0B geht.
    Haben die (perfekten Atmel-Leute hier etwa einen Fehler reingebaut und überall ein R
    reingeschrieben, wo es nicht hin gehört?
    In der Tabelle für OC0A steht das nämlich alles ohne R da.
    Glückwunsch, du hast gerade festgestellt, dass auch die Atmel-Leute nur Menschen sind.
    Dir werden im Laufe der Zeit noch mehr Fehler auffallen.

    Frage3: In Tabelle 40 auf Seite 75 des Datenblattes gibt es eine Spalte "Update of OCRx at"
    Warum wird OCRx ge-updatet und nicht der zugehörige Port OCx. Ich dachte die OCR0A/OCR0B
    Werte verändert nur der User, wie er sie braucht. Und wenn da tatsächlich die Output-Pins
    gemeint sind, warum steht dann nicht in jeder Zeile Immediate.
    In den Erklärungen zum Timer im Datenblatt hast du entweder einen Abschnitt übersprungen, oder gründlich missverstanden.
    Immer wenn du in irgendeines der OCRx-Register schreibst, landet der Wert nicht wirklich in dem Register, sondern wird in einem versteckten namenlosen Register "zwischengelagert". Erst wenn der Timer einen bestimmten Wert erreicht, wird der Inhalt aus dem Zwischenregister in das eigentliche Register geschrieben. Die Spalte in der Tabelle gibt an, wann das bei welchem Timer-Mode passiert.
    MfG
    Stefan

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2011
    Beiträge
    16
    Ja das stimmt, ich hab einen wichtigen Abschnitt wirklich eben erst gelesen.
    Also das "Update of OCRx at" gibt es, weil man den OCRx-Wert in manchen Fällen
    double-buffered hat. Wenn man OCR1A als TOP-Wert in einem Modus benutzt und ihn im
    laufenden Programm ändern will, weil man eine andere Frequenz braucht etc. und man ihn
    kleiner machen will, aber der Zähler (TCNT) grade über der neuen TOP-Grenze ist, wäre die
    Grenze nach dem Umsetzten weg und er würde bis FFFF zählen. Das double-buffered bedeutet,
    dass es eine Kopie von der OCR1A gibt, die der Zähler als TOP benutzt und wenn man
    OCR1A ändert, hat man TOP damit noch gar nicht verändert. Die Zahl in OCR1A wird erst beim
    nächsten Erreichen von "Update of OCRx at" in die (wichtigere) Kopie kopiert.

    (Und wenn man beim 16bit Timer ICR1 statt OCR1A benutzt und ihn ändert kann es aber doch
    passieren, dass man dem Zähler für den aktuellen Durchlauf die Obergrenze wegnimmt und er
    bis FFFF durchläuft, weil die ICR1 nicht double-buffered ist)

    Dann werden TOV und der Compare Match Interrupt von OCR1A nur beide gleichzeitig im Mode 7
    ausgelöst?

    Ich hab mir mal die iotn2313.h angeguckt.
    Hier gibt es einige gleichwertige Benennungen, was man vielleicht wissen sollte.

    16bit Timer:
    OCR1 == OCR1A für den 16bit Zugriff
    OCR1L == OCR1AL für den 8bit Zugriff auf den niederwertigen Teil
    OCR1H == OCR1AH für den 8bit Zugriff auf den höherwertigen Teil

    Für den B-Ausgang gibts hingegen keine Schreibweise ohne das B
    OCR1B für den 16bit Zugriff
    OCR1BL für den 8bit Zugriff auf den niederwertigen Teil
    OCR1BH für den 8bit Zugriff auf den höherwertigen Teil

    Auf TCNT kann ebenfalls über einen 16bit oder zwei 8bit Zugriffe geschrieben werden
    TCNT1 für den 16bit Zugriff
    TCNT1L für den 8bit Zugriff auf den niederwertigen Teil
    TCNT1H für den 8bit Zugriff auf den höherwertigen Teil

    Ebenso gilt für das ICR
    ICR1 für den 16bit Zugriff
    ICR1L für den 8bit Zugriff auf den niederwertigen Teil
    ICR1H für den 8bit Zugriff auf den höherwertigen Teil

    TCCR1A/TCCR1B/TCCR1C 8bit

    8bit Timer:
    Keine Überraschungen. Es gibt nur die 8bit-Register..
    OCR0A 8bit
    OCR0B 8bit
    TCNT0 8bit

    TCCR0A/TCCR0B 8bit


    Inzwischen hab ichs hinbekommen Timer0 zu starten und damit eine LED zum faden zu bringen, und zwar so:
    Code:
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    
    int main (void)
    {
       		/* 	Fast PWM an Timer0. Benutzt werden soll nur OCR0A. Die LED/der Port OC0A soll beim
    			Erreichen von OCR0A aktiviert weden und beim Overflow wieder aus gehen.
    			In der while(1)-Schleife wird immer 12ms gewartet und dann OCR0A um eins erhöht.
    			(Bzw. wenn grade angefadet werden soll, um eins verringert)
    		*/
    		
    		TCCR0A = (1 << COM0A1) | (1 << COM0A0) | (1 << WGM00) | (1 << WGM01);
    		//Set on Compare Match, clear on Overflow      Fast-PWM (Mode 3 Tab.40 S.75)   
    
    		/* ist doch zu langsam
    		TCCR0B = (1 << CS02) | (1 << CS00);
    		//Prescaler auf CPU/1024 -> langsamer gehts nicht (Tab.41 S. 77)
    		*/
    
    		TCCR0B = (1 << CS01);
    		//Prescaler auf CPU/8 -> perfekt^^
    
    		OCR0A = 1; //Startwert, pendelt dann zwischen 0..255 
    
    		DDRB = (1 << PB2); //pin PB2 auf Ausgang (das ist OC0A)
    
    		uint8_t direction=0; //0->OCR0A raufzählen 1-> OCR0A runterzählen
    
    		while(1){			
    			_delay_ms(12);
    
    			if(direction==0){
    				OCR0A += 1;
    				if(OCR0A==254)
    					direction=1;
    			}else
    			if(direction==1){
    				OCR0A -= 1;
    				if(OCR0A==1)
    					direction=0;
    			}
    		}
    }
    Eigentlich gar nicht so schwer wenn man denn ein bisschen Durchblick hat. Als nächstes werd ich versuchen den Verlauf angenehmer zu Timen, dann muss ich Transistoren finden, die schon bei Versorgung mit Pinspannung (wenn der mit 2 AA Batterien betrieben wird) ohne Widerstand alles durchlassen. (Damit ich steuern welche LED das PWM-Signal bekommt) Und anschließend, wie das Ganze mit einem kleinen Motor funktioniert. Denn mein Plan ist es ein kleines Elektroauto zum Fahren und Leuchten zu bringen.

    Wieso liest man überall, dass Phasen-Korrekte PWM am Besten für eine Motorsteuerung sein soll?
    Im Prinzip macht doch eine Fast-PWM das Selbe, nur das diese wohl schneller umschalten kann (da man bei
    der Phasen Korrekten ja nur eine Umschaltung pro Timerdurchlauf hat und bei der Fast PWM zwei).

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. [ERLEDIGT] 3x Hardware PWM und Multiplexen mit dem Timer ATTiny2313
    Von jcrypter im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 21.01.2011, 11:58
  2. Timer mit ISR programmieren ATTiny2313
    Von Speedfreak-mml im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 12.07.2009, 11:43
  3. Analoger Komperator (ATTiny2313), Timer
    Von Lord_Vader im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 15.11.2008, 02:44
  4. TIMER/Counter aktivierung beim ATtiny2313
    Von LotharK im Forum Assembler-Programmierung
    Antworten: 4
    Letzter Beitrag: 24.02.2007, 10:34
  5. Attiny2313, Timer-Counter-Wie gehts?
    Von sebastian.fr im Forum AVR Hardwarethemen
    Antworten: 13
    Letzter Beitrag: 04.04.2006, 23:48

Berechtigungen

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

Solar Speicher und Akkus Tests