Assembler Fragen zu Timer des ATtiny13 (PWM)

Hallo LotadaC,
nun wird es Zeit, daß ich mich wieder mal melde.
D.h. PWM habe ich nicht an den Nagel gehangen, sondern habe viel gelesen und gegoogelt.
Mit Word habe ich mir eine Tabelle erstellt um schriftlich festzuhalten was sich bei
Veränderung der WGM tut.
Ein Skop wie Frequenz-Periodenmesser standen mir dabei zur Verfügung.
Dann habe ich mir gesagt, beschäftige dich erst mal mit der Fast-PWM sonst blickt man
zuletzt nicht mehr durch.
Hier die Quelldatei, mit der ich rumexperimentiert habe.
Code:
; Projekt: Projekttiny 13                        Datum: 05.07.2012

; Datei: FastPWM-OC0A-0B.asm

; Test Mode 4 = Fast PWM
.include "tn13def.inc"


; Takt an PORTB,PB0 (Pin OC0A) und PB1 (Pin OC0B)
.equ vConfTCCR0A = (1<<COM0A1) |(1<<COM0B1) |(1<<WGM01) |(1<<WGM00)   

.equ vConfTCCR0B = (1<<CS00) ; no Prescale


; maximaler OC Wert = 254 (feine Pausennadeln auf Skop sichtbar)
; vMAX = 127...Taktverhältnis 1:1, Periode = 0,21 ms
; Periode von 0,21 ms bleibt bei Veränd. von vMAX o. vTi konstant.

.equ vMAX = 127 ; Wert für OC0A / PB0     
.equ vTi = 200  ; Wert für OC0B / PB1

; Flash RAM auf Adresse 0 einstellen
.org 0

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

ldi r16,vTi          ;Wert für OC0B laden  =200
out OCR0B,r16        ;und in Output Compare Register B laden

ldi r16,vMAX         ;Wert für OC0A laden  = 127
out OCR0A,r16        ;und in Output Compare Register A laden

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

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

Warte:
rjmp Warte ; Endlosschleife
 
.EXIT

Das habe ich jetzt begriffen
Um später mal ein Servo anzusteuern, müßte man eine Periode von 20 ms mit einen Impuls
von 1,5 ms haben, der dann von ca. 1,2 bis 1,8 ms variiert. Aber so weit bin ich noch nicht,
das kommt noch!

Frage: jetzt kommt noch PWM (Phase Correct) und CTC.
Bei welchen läuft denn der 8 Bit Timer hoch bis 255 und wieder runter zu Null.

Grüße

Rolf
 
Frage: jetzt kommt noch PWM (Phase Correct) und CTC.
Bei welchen läuft denn der 8 Bit Timer hoch bis 255 und wieder runter zu Null.

Hallo Rolf!

Das ist bei Phase Correct PWM der Fall. Mode 1 (0 .. 255) und Mode 5 (0 .. OCR0A).

Gruß,
Dirk
 
was meint Ihr, sollte ich vielleicht über Atmel-PWM einen neuen Trhaed eröffnen.
Das Thema ist ja so prisant, daß neue Einsteiger nur von lernen können.

Macht ein Vorschlag unter welchem "Thema"


Grüße

Rolf
 
Hallo Rolf,

ich habe den Titel dieses Themas umbenannt, vielleicht passt es nun besser. Du kannst natürlich auch einen neuen Thread eröffnen, wenn du möchtest.
 
Hallo Dirk,
danke...ist angekommen!
Und nun nochmal zur Sache, der geisterhaften Pulsweitenmodulation. (Als Test den Tiny13 mit seinen Timer0)

Ich versuche erst mal wiederzugeben, was bei der Fast-PWM bei mir hängen geblieben ist.

Als ersten Versuch habe ich mich nur an die Compareeinheit A heran getastet.

1. In DDRB PB0 (OC0A) aktiviert.
2. Im Register TCCR0A Bit7 (COM0A1) und WGM01 / 00 aktiviert
3. Im Register TCCR0B Bit0 (CS00) aktiviert, also kein Prescale damit ich den Takt an PB0 mit den Skop
besser sehen konnte.
4. Im Compare-Register OCR0A den Wert von 200 eingegeben.

Die Periode lag bei 0,21 ms, wobei die Pulsbreite = 0,18 ms / Pausenzeit = 0,03 ms ergab.
Und nun konnte ich verfolgen, wie der Impuls sich bei verändern des Comparewertes verschob.
Bei 254 zeigten sich noch haarfeine Pausennadeln.
Unverständlich bleibt mir noch wenn:

ich Bit6 (COM0A0) aktiviere...bleibt PB0 auf LOW!
Eigentlich deckt sich das nicht mit der Wahrheitstabelle von Bit7 u. Bit6
Aber ich habs einfach erst mal so hingenommen.
Zum Schluß habe ich dann auch COM0B1 aktiviert und konnte nach Eingabe des Wertes ins
Compare-Register OCR0B das Gleiche Spiel an PB1 (OC0B) sehen.
Fazit...die beiden Compareeinheiten arbeiten völlig unabhänig voneinander.

So, ich mach erst mal Schluß

Grüße

Rolf
 
Hallo Leute,
nun habe ich mir die Phase-Correct PWM rangezogen.
Hier die Quelldatei

Code:
; Projekt: Projekttiny 13               Datum: 18.07.2012

; Datei: Phase-Correct-PWM-0B.asm

; Konfiguration Phase Correct PWM, 
; gewählt Mode = 1, TOP=0xFF

.include "tn13def.inc"

.equ vConfTCCR0A = (1<<COM0B1)|(1<<WGM00)
.equ vConfTCCR0B = (1<<CS00)   ;no Prescale 

.equ vTi = 200    ; Wert für Comp. Register OCR0B
                  ; Ausgabe an OC0B = PB1

; Flash RAM auf Adresse 0 einstellen
.org 0

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

sbi DDRB,PB1         ;PB1 als Ausgabeport definieren

ldi r16,vTi          ;Wert für vTi =200
out OCR0B,r16        ;und in 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

mit dem Skop konnte ich Impulsdauer von ca. 0,36ms bzw. Pausenzeit von 0,08ms ermitteln,
also eine Periodenzeit von ca. 0,44ms.

wie zu sehen ist der Vorgabewert im Compare-Register OCR0B = 200
Nun habe ich mir errechnet:
T = 1/f (Tiny13 = 1,2MHz >>0,833ys x 256 = 213,2ys x 2 = 426ys o. 0,43 ms)

Dies entspreche ja der Periodendauer. Ich muß nur noch kapieren, warum ich das x 2 nehmen muß.
Liege ich denn beim Phase-Correct PWM Mod in meinen Überlegungen richtig, wenn:

der Timer0 läuft bei 0 los...PB1 (OC0B) liegt noch auf LOW,
bei Erreichen des Comparewertes von 200 (Vergleichswert) wird PB1 auf High geschaltet,
der Timer läuft weiter hoch bis 256 und wird zurück gesetzt zu 0, (ist das TOP =0xFF)
der Timer läuft wieder hoch und das Spiel beginnt von neuem, d.h. PB1 auf LOW.

Oder wird der Timer bei 200 schon zurück gesetzt???
Aber bei einer anderen PWM ist das doch so!

Grüße

Rolf
 
...Phase-Correct PWM...
der Timer0 läuft bei 0 los...PB1 (OC0B) liegt noch auf LOW,
bei Erreichen des Comparewertes von 200 (Vergleichswert) wird PB1 auf High geschaltet,
der Timer läuft weiter hoch bis 256 und wird zurück gesetzt zu 0[/BOder wird der Timer bei 200 schon zurück gesetzt???
Aber bei einer anderen PWM ist das doch so!...


Nein, eben nicht - beim Fast PWM ist das so. Beim phasenkorrekten PWM hast Du statt single slope dual slope - der Timer läuft von 0 bis top, und dann wider zurück bis 0 (und wieder bis top usw), die OC-Pins werden entsprechend dem COMxn-Settings manipuliert. Zitat aus dem Datenblatt (des Mega88):
Phase correct PWM mode
The phase correct Pulse Width Modulation or phase correct PWM mode (WGM13:0 = 1, 2, 3,
10, or 11) provides a high resolution phase correct PWM waveform generation option. The
phase correct PWM mode is, like the phase and frequency correct PWM mode, based on a dualslope
operation. The counter counts repeatedly from BOTTOM (0x0000) to TOP and then from
TOP to BOTTOM
. In non-inverting Compare Output mode, the Output Compare (OC1x) is
cleared on the compare match between TCNT1 and OCR1x while upcounting, and set on the
compare match while downcounting. In inverting Output Compare mode, the operation is
inverted. The dual-slope operation has lower maximum operation frequency than single slope
operation. However, due to the symmetric feature of the dual-slope PWM modes, these modes
are preferred for motor control applications.
Deswegen kommst Du auf das "durch 2 teilen". - Schau mal ins Datenblatt des von Dir verwendeten Controllers beim verwendeten Timer unter "modes of operation", da ist dann i.a. auch ein Bild, wo man sieht, wie TCNT (also der Zähler) sich verhält...
 
Hallo LotadaC,
erst mal meinen Dank, Deine Hinweise haben mir viel Klarheit gebracht.
Erstens habe ich mir nochmal die "Phase Correct PWM" vorgenommen (Mode1)
Auf Seite 66 im Datenblatt die Grafik ausgedruckt u. verstehe jetzt, warum ich x2
multipl. muß.

Zweitens die "CTC" Mode (Mode2)
Auf Seite 64 die Grafik ausgedruckt.
Interessant war hierbei, daß kein Takt in Compare OCR0B kam, sondern an OC0B
nur HIGH oder LOW.
(1<<COM0A0)|(1<<WGM01) stellte sich bei OCR0A=200 eine Periode von ca. 0,36ms ein.
Das deckt sich auch mit meiner Rechnung (Taktverhältnis blieb immer 1:1)

Drittens die "Fast PWM" (Mode3)
Auf Seite 65 die Grafik ausgedruckt
Es fällt einen schon schwer, wenn man das ausführliche Datenblatt vor sich hat
und kann es nicht lesen.
Habe aber einen Trick:
Ich schwärze das zu lesende an >>Kopieren>>und schiebe es rüber in den Google-Übersetzer.
Sieht zwar etwas holperig aus, aber besser als garnichts.
Nun will ich mich den Tiny2313 mit dem Timer1 zuwenden, das wird ja noch umfangreicher sein.
Oder sollte ich gleich den Mega8 nehmen..hab hier noch 2 St. rumliegen.
Also meinen Dank nochmals

Grüße

Rolf
 
mh...warum brechen manche Sätze einfach um, mach ich was falsch beim schreiben???

Sätze brechen dann um, wenn du im Editor "return" drückst (was hier wahrscheinlich der Fall ist) oder wenn du die Breite des Browserfensters so änderst, dass eine Text-Zeile nicht in der kompletten Breite darstellbar ist.

Dirk :ciao:
 
zu 2.: der CTC ist kein PWM-Mode. Für COM0B gilt Tabelle 11-5 auf Seite 71.
COM0B=0 (00bin) -> OC0B-Pin ist normaler I/O-Pin, der Timer nimmt keinen Einfluß darauf,
COM0B=1 (01bin) -> OC0B toggelt bei jedem Compare-Match (also einmal pro Durchlauf des Timers, wenn OCR0B kleiner als top),
COM0B=2 (10bin) -> OC0B wird bei jedem Compare-Match gelöscht (0), jedoch durch den Timer nie gesetzt (eben kein PWM)
COM0B=3 (11bin) -> OC0B wird bei jedem Compare-Match gesetzt (1), jedoch durch den Timer nie gelöscht (dito).
Was steht bei Dir in COM0B1..COM0B0?

Die Output-Compare-Logik kontrolliert (wenn so eingestellt, siehe oben) nur das PORT-Register (bzw das entsprechende Bit im PORT-Register) des jeweiligen Beinchens - das DDR-Register (Bit) wird nicht angetastet. ist dieses Bit=1, wechselt das Bein zwischen high und low Pegel, bei DDR-Bit=0 wird zwischen tristate (N.C.) und High mit Pullup gewechselt (so der Pullup global freigegeben ist -> PUD).

Wenn in das PIN-Register-Bit eines Beinchens eine 1 geschrieben wird, wird das zugehörige PORT-Register-Bit (und damit das Beinchen) getoggelt. Diese 1 erscheint dann aber nicht wirklich im PIN Register, dort erscheint ja immer der aktuelle digitale Ist-Zustand an den Beinchen. (nur so am Rande).

zu 3.: Also ohne Englischkenntnisse Elektronikdatenblätter lesen und verstehen können und Programmieren - Ich hätte das bisher für unmöglich gehalten. Beweis uns das Gegenteil;)
(Bin ja selbst auch alles andere als ein Englisch-Profi)
Zu den Kontrollern: Mein Liebling ist der ATmega88, daß ist quasi die Neuauflage des Mega8. Mit einigen Erweiterungen in der Hardware, aber auch einigen Abstrichen bei schnellen Zugriffen auf bestimmte Register (die jetzt nicht mehr mit IN/OUT erwischt werden können - gelt Dino?!).
Generell ist aber die Vorgehensweise ähnlich - nur eben mit mehr oder weniger Möglichkeiten.
 
mh...würdest Du mir vom Tiny2313 abraten?
Zur Info...bin jetzt 77 Jahre alt und schnalle das noch.
Englisch will ich nicht mehr lernen.
Werde Dir zeigen, was ich noch aufgebaut habe in Assembler!

Grüße

Rolf
 
Hey, wollte Dich nicht angreifen, oder so...

Zu den Controllern: der ATtiny2313 ist auch nicht schlecht - ist halt (wie auch der ATtiny13) ein Tiny (Winzling). Gegenüber einem Mega können sie eventuell weniger Instruktionen (Multiplizieren zB) oder sind ggf mit weniger, oder weniger leistungsfähiger Hardware ausgestattet (UART/SPI/TWI). Andererseits gibt es Tinys meist als einfach verlötbare SMD-SOICs (mit 1,27mm Rastermaß), wo man bei'nem Mega dann mindestens zu TQFPs (mit 0,8mm) greifen muß.
Es kommt halt darauf an, was Du mit dem Controller machen willst - ok derzeit scheinst Du ja (erstmal) nur die Möglichkeiten der Hardware zu ergründen, da ist die Controllerwahl dann auch nicht so wichtig.

Gegenüber dem Tiny13 hat der Tiny2313 zB einen 16bit-Timer mit deutlich mehr Möglichkeiten und eine UART-Schnittstelle - sollte doch fürs erste reichen;).
(nebenbei gesagt könnte der 2313 auch ein Kandidat für den Digitalmessschieber-Thread sein - je einen MS an die beiden externen Ints, und einen an irgendeinen PCInt - drei unabhängige ISRs, und alles schön in ASM. Kommunikation mit dem Display/Benutzerschnittstellen-Mikrocontroller über den UART).
 
Hi Rolf,

mh...würdest Du mir vom Tiny2313 abraten?
Zur Info...bin jetzt 77 Jahre alt und schnalle das noch.
also zu deinen 77 Jahren mit fittem Hirn würde ich sagen : herzlichen Glückwunsch!
Hör nicht auf es mit Aufgaben zu trainieren :D Dann bist du mit 99 auch noch fit :cool:

Also vom Tiny2313 abraten ... würde ich nicht unbedingt. Er ist wie schon gesagt recht klein.
2kByte Flash ist nicht das meißte. Mit Assembler hast du aber genug Platz. Mit Bascom wird es schon etwas schwieriger alles unterzubringen. Das schöne ist seine vollständige serielle Schnittstelle (UART). Er hat gegenüber allen anderen Tinys einen vollständigen UART. Die anderen haben nur eine USI. Die kann alles ein wenig aber nichts wirklich vollständig selbstständig aus der Hardware. Außerdem ist er mit seinem 20pol Gehäuse auch in SMD noch recht gut zu bearbeiten und hat genügend IO-Ports für allen möglichen Kram. Man bekommt neben der Applikation noch nen LCD mit dran ohne das es eng wird.

Bei Atmel gibt es auch einen Tiny4313. Also einen Tiny2313 mit doppelt so viel Speicher. Leider hab ich ihn noch nie in nem Laden gesehen. Das wäre eine echt interessante Alternative zu dem Kleinen.

Gruß
Dino
 
der 2313 hat ja nicht einen UART statt des Tiny üblichen USI, er hat beides. Man kann also einerseits komplett in Hardware per UART kommunizieren, und gleichzeitig weitgehend (aber eben nicht komplett) in Hardware irgendwie (eben mit etwas Software) seriell (TWI/SPI) über das USI.
Je einen 8bit und 16bit Timer, je mit 2 PWM, 1x InputCapture.
1x Analog Comperator.
Er hat keinen ADC, keine echte SPI-Schnittstelle (nur für ISP).

Link für Dino (aber da kann ich auch nur bestellen lassen, wenn ich grad'n fremdes Projekt vor mir habe...)
 
Hi,

Link für Dino (aber da kann ich auch nur bestellen lassen, wenn ich grad'n fremdes Projekt vor mir habe...)
besten Dank ;) ... muß ich mal sehen ob man da irgendwie als Normalo rankommt. So ein 10er-Pack als DIL und SO wär schon interessant :cool: Dann muß man beim Programm nicht immer so rumknautschen :rolleyes:

Beim HBE-Shop.de könnte man auch als Normalo bei Farnell einkaufen. Hab ich aber noch keine Lust gehabt das Programm durchzuflöhen.

Gruß
Dino
 
danke für Eure Antworten...man ist ja als Rentner so im Stress.
Wieviel KB darf ein Photo .JPG haben?
Antworte "Morgen"

Grüße

Rolf
 
Hi Rolf,

Wieviel KB darf ein Photo .JPG haben?
Geh mal im Editor auf die Büroklammer für Anhänge. Dann geht ja das PopUp-Fenster auf.
Wenn du dann oben rechts auf das Fragezeichen im hellblauen Kreis klickst dann siehst du die eingestellten Maximalgrößen für die verschiedenen Anhänge.

Gruß
Dino
 
Hallo Dino,
nun wollte ich Euch mal zeigen, was man in dem Alter noch erstellen kann.
Ehrlicher Weise möchte ich zugeben, daß viele Hilfestellung von mikrocontroller.net
dazu beigetragen haben.
So waren die Helfer Karl Heinz Buchenegger, Spess, Hannes Lux und auch manche Kritiker am Werk.
Die Leute sind einfach hilfsbereit, wenn sie merken, daß man mitarbeitet und nicht nur abkupfert.
Bevor ich weiter schreibe erst mal sehen, ob die Anlagen kommen.

mh..hab eine jpg und asm geladen! ok sie sind zu sehen.
Der Containerkran ist voll elektrisch ausgerüstet.
D.h. er hat eigenständig im Auf- und rechts/Linksbetrieb Endlagenschalter.
Dagegen im Abwärtsbetrieb (um den Container vom Waggon zu packen) mußte ich
einen Readkontakt installieren.
Die gesamte Anlage (H0) wird über einen PC "ATARI-Mega1" im uralten GFA-Basic gesteuert.
Im Containerbetrieb wird die Lok mit den Sattelwaggon bis zu einem Readkontakt gefahren,
und hält an. Dieser Kontakt steuert jetzt einen Tiny2313.
Diese Software hebt den Container vom Zug und setzt ihn auf dem LKW ab.
Fast wie im Miniatur-Wunderland in Hamburg.
Photo und Assembler-Quellcode im Anhang

Nebenbei will ich heute noch mit arduino 0023 eine .PDE Datei in einem Quadrocopter
(Atmel328P) über FTDI flashen.

Grüße

Rolf
 

Anhänge

  • P1030021.jpg
    P1030021.jpg
    57,9 KB · Aufrufe: 10
  • contener03.asm
    5,9 KB · Aufrufe: 6
Folgende Hinweise zum Programm:
- Schau mal ins Datenblatt des ATtiny2313, und da auf Seite 11. Initial Values sind Voreinstellungen - die werden beim jedem Reset in die I/O-Register geladen. Wie Du sehen kannst, ist das bei den beim Stackpointer bereits RAMEND - Du mußt den also gar nicht (nochmal) initialisieren
- An den Stellen, wo Du über relative calls die Beinchen von PortB umschalten läßt, verwendest Du die binäre Schreibweise - besser lesbar wäre zB "ldi akku, 1<<PB1", wobei ich den das dann och ganz gern einklammere "(1<<PB1)" - klar, das ist immer dieselbe Zahl. Am besten wäre es hier, wenn Du (wie beim AKKUregister auch die Beinchen-Bits "umbenennen" würdest (.equ) (also zB "Relais1", "Reed2", oder gleich die Funktion des entsprechenden Aktors/Sensors)
- PORTB liegt (beim 2313) im I/O-Register 0x18. Bis 0x1F können die Befehle SBI bzw CBI verwendet werden, welche Bits in diesen Registern ohne Umweg über die Rechenregister manipulieren können. (bei SBIC hast Du das ja schon gehabt).

Ansonsten sehr schön übersichtlich strukturiert das ganze.
Noch ein Tip im Forum: ein Klick auf den Code-Button oben im Editorfenster fügt an der Cursorposition Code Tags ein. Dazwischen kannst Du dann Deinen Quelltext kopieren. das sieht dann so aus:
Code:
codezeile
codezeile
     Codezeile
und noch eine
Früher ging das sogar mal mit Syntax-Highlightning - wenn ich mich recht erinner wollte Dirk sich da sogar noch "irgendwann" mal darum kümmern...
 

Ü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)