Forum: Mikrocontroller und Digitale Elektronik ATtiny45 - Timer 'Problem' - Assembler


von Patrick J. (ho-bit-hun-ter)



Lesenswert?

Hi

Ich versuche mich soeben, erfolglos, darin, eine LED per Hardware 
blinken zu lassen.

Der Code ist auf nur diesen Snipped reduziert:
(out_ ist ein Macro zur Automatisierung von out und sts)
1
;Freq=1Mhz
2
3
4
; Dr. Michael Schramm Softwareentwicklung
5
; www.schramm-software.de
6
.macro out_ ;(I/O-Reg, reg)
7
.if (@0 < 64)
8
  out  @0,@1
9
.else
10
  sts  @0,@1
11
.endif
12
.endmacro
13
14
.def temp = r16
15
16
ldi temp,(1<<pb4)
17
out_ ddrb,temp
18
19
ldi temp,32
20
out_ OCR1C,temp
21
ldi temp,16
22
out_ OCR1B,temp          ;
23
ldi temp,(1<<CS10)|(1<<CTC1)  ;mit Prozessor-Takt (1MHz)
24
out_ TCCR1,temp
25
ldi temp,(1<<COM1B0)
26
out_ GTCCR,temp
27
rjmp PC      ;Endlosschleife (Sprung an ProgrammCounter)

Ich erwarte, daß der Timer1 mit 1MHz zählt,
bei OCR1B den Ausgang PB4 toggelt,
bei OCR1C den Zählerwert auf 0 setzt.
Laut Simulation klappt Das auch.

Laut Oszi bekomme ich aber eine PWM mit 11,5Hz mit einer ON-Time von 
18.3ms zu Off-Time von 68.6ms - Periodendauer 86,9ms.

Soweit, immerhin ein PWM.

Wenn ich jetzt aber die Zeitachse 'zoome' und mir das ON-Signal ansehe, 
besteht Dieses selber bereits aus einem PWM mit einer Periodendauer von 
~67µs und 50/50 On/Off-Zeit.
Also einem Toogle ca. alle 33µs, was ziemlich genau dem OCR1C-Wert 
entspricht.

Wo habe ich das Datenblatt zum ATtiny25/45/85 (2586Q-AVR-08/2013) falsch 
interpretiert oder wie bringe ich dem Steinchen bei, mit variabler 
Frequenz (dachte da an CTC) und variablem Duty (CompareMatch B, Pin 
toggeln)?

Die Fotos sind nachgestellt und leider 'etwas' verwackelt bzw. sieht man 
den Elektronenstrahl nicht immer sehr deutlich.

205446: Hier der PWM im ON-Anteil des PWM-Signal
205545: Die ON-Time des resutierenden PWM
205634: Die Periodendauer des resultierenden PWM
205702: die OFF-Time des resultierenden PWM (links oben ist ganz leicht 
der ON-Teil zu erahnen)

.... eigentlich wollte ich nur während der Einlernphase des Fahrweg 
diese Phase separat erkennbar machen, die eigentliche Aufgabe (Fahrweg 
erlernen und dann Zwischenpositionen anfahren mit Anzeige, wo Diese ist 
(Blink-Code 6-4-2 wäre z.B. 642) funktioniert, nur ab und zu bekomme ich 
ein TimeOut - Motordrehung wird nicht erkannt und Chip startet die 
Einlernphase neu - Diese wollte ich halt erkennen können und bekomme 
nicht Mal ne LED zum Blinken (zumindest nicht, wie geplant).

MfG

MfG

von S. Landolt (Gast)


Lesenswert?

Nur ein Schnellschuss: ist vielleicht der ATtiny15-Mode eingeschaltet 
mit CKSEL=0011?

von S. Landolt (Gast)


Lesenswert?

Pardon, das war's nicht, im tiny15-Modus toggelt gar nichts mehr.
  Aber ich kann das Problem nicht nachvollziehen, ich sehe bei mir ein 
Rechteck mit ca. 64 us und einem Tastverhältnis von ca. 50 %.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

CKSEL 0010 (ProgISP v1.72, lag dem USBISP bei)
LowValue 0x62 (ändert sich auf 0x60 bei 0000)

Weiter sollte sich dann doch 'nur' die Geschwindigkeit ändern (6,4MHz 
statt 8MHz bzw. durch ckl/8 statt 1MHz 'was weniger').

MfG

Edit:
Dann werde ich Morgen Mal das Steinchen austauschen.

Es sollte sich aber schon das von mir gedachte/oben beschriebene Signal 
ergeben?


PPS:
Ich verwende das AVR-Studio 4.19, da sich eine aktuellere Version nicht 
im virtuellen Windows 7 installieren ließ.
Wobei Das, gerade bei Assembler, eigentlich egal sein dürfte, da die 
Anwendungen 1:1 im Chip ankommen sollten.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Das mit dem variablen Tastverhältnis geht m.E. so nicht, stattdessen
ldi temp,(1<<COM1B0)|(1<<PWM1B)

von S. Landolt (Gast)


Lesenswert?

out_ GTCCR,temp
sollte da noch drunter

> 'nur' die Geschwindigkeit ändern
Wenn ich es richtig verstanden habe, ändert sich im tiny15-Modus das 
Verhalten von Timer1 grundlegend.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

S. Landolt schrieb:
> ldi temp,(1<<COM1B0)|(1<<PWM1B)

Scheint keinerlei Auswirkung zu haben, ob ich PWM1B setze, oder nicht.
Das Signal sieht identisch aus.

Die 33µs (bzw. 66µs Periodendauer) des 'ON-PWM-Signal' passen ja zu dem 
Zählerwert OCR1C und den 1MHz (8MHz ckDIV/8) - nur verstehe ich den 11Hz 
(ca. 10x die Sekunde) PWM nicht, Dessen ON-Zeiten ebenfalls per PWM 
generiert werden.

Irgendwie scheint es, daß ich zwei Timer ver-UND-et betreibe, kann ich 
mir aber nicht erklären.
Timer 0 ist aus und Mehr ist nicht drin, im ATtiny45.

MfG

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> .. Das Signal sieht identisch aus.
Auch wenn Sie OCR1B auf z.B. 10 setzen?


Tja, dann weiß ich auch nicht weiter.
  Ich übernehme Ihr Programm mit copy&paste, ergänze das  |(1<<PWM1B) 
und stecke es in meinen ATtiny85 (Fuses auf Werkseinstellung), das 
Oszilloskop hängt an PB4 und zeigt ein Rechtecksignal mit ca. 64.5 us. 
Wie gewünscht lässt sich Letzteres mit OCR1C einstellen sowie das 
Tastverhältnis mit OCR1B.

Dass ich ddrb, pb4 und PC umschreiben muss sei nur am Rande erwähnt, ich 
arbeite grundsätzlich mit der Option -c.

von S. Landolt (Gast)


Lesenswert?

Entschuldigung, das sind ca. 323 us - das Oszilloskop steht ja auf 5 
us/cm, nicht auf 1.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Patrick J. schrieb:
> Irgendwie scheint es, daß ich zwei Timer ver-UND-et betreibe, kann ich
> mir aber nicht erklären.
>
Die AVR-ASM-Experten sicherlich auch nicht, wenn die Glaskugel gerade 
mal wieder nicht will ;-)

Also - den Programmteil, den man als entscheidend hält, einmal hier 
richtig Formatiert wiederzugeben ist sicher ein guter Ansatz. Ein 
besserer wäre aber, zusätzlich das komplette Programm als Datei 
anzuhängen.

Ansonsten finde ich es gut, das du dir so viel Mühe gibst uns dein 
Problem darzustellen. Deshalb nimm die folgenden Sätze nicht persönlich. 
Wahrscheinlich hast du es nur vergessen.

Habt ihr Angst ein patentwürdiges Programm geschrieben zu haben ?
Dann solltet ihr eure Probleme auch selber lösen.


Bernd_Stein

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Mach mal in die Mainloop ein WDR rein.

von Patrick J. (ho-bit-hun-ter)


Angehängte Dateien:

Lesenswert?

Hi

Danke der vielen Antworten.

Bernd S. schrieb:
> Habt ihr Angst ein patentwürdiges Programm geschrieben zu haben ?
> Dann solltet ihr eure Probleme auch selber lösen.
Zu Viel des Guten, Sire, Ihr müsset mich nicht so hoch tragend anreden, 
werter Herr, bin auch nur ein kleiner Krauter :)

Bernd S. schrieb:
> zusätzlich das komplette Programm als Datei
> anzuhängen.
Ich gelobe Besserung!

Soeben das Steinchen neu 'besaftet' - gleiches Ergebnis.
Sowohl die 66µs (15,2kHz) wie die 11Hz kamen zum Vorschein.
Das .lss-File zum Vorzeigen angedacht, dort werden aber ebenfalls die 
unbenutzten Macros gelistet (da im .LIST .LISTMAC - Bereich) - also 
hoffnungslos aufgequollen.
Wieder den Original-Fehler-Zustand hergestellt, aufgespielt, auf dem 
Oszi keine Änderung - dachte ich - hier ebenfalls die 66µs (also 
eigentlich 33+33), aber die 11Hz gibt es nicht mehr, ich habe jetzt 
einen sauberen PWM.

Der hoch geheime Code enthält hier für, bis auf die Definitionen des 
Studio4 (unter Anderem ddrb), zwei Include-Files, aus Denen aber Nichts 
benutzt wird, da der Code ab Adresse 0 (Reset-Vektor) angesprungen wird.
In den Include-Files sind Macros enthalten, teils im WWW Gefundene, wie 
auch selbst aus diversen Vorlagen Abgeleitete.

Die 'tn45def.inc' bleibe ich schuldig, da ich Diese 'aus der virtuellen 
Win-7-Maschine extrahieren müsste' - ist aber Bestandteil des Studio4 
und sollte sich, wenn benötigt, bei Atmel finden lassen (bzw. bringt der 
Installer zum Studio Diese mit).

Zu dem (hoch hochgeheimem) Programm:
Ein DC-Motor wird über eine H-Brücke in beide Richtungen angesteuert.
Dieser wird untersetzt (Kraft erhöht), dabei wird die Drehrichtung des 
ersten Zahnrad überwacht (und gezählt).
Wenn der Motor hier nicht 'rückwärts' dreht, wird die Drehrichtung im 
Programm invertiert und die Lern-Phase neu gestartet.
Die Lichtschranken überlappen sich, womit die Richtung erkannt und ein 
Zähler entsprechend hoch/runter gezählt werden kann - ein Richtungsflag 
wird gesetzt, Welches tunlichst mit der Wunsch-Richtung übereinstimmen 
sollte - zumindest in der Einlern-Phase.
Bei 'ganz zu' blockiert der Motor und die Zahnrad-Drehung wird nicht 
erkannt - nach einer Sekunde beißt der WatchDog zu und setzt ein Flag 
(Interrupt).
Darauf hin wird der Zählerstand genullt, die Richtung umgekehrt und die 
Fahrt beginnt von Neuem.
Bei jeder Änderung der Lichtschranken (zwei CNY70) wird der WatchDog 
resettet, somit habe ich 'bis zu einer Sekunde Zeit', bis sich eine der 
Lichtschranken melden muß.
In der Stellung 'voll auf' passiert das Gleiche, der WatchDog beißt, das 
Flag wird erkannt, der WatchDog beendet, die Einlernphase verlassen.

Im eigentlichen Programm wird nun (wir sind ja ganz oben/ganz auf) 
einige Male einige Schritte zu gefahren.
Bei jeder angefahrenen Position wird Diese 'vorgeblinkt'.
Dazu wird die Schritt-Anzahl in 10er-Ziffern geteilt (ja, etwas 
umständlich, Platz ist aber noch Massig da).
Eine 604 wird zu ...... (6)  - (0)   .... (4) (eine Null wird laaang 
gegeben, vorangestellte Nullen werden übersprungen).
Dann wird 'zur Mitte' gefahren, dann einige Male in AUF-Richtung, dann 
wieder zur Mitte.
Das war jetzt das 'eigentliche Programm nach dem Einlernen' und 
wiederholt sich ab hier.
Bei den Fahrten wird der WatchDog aktiviert, ein Biss beendet die 
aktuelle Fahrt wie auch ein Erreichen der Soll-Position die aktuelle 
Fahrt beendet - wieder mit 'Zahl vorblinken'.
Wenn der WatchDog 255x 'gebissen hat' - also nach 255 'Laufzeit-Fehlern' 
(mechanisches Ende oder Wackler in den CNY70, oder ...) wird neu 
eingelernt.

Beim Einlernen wollte ich eigentlich ein verschieden schnelles 
Dauer-Blinken, damit ich sehe, daß der µC gerade 'in ZU' oder 'in AUF' 
Lern-Richtung unterwegs ist, wo ich die Probleme zu diesem Thread dann 
bekam.

Im Anhang das Programm noch mit dem 'Nur-PWM-Programm'.
Wenn Das draußen ist, seid Ihr so weit, wie ich jetzt auch ;)



Vll. fällt's ja dem Einen oder Anderen auf ... bin ASM-selbst-Beibringer 
-
also nicht Lachen ;)

MfG


PS: mit dem Patent ist jetzt wohl Essig, wo's hier geschrieben steht :/

PPS: ein Video zum Download gibt es hier:
https://www.file-upload.net/download-12551610/VID_20170611_221034.3gp.html

War der einzige/erste Hoster, bei Dem ich mich nicht anmelden musste, 
leider nicht zum 'direkt angucken' - 107MB vll. etwas übertrieben, nur 
um zu 'Spannen' :)
(wenn Wer nen Uploader 'für nebenher und direkt angugge' hat, gerne Link 
zu mir)

von S. Landolt (Gast)


Lesenswert?

> Zu Viel des Guten, Sire, Ihr müsset mich ...

Zum Sachthema kann ich nichts mehr, aber vielleicht zur Erheiterung 
beitragen: das mit der Anrede ist immer so eine Sache, wandelt sich im 
Laufe der Zeit, wie derzeit ja zu beobachten ist an Sie und Du (oder 
gleich kleingeschrieben du), auch das Ihr war einmal zweifelhaft:

»Wohlwend, Ihr könnt hier nicht mit uns von Euren Sachen reden ...«
...
  Wohlwends Idylle war durch die Frau entschieden gestört, und er packte 
zusammen, doch schlug er einen andern Weg ein, als die Salanderleute 
gegangen.
  Diese stiegen wieder in die Höhe und sprachen einige Minuten nichts, 
bis Martin über die kurze Rede seiner Frau lachen mußte.
  »Du hast ihn scharf behandelt!« sagte er zu ihr, »wie zum Teufel 
gerätst du auf den Einfall, per Wohlwend und per Ihr mit ihm zu reden?«
  »Ich denke, man spricht so mit den Sträflingen in den Zuchthäusern; in 
meinen Augen ist er aber nichts Besseres!«

aus Martin Salander von Gottfried Keller

von S. Landolt (Gast)


Lesenswert?

> ldi temp,(1<<COM1B0)|(1<PWM1B)

Also das haben Sie (pardon) nicht von mir, ich schrieb  |(1<<PWM1B).

von Carl D. (jcw2)


Lesenswert?

Ich würde einfach mal kurz nach dem Label "Reset" mit einem Pin wackeln 
und vermute stark, daß das mit 11Hz passiert.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

S. Landolt schrieb:
>> ldi temp,(1<<COM1B0)|(1<PWM1B)
>
> Also das haben Sie (pardon) nicht von mir, ich schrieb  |(1<<PWM1B).

Das fällt mir eben gerade erst auf, daß bei mir nur 1 < drin ist - wie 
konnte mir Das passieren??
mit << sieht das Signal ganz passabel aus - fehlte also nur das PWM1B - 
habe mir gerade die Timer-Sektion ausgedruckt, im PDF verlief ich mich 
irgendwie.

Danke für den Wink!

Carl D. schrieb:
> Ich würde einfach mal kurz nach dem Label "Reset" mit einem Pin wackeln
> und vermute stark, daß das mit 11Hz passiert.

Dann wäre aber die Frage, was die LOW-Zeit im 11Hz-PWM veranlasst.
Irgendwie schade, daß der Fehler jetzt weg ist :/

Nichts desto Trotz:
Das Video ist 'oben' - der Video-Download-Link hier drüber kann also 
vergessen werden.
Auch ich habe wohl ein YT-Konto - dann nutzen Wir Das doch Mal:
https://www.youtube.com/watch?v=jEgOslWK5MM

MfG

von Peter D. (peda)


Lesenswert?

Patrick J. schrieb:
> Wieder den Original-Fehler-Zustand hergestellt, aufgespielt, auf dem
> Oszi keine Änderung - dachte ich - hier ebenfalls die 66µs (also
> eigentlich 33+33), aber die 11Hz gibt es nicht mehr, ich habe jetzt
> einen sauberen PWM.

Jetzt mußt Du nur noch den Code zeigen, wo der Fehler auftritt.

Ein einmal angeschalteter WD übersteht einen Reset, sowie neu 
Programmieren.
Erst nach VCC = 0V ist er wieder aus.

Und Dein Setzen des WD auf 1s funktioniert nicht, siehe:
"8.4.1 Timed Sequences for Changing the Configuration of the Watchdog 
Timer"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.