Forum: Mikrocontroller und Digitale Elektronik ATTiny 13 Servotester


von Peter Born (Gast)


Lesenswert?

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

von Kay (Gast)


Lesenswert?

Hi,

Pulseout ist abhängig von der genutzten Taktfrequenz. Ich nutze auch 12 
mhz und mitte ist bei mir bei ca. 4500.

Gruß Kay

von grunz (Gast)


Lesenswert?

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.

von Kay (Gast)


Lesenswert?

Es hat niemand etwas von einem internen quarz geschrieben. Ich für 
meinen Teil nutze einen externen takt.

Kay

von Bernd E. (berecke)


Lesenswert?

$crystal = 1200000  ???
$crystal = 12000000 bei 12 Mhz

von Hannes L. (hannes)


Lesenswert?

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.

...

von Peter Born (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von 1234 (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Peter Born (Gast)


Lesenswert?

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

von Peter Born (Gast)


Lesenswert?

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

von Rainer (Gast)


Lesenswert?

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.

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.