Assembler Fragen zu Timer des ATtiny13 (PWM)

Rolf.H

Neues Mitglied
17. Juni 2012
136
0
0
89
25451 Quickborn
Sprachen
nun saß ich zwei Stunden und habe vom Tiny13 mit seinen Registern TCCR0A und 0B geschrieben.
Dazu eine Quelldatei.......und auf "Thema erstellen" gedrückt und nichts ist zu sehen!
Alles weg, so eine Sch. Eingeloggt war ich!
Ich glaube ich gebs hier auf

Rolf
Das ganze war sehr lang..ist das der Grund?
Jetzt drücke ich also wieder Thema erstellen
 
Hallo Rolf,

der Editor bietet sogar die Möglichkeit deinen Text wiederherzustellen, er speichert in gewissen Zeitabständen eine Sicherung ab.
Inzwischen hast du aber sicherlich im Browserfenster in der History herumgeklickt oder das Fenster geschlossen, so dass diese Sicherung nicht mehr vorhanden ist.

... also zwei Stunden online an einem Beitrag schreiben ist schon sehr lang.

Stell doch einfach mal dein Programm hier rein, vielleicht als Anhang und erzähl kurz wo du Probleme hast.

Gruß,
Dirk
 
Hallo Dirk,
ich versuche es später noch einmal in Kurzform.
Ich dachte, ich könnte mit meinen ausführlichen Hinweisen zu den Registern manchen
Anfänger Hinweise geben.
Eins ist mir aufgefallen. Es war ja neues Thema und ich hätte müssen oben in der Kopfzeile unter pxxxx o.ä.
eingeben ob assembler Bascom usw. Und das hab ich übersehen.
Könnte das der Grund sein?

Grüße

Rolf
 
Hallo Rolf!
Eins ist mir aufgefallen. Es war ja neues Thema und ich hätte müssen oben in der Kopfzeile unter pxxxx o.ä.
eingeben ob assembler Bascom usw. Und das hab ich übersehen.
Könnte das der Grund sein?

Nein, dort muss man nicht unbedingt etwas angeben. Ich nehme eher an, es hatte etwas mit der langen Zeit zu tun gehabt, du wurdest dann ausgeloggt und dann hast du irgendwas falsches gedrückt. Denn normalerweise musst du dich einfach nur wieder einloggen und das Thema oder der Beitrag werden gespeichert.

Dirk
 
Du hast ja bereits folgende Stichpunkte gegeben:
-ATtiny13 (das komplette Datenblatt hast Du (trotz Englischkentnissen) bei Atmel sicher selbst schon gefunden - sind ja nur ca 180 Seiten - 'n Tiny eben)
-Control-Register (A/B) von Timer0

kurze Erklärung:
in den Registern legst Du fest, wie sich der Timer verhalten soll. Es gibt folgende Bits (verteilt auf beide Register):

-CS02..CS00 - CS=Clock Select. Legt den Takt des Timers fest. Bei 0 steht er, 1 bis 5 leitet den Timertakt durch fixe Vorteiler aus dem "CPU-Takt" ab, 6 und 7 benutzt den T0-Pin als Takteingang.

-WGM02..WGM00 - WGM=Waveform Generation Mode. Legt fest, wie, und bis wo (also wo er überläuft) der Timer laufen soll. Der Tiny13 kann 6 Modi.
--0=normal - er Zählt von 0 bis 255 hoch, und läuft dann über (also wieder von 0 los)
--1=phasenkorrektes PWM - er zählt von 0 bis 255, dann runter bis 0, und wieder hoch usw - dabei werden die Output Compare Pins entsprechend den dortigen Einstellungen manipuliert ->später
--2=CTC - Clear Timer on Compare Match. Ähnlich wie Mode 0, nur daß er eben nicht bei 255 überläuft, sondern bei dem Wert, der in OCR0A steht.
--3=Fast PWM. Der Timer läuft wie in Mode0, die OutputComparePins werden entsprechend ihren Einstellungen manipuliert.
--5= phasenkorrektes PWM. Wie Mode1, nur daß der Timer bereits bei OCR0A überläuft. Dementsprechend steht nur ein Kanal (OCR0B) für PWM zur Verfügung.
--7= Fast PWM. Wie Mode 3, aber auch hier nur bis OCR0A. Einschränkungen wie bei 5.
 
Hi Rolf,

<OffTopic On>

wenn es mit dem Forum nicht so klappt sind meißt irgendwelche Blocking-Programme im Weg. Ich hab bei mir in der Whitelist für PopUps und Cookies diese Webseite eingetragen und es läuft problemlos (aktueller Firefox). BetterPrivacy und Ghostery hab ich auch installiert.

Probier es notfalls doch einfach mal mit nem Firefox-Portable ohne zusätzliche Plugins und mit deaktiviertem PopUp-Blocker. Dann siehst du ja ob es an der Bedienung oder den installierten Zusatzprogrämmchen liegt.

Weil ich auch ab und zu mal Bedienfehler mache hab ich mir bei größeren Beiträgen angewöhnt ab und zu mal zu speichern und dann mit "Beitrag ändern" weiterzumachen. Dann wieder zwischendurch speichern und wieder weiter. Dann ist der Frust nicht ganz so groß wenn man mal auf ne falsche Taste kommt oder das Touchpad vom Schleppi mal wieder rumzickt und nen ganzer Block selektiert und durch ein einziges Zeichen ersetzt wird :rolleyes:

<OffTopic Off>

Irgendwie paßt der Titel nicht so wirklich in den Softwarebereich :p

Gruß
Dino
 
Hallo LotatC,
Deine Nachricht werde ich mir gleich ausdrucken und im Einzelnen durcharbeiten.
Denn mit den TCCR0A und WGMxx habe ich noch meine Probleme.
Bin kein Typ vom schnellen Aufgeben, aber das Thema ist schon sehr komplex.
Sollte ich hier weiter machen, oder eien neuen Thread eröffnen?

Also mein Dankeschön für Deine Infos

Grüße

Rolf
 
Register TCCR0A und TCCR0B beim Tiny13

So, ich versuche es nochmals.

Überprüft doch bitte, ob mein gelerntes über die Register stimmt.
Vor mir habe ich das geschriebene von LotadaC.

1. TCCR0B...mit CS00, 01, 02 gebe ich den Vorteiler vor 1 bis 1024
mit WGM02 mh, da bin ich mir schon unsicher
mit Bit6 /7 den T0-Pin als Takteingang (was ist T0)?

2. TCCR0A

mit COM0Ax bekomme ich den Takt an PB0 (OC0A)
mit COM0Bx bekomme ich den Takt an PB1 (OC0B)
hierüber habe ich eine Wahrheitstabelle gefunden, die für 0A und 0B zutrifft.

WGM00 = 0 Timer zählt von 0....255 und wieder von 0
WGM00 = 1 Timer zählt von 0...255, dann runter bis 0 usw.

WGM01 = 0
WGM01 = 1 hat das was mit den 6 Modis zu tun?

Ich mach erst mal Schluß, damit die Sache nicht zu lang wird.
Anhang: eine Quelldatei
von wo kann ich denn das gespeicherte in der Not aufrufen?

Grüße

Rolf
 

Anhänge

  • PWM-Servo02.asm
    5,7 KB · Aufrufe: 17
Hallo Rolf,

ich muss gestehen, ich weiß im Moment nicht wo der Button "Wiederherstellen" hin ist, es hat eventuell etwas mit einer Umstellung zu tun, die wir letztens vorgenommen haben. Da schaue ich bei Gelegenheit nochmal nach. (Ich habe den Button noch nie benötigt, deshalb ist es mir nicht aufgefallen).

Wegen deinem "Thema", bzw. dem Titel: Ich nenne den mal um in "Timer0 PWM" ö.ä?! Ich schaue später mal in dein Programm rein.

Dirk
 
Hi Dirk,

ich muss gestehen, ich weiß im Moment nicht wo der Button "Wiederherstellen" hin ist,
meinst du die beiden blauen Pfeile im erweiterten Editor ?

<-, Rückgängig ... Wiederherstellen ,->

sind bei mir beide da (je nachdem was man gemacht hat).

Wenn man was tippt erscheint der linke Pfeil "Rückgängig". Wenn man dann was rückgängig gemacht hat erscheint der rechte Pfeil "Wiederherstellen".

Gruß
Dino
 
Hallo Dino,

nein das meinte ich nicht. Dort wo man den Editor in der Größe verändern kann (rechts unten) erscheint periodisch "gespeichert". Der Inhalt wird in konstanten Zeitabständen komplett gespeichert, links davon müsste dann ein Button mit "Wiederherstellen" o.ä. sein, der ist nicht da. Das hat nichts mit den Pfeilen oben zu tun. ... aber ich bin mir da auch nicht ganz sicher. Ich schaue da später nochmal nach.

Ich würde sagen, wir verschieben/teilen das Thema später mal, es passt hier irgendwie nicht mehr so :)

Gruß,
Dirk
 
Nein nein, das mit den Bits in den Registern hast Du falsch verstanden. CS02..CS00 mußt Du als eine binär codierte Zahl verstehen. (WGM, COM0A/Bx usw ebenso) Dabei ist hier die 2 das MSB, 0 das LSB. CS0n steht für: Clock Source (CS) von Timer0 (0), und davon das n-te Bit (von hinten). Als 3-Bit-Zahl können also 8 (2^3) mögliche Clock-Sources vorgegeben werden. Bei 0 (also 000) steht er, bei 1 (001bin) bis 5 (101bin) läuft er mit unterschiedlichen Vorteilern mit dem Prozessortakt, bei 6 (110) und 7 (111) dient der T0-Pin am Controller als Takteingang halt mit fallender bzw steigender Flanke. Siehe Tabelle im Datenblatt auf Seite 73). Du kannst an T0 dann entweder einen ordentlichen Takt anlegen, oder auch irgendwas zählen lassen - deswegen auch Counter.
Knoten jetzt geplatzt?
Bei den Modes, mit dem der Timer dann laufen soll (WGM) ist's halt ähnlich. Auch da der Verweis auf die Tabelle.
OK, was hatte ich noch nicht?

-FOC0A/B - Force Output Compare A/B. Das sind jetzt einzelne Bits (1-Bit-Zahl). Macht nur mit einem PWM-Mode (siehe WGM) Sinn. Wird das Bit 1 gesetzt, erfolgt sofort ein Output Compare Match - der entsprechende Pin am µC wird dann entsprechend der ein Einstellungen vom COM0A/B manipuliert. Es erfolgt aber weder ein IRQ, noch ein Überlauf (CTC-Mode etc).

-COM0A/B1..COM0A/B0 - Compare Output A/B Mode. Legt fest, wie sich die OC-Pins bei dem jeweiligen Output Compare Match verhalten sollen. Dabei gibt es unterschiedliches Verhalten in nicht PWM-Modi und PWM-Modi. Deswegen auch da verschiedene Tabellen im Datenblatt. mit 2 Bits (Pro Kanal) können also 2^2=4 Modi gewählt werden. Bei Mode0 sind die Pins nicht mit dem Timer verbunden, und somit als normale I/Os verwendbar. Bei PWM und nonPWM. Bei nonPWM kann der entsprechende Pin jetzt aber beim CompareMatch entweder getoggelt, gesetzt oder gelöscht werden (zusammen die 4 Modi) - bei den PWM-Modis ist das etwas mehr, entsprechend der unterschiedlichen PWM-Modi. Siehe dazu die Tabellen im DB ab Seite 69).

Jetzt zu Deinem Programm - mach sich mit Android nicht ganz so einfach (bzw hab keine entsprechende SW), hab noch nicht reingesehen - ich versuchs mal so:
Code:
 ; Projekt: Projekttiny 13                        Datum: 20.06.2012

; Datei: PWM-Motor02.asm


.include "tn13def.inc"

.equ takt = 1200000

; Takt an PORTB,PB0 (Pin OC0A)
.equ vConfTCCR0A = 1<<COM0A0 |1<<WGM00 

.equ vConfTCCR0B = 1<<WGM02 | 1<<CS00     ; Prescale = 1

.equ vMAX = 200     
.equ vTi = 100 


; Flash RAM auf Adresse 0 einstellen
.org 0

ldi r16,RAMEND       ;Stack Pointer initialisieren
out SPL,r16

sbi DDRB,PB1         ;PB1 = OC0B als Output
sbi DDRB,PB0         ;PB0 = OC0A als Output

ldi r16, vMAX        ;Wert f�r MAX laden  =200
out OCR0A,r16        ;und in Output Compare Register A laden

ldi r16,vTi          ;Wert f�r Ti laden   =100
out OCR0B,r16        ;und in Output Compare Register B laden

ldi r16,vConfTCCR0A  ; Einstellungen f�r den PWM-Modus laden
out TCCR0A,r16       ;und ins Timer/Counter Control Register 0A �bertragen

ldi r16,vConfTCCR0B  ;Einstellungen f�r den PWM-Modus laden
out TCCR0B,r16       ;und ins Timer/Counter Control Register 0B �bertragen

Warte:
rjmp Warte ; Endlosschleife
 
.EXIT

Edit: T0 ist PB2 des Controllers. Eine alternative Funktion dieses Beinchens ist, daß es als externer Takteingang für Timer0 dienen kann. Wird über die CS-Bits (siehe oben) aktiviert. Dann ist PB2 nicht mehr als I/O verwendbar (wie halt auch B1/B2 entsprechend der vorgabn durch COM0A/B).

Edit2: Laut DB brauchst Du den Stackpointer nicht initialisieren. Der hat ein initial value (Vorgabe/default) von 159dec=9Fhex=10011111bin=RAMEND...
 
Hallo LotadaC,
es ist jetzt Sonntag-Morgen 7 Uhr und werde Dein geschriebenes gleich ausdrucken...
denn da steckt sehr viel Erfahrenes drin.
Ich schmeiß dann den Tiny an, Skop daneben und werde mir bei Prescale=1 die Pins PB0/PB1 anschauen.
Danke für Deine Arbeit

Grüße

Rolf
 
Hat eigentlich das Schieben (<<) Vorrang vor dem "Oder" (|)? Sollte ja eigentlich so sein. Ich klammere das trotzdem immer ein - find ich optisch besser.

Das Kommentar "Flash RAM" finde ich etwas unpassend - der Flash ist ja eher (!) sowas wie der ROM des Controllers -> entweder Program Flash, oder nur Flash - RAM weglassen (nur als Tip - kannst natürlich selbst schreiben, was Du willst...)

Du definierst die Compiler-Variable "takt", die aber nie verwendet wird, und weist ihr den Wert 1.200.000 zu. Wie sieht die Betaktung des Tiny13 wirklich aus. Werkseinstellung ist der interne 9,6MHz RC-Oscillator mit aktiver CKDIV8 Fuse. Die Fuse wiederum lädt als Voreinstellung den Vorteiler 8 in das Clock Prescale Register (CLKPR - CLKPS3..CLKPS0=0011). Effektiv läuft der Controller also mit 1,2MHz. Stimmt also soweit. Wenn die Fuse deaktiviert wird, gilt als Voreinstellung für CLKPS=0000 also Vorteiler 1 -> 9,6MHz. Mehr ist mit dem internen RC nicht drin.

-Stackpointer reinitialisiert
-B1 und B0 ->Ausgänge (erstmal low Pegel)
-OCR0A <- 200
-OCR0B <- 100
-COM0A <- 01bin
-WGM0 <- 101bin = Mode5 = phasenkorrektes PWM bis OCR0A und zurück
-CS0 <- 001bin = Prescaler=1
-Endlosschleife

Mit der Zuweisung zu TCCRB läuft der Timer los.

Was passiert?

Der Timer läuft mit einer Schrittfrequenz von 1,2MHz hoch bis 200 (WGM0=5 -> OCR0A), und kehrt dann um. Er erreicht dann alle 400 Takte OCR0A. Also mit einer Frequenz von 3kHz jedesmal, wenn er OCR0A erreicht, wird OC0A (PB0) getoggelt (also sollte dort ein Rechtecksignal mit 1,5kHz zu sehen sein).
OCR0B hast Du zwar beschrieben, allerdings ist COM0B immer noch default=00bin. Somit ist B1 normaler I/O-Pin, und nicht an den Timer gebunden. Folglich bleibt er auch auf low Pegel.

Wenn ich mich nicht vertan habe, sollte es das gewesen sein - ist das jetzt auch das, was Du wolltest?
 
oh weia...mir raucht ganz schön der Kopf!
Die Datenblätter 69 - 73 liegen vor mir.
Was mir auf S. 70 auffällt:

in der Tabelle 11-3. wird auf WGM02 hingewiesen, aber das erscheint doch garnicht im Register TCCR0A
sondern TCCR0B.
Habe gestern In einer Turnhalle einen Quadrocopter mit Hilfe von Studio4 und Programmer AVR ISPmkII
zum Abheben gebracht, deshalb komme ich heute erst zum antworten.
Das Register TCCR0B habe ich soweit geschnallt, am 0A kämpfe ich noch...aber es kommt langsam
Licht am Horizont

Grüße aus dem Norden

Rolf
 
Vergiß erstmal die unterschiedlichen Buchstaben hinter TCCR0 - das sind ja alles Timer-Counter-0-Kontrollregister. Das paßt halt nicht in eins. Aber warum ist WGM jetzt auf 2 verschiedenene Register verteilt, obwohl sie auch in eins gepaßt hätten? Weil die Belegung historisch gewachsen ist, und in anderen Controllern hier freie Bits anderweitig belegt sind (und man zumindest etwas(!) uniform bleiben wollte).

Warum jetzt bei TCCR0A der Hinweis auf WGM02 aus TCCR0B? Weil in TCCR0A das Verhalten der Output-Compare-Pins festgelegt wird (mit COM0A/B1..0), es aber Modes (WGM) gibt, in denen OCR0A den Überlauf-/Umkehrpunkt des Timers bildet (also OCR0A=TOP). Dann (und nur dann) kann der OC0A-Pin trotz PWM-Mode bei OCR0A getoggelt werden (also bei jedem Überlauf). Das sind Mode 5 und 7, also ist WGM02=1 (101bin, 111bin), klar? (alle Modi kleiner 4 (100bin) sind entweder nonPWM (dann gilt ja die Tabelle gar nicht), und/oder der Timer läuft bis 255.)
Zu den Datenblättern: Da gibt es manchmal Copy/paste Fehler. ZB wird manchmal der Buchstabe (A/B) weggelassen (bei COM0Ax zb) - aber eben nicht konsequent, sondern nur manchmal.
Bei Tabelle 11-7 stimmt der Tabellenkopf nicht - es geht natürlich um COM0B1 und COM0B0...
Weitere Fragen bitte...;)
 
Hallo,

noch was als Hinweis zu den Datenblättern. In den Beispielprogrammen sind die Registernamen der alten Serie (Mega8, Mega32, ...) drin. Beim Datenblatt des Mega48,88,168,... (also den neuen oder größeren CPUs) passen die Register/Bit-Namen (und wie man die Register anspricht) aus den Beispielen nicht zu den wirklichen Namen die man in der Register-Summary (hinten im Datenblatt) findet.

Im Beispiel sind die Register IO-mapped und in Wirklichkeit sind sie Memory-mapped. Geht dann also nicht mit In/Out-Befehlen und direktem Bit-Zugriff sondern nur mit Store/Load-Befehlen und zwischenpuffern.

Gruß
Dino
 
Hallo LotadaC,
ich sitze schon heute Morgen in aller Frühe und versuche durch wiederholtes lesen Dein geschriebenes
zu verstehen...alle Unterlagen und ausgedrucktes daneben.

Wo ich noch schwanke z.B.
Das sind Mode 5 und 7, also ist WGM02=1 (101bin, 111bin), klar?
Gibt es im Datenblatt eine Seite, wo die Mode auftauchen.

Oder ist das Mode "non-PWM" dann kommt "Fast PWM" und "Phase Correct PWM" auf Seite 70

Dann schreibst Du WGM02=1 (101bin, 111bin)......worauf bezieht sich xxxbin?
Sorry, ich bin einfach noch Anfänger.
Ich habe mit den Tiny13 und 2313 schon viel für Modellflug usw. realisiert..Ortungspieper, Steuerung
für einen Märklinkran und Containerkran von BRAWA.
Das PortB auf High oder Low zu tatteln und ne kleine ISR dazu ist gegenüber PWM ein Kinderspiel.

Grüße

Rolf
 
Bei mir ists Seite 72 im Datenblatt:
Screenshot_2012-06-26-09-35-54.jpg
WGM ist wie gesagt eine 3bit-Zahl - nur daß das MSB in einem anderen Register gespeichert ist, als der Rest. Das muß man beim Zuweisen beachten.
Wie man in der Tabelle sieht, sind alle Modi < 4 entweder nonPWM, oder laufen bis 255 (FFhex). Alle (erlaubten) Modi => 4 sind PWM, die bis OCR0A laufen. Bei diesen beiden Modi kann der OC0A-Pin bei jedem erreichen von OCR0A getoggelt werden. Das ist dann aber kein PWM, sondern der CTC-Mode (für Kanal A). Warum taucht der jetzt trotzdem hier (bei PWM) auf? Weil Du ja immer noch Kanal B hast. Wenn Du für die PWM-Frequenz den Zähler einschränken mußt, und dafür nur OCR0A in Frage kommt (bei umfangreicheren Kontrollern gibts zB auch das Input Capture Register -ICR), eignet sich Kanal A ja nicht mehr wirklich für PWM - im phasenkorrekten Modus ist er als Umkehrpunkt quasi gleichzeitig beim "hoch- und runterzählen", beim fast Modus erfolgt nahezu gleichzeitig der Compare-Match und er Überlauf. Wenn ich mich nicht irre, werden in der Realität aber die Matches ignoriert (?).

Wenn Du das mit der internen Hardware erstmal gerafft hast, ist das eigentlich wesentlich einfacher. Wenn Du (hier zB) den PWM erstmal scharfgemacht hast, läuft der im Hintergrund weiter - Du mußt Dich nicht mehr um irgendwelche Synchronisation mit dem Hauptprogramm kümmern. Um das PWM-Verhältnis zu ändern kannst Du dann jederzeit OCR0B verändern, für die Frequenz OCR0A...
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)