Hallo,
ich möchte mit dem Attiny 13 die Programmierung in Bascom erlernen und
habe mir als erstes ein Lauflicht ausgesucht. Dies ging prima und nun
sollte ein Servotester folgen. Hierzu wollte ich den Befehl pulseout
benutzen. Im Internet habe ich dann unter anderem den Mittelwert für das
Servo (1,5ms) für den Pulseout-Befehl (Einheit in
Mikrosekunden)gefunden. Aber das Servo läuft hier in meinem Beispiel
leider nicht in die Mitte:
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 24
$swstack = 10
$framesize = 20
Config Portb.0 = Output
Dim A As Word
Do
For A = 1 To 1000
Pulseout Portb , 0 , 1500 'entspricht 1,5 ms
Waitms 20
Next
Loop
End
Bei einem Wert von ca 300-330 fährt das Servo in die Mitte. Was mache
ich hier falsch ?
Danke für Eure Unterstützung
Seid ihr sicher, daß euer Tiny13 mit 12MHz läuft? Das geht nur mit einem
externen Quarz bzw. Takt.
Die $crystal Einstellung muß mit dem tatsächlichen Systemtakt
übereinstimmen.
Der Tiny13 hat nur einen 8-Bit-Timer. Will man den Impulsbreitenbereich
von Servoimpulsen damit darstellen, bietet sich eine Taktfrequenz von
4,8 MHz und Vorteiler 1:64 für den Timer an. Damit hat 1 ms den
Zahlenwert 75 und 2 ms den Zahlenwert 150.
Will man höhere Auflösung, so sollte man einen MC mit 16-Bit-Timer
verwenden, z.B. einen Tiny2313 oder Mega48. Die Bascom-Spezialbefehle
sehen zwar cool aus, können aber fehlende Hardware auch nicht ersetzen.
...
Hallo,
da ich noch ein Anfänger bin, sind mir viele Dinge noch unklar. Für den
Servotester benutze ich keinen Quarz. Meine Frage ist nun:
Wie muss ich den Wert für "chrystal" definieren, damit ich den
Pulseout-Befehl so benutzen kann, wie er im Befehlssatz von BASCOM
enthalten ist ?
z.B.: pulseout 0, 1500 würde ja an Pin0 des PortB den Puls mit der eben
definierten Länge am ATTIny 13 ausgeben.
Mit welcher Taktfrequensz arbeitet denn der ATTiny 13 , wenn er ohne
Quarz beschaltet ist und der Parameter "Chrystal" nicht im Programm
benutzt wird ?
Danke für Eure Unterstützung
Gruß
Peter
Peter Born schrieb:> Wie muss ich den Wert für "chrystal" definieren, damit ich den> Pulseout-Befehl so benutzen kann, wie er im Befehlssatz von BASCOM> enthalten ist ?
Schon mal in die Hilfe von Bascom geguckt?
Da sollten die beiden Begriffe näher beschrieben sein.
Peter Born schrieb:> Mit welcher Taktfrequensz arbeitet denn der ATTiny 13 , wenn er ohne> Quarz beschaltet ist und der Parameter "Chrystal" nicht im Programm> benutzt wird ?
Der Parameter "Chrystal" muß im Programm immer angegeben werden, damit
das Programm weiß, mit welchem Takt der µC arbeitet.
Die Frequenz mit der der µC arbeitet hängt von der von dir verwendeten
Taktquelle ab. Im Datenblatt im Abschnitt 6.2 Clock Sources ist das
genau beschrieben. Was Bascom davon verwendet, sollte im Bascom Manual
stehen.
Da du aber schon Erfahrungswerte hast (Chrystal-Wert, Pulsdauer), kannst
du von da aus auch per Dreisatz auf den tatsächlich verwendeten Takt und
Vorteiler zurückschließen und das mit den genauen Werten aus dem
Datenblatt zur Deckung bringen.
Hallo Peter Born,
warum nimmst du nicht den Befehl von Bascom für Servos?
Der wäre "Servo(1) = <dein wert>"
Bei der 1 kannst du durchnummerieren falls dass es mehrere Servos an
einem AVR sind.
MfG 1234
STK500-Besitzer schrieb:> Schon mal in die Hilfe von Bascom geguckt?> Da sollten die beiden Begriffe näher beschrieben sein.
Recht hatter...
Aber trotzdem:
Peter Born schrieb:> Wie muss ich den Wert für "chrystal" definieren, damit ich den> Pulseout-Befehl so benutzen kann, wie er im Befehlssatz von BASCOM> enthalten ist ?
Du musst den Wert angeben, mit der die CPU Deines Tiny13 taktet.
> z.B.: pulseout 0, 1500 würde ja an Pin0 des PortB den Puls mit der eben> definierten Länge am ATTIny 13 ausgeben.
Ich würde mich nicht darauf verlassen, dass das (zufriedenstellend)
klappt, denn die Hardware-Ausstattung des Tiny13 ist nicht gerade üppig.
Ohne 16-Bit-Timer sind Zahlenwerte über 255 für Zeitintervalle entweder
Plazebo oder es wird etwas komplizierter. Du kannst also davon ausgehen,
dass die angegebenen 1500 (µs) auf einen Wert skaliert werden, der mit
dem 8-Bit-Timer abbildbar ist. Und dazu solltest Du Dir mal (im
Datenblatt des AVRs) ansehen, welche Taktfrequenzen und Timer-Vorteiler
zur Verfügung stehen und wie lange eine "Timer-Runde" mit welchen
Kombinationen dieser Beiden dauert. Du musst mit dem Timer
Zeitintervalle von 700 µs bis 2300 µs abbilden können, eine Timer-Runde
sollte (mit etwas Reserve) also mindestens 2500 µs dauern. Dauert sie
viel länger, verschenkt man Auflösung, ist sie kürzer als 2300 µs, dann
gibt es Überläufe.
Ich weiß zwar nicht genau, wie PulseOut (auf ASM-Ebene) arbeitet, aber
Bascom kann auch nur die vorhandene Hardware nutzen und ist bei kleinen
Programmen auch noch recht verschwenderisch mit den Ressourcen. Auf dem
kleinen Tiny13 würde ich da nicht allzuviel erwarten.
>> Mit welcher Taktfrequensz arbeitet denn der ATTiny 13 , wenn er ohne> Quarz beschaltet ist
Ein erster Blick ins Datenblatt hätte Dir gesagt, dass der interne
RC-Oszillator in Werkseinstellung mit 9,6 MHz klappert und der
Systemtaktvorteiler auf 1:8 voreingestellt ist, was dann eine
Taktfrequenz von 1,2 MHz ergibt.
Ein zweiter Blick ins Datenblatt zeigt Dir dann auch, dass Du aus dem
Programm heraus den Systemtakt-Vorteiler (CLKPR) selbst ändern kannst.
> und der Parameter "Chrystal" nicht im Programm> benutzt wird ?
Der AVR erfährt nix vom Parameter "Chrystal". Dieser Parameter wird von
Bascom benutzt, um Warteschleifen (waitxy), Baudraten und andere Dinge
(vermutlich auch pulseout) an die real vorhandene Taktfrequenz
anzupassen bzw. einzustellen. Den Takt des AVRs änderst Du mit diesem
Parameter aber nicht.
...
Ja natürlich habe ich schon die Bascom-Hilfe benutzt. Nur steht ja
nichts außer, dass die Einheit von Pulseout in Mikrosekunden anzugeben
ist bei einem 4MHz- Quarz-Takt. Aber leider nichts zu einem internen
Takt.
Meiner Meinung kann es doch nicht sein, dass die Mittelstellung am Servo
kontolliert werden muss ( mit dem Auge ermitteln) und ich den Wert bei
Pulseout dann anpasse, bis es stimmt. Das ist für mich nicht logisch.
Genauso ist es mir nicht verständlich: Benutze ich den Befehl waitms
1000, dann ist die Zeit unterschiedlich bei verschiedenen Werten für
"chrystal".
Aber ich lerne ja noch . . . .
Gruß
Peter
An 1234:
warum nimmst du nicht den Befehl von Bascom für Servos?
Der wäre "Servo(1) = <dein wert>"
Bei der 1 kannst du durchnummerieren falls dass es mehrere Servos an
einem AVR sind.
Den Befehl kenne ich nicht in Bascom, meine Version lautet: 2.0.7.1
Gruß
Peter
Hallo, Peter,
ich hatte gestern das selbe Problem mit einem Atmega 32.
Die richtige Taktung des Controller ist wichtig.
Der Servobefehl samt Interrupts geht anscheinend nicht bei einer
internen Taktung von 1Mhz. Zumindest hängte mein Atmega sich auf. Somit
habe ich den Pulseout Befehl genommen.
Mittelwert des Servos liegt bei mir (Taktung intern 1Mhz) irgendwo
zwischen 250 und 620.
Hab ein ganz billiges Servo genommen um den Linksanschlag und
Rechtsanschlag herauszufinden, nur nicht überdrehen, das Getriebe danks
dir sonst.
zb.
Servowert = 410
Pulseout Porta , 4 , Servowert 'An Porta.4 hängt die Steuerleitung.
Hoffe ich konnte dir etwas helfen.
Ansonst melde dich einfach, ich kann dir meinen Code schicken.
Gruß Rainer.