servo und fastavr mit atiny26 at 1Mhz

#500399
Lesenswert?

guten tag an die gemeinde

ich hab da ein problem

das forum bietet sehr viele infos über c und atmel
leider ist c nicht mein ding seit jahren  schon basic freak

ich würde gerne ein SERVO(modellbau) steuern

das ganze mit nem atiny 26 ohne anbauteile also mit 1mhz
und das alles mit fastavr

geht das überhaupt oder brauch ich dazu minimum 4mhz

das servo braucht doch nur einen puls breite 20ms
und ne high von 1.ms bi 2ms für 90grad 0,5bis 2,5 für180grad
wenn ich das richtig verstehe

jetzt der hammer ich hab noch nie einen timer gesetzt oder mit interupts 
gearbeitet
#

GRundverständniss die 20ms breite inclusive der high(wert) müssen ja 
immer
anliegen wärend das programm weiterläuft(also unabhängig) ist das der 
regelfall oder muss ich das extra programmieren

hat da jemand ein beispiel für pwm in fastavr

danke

hilfe wäre echt klasse
Gast #500465
Lesenswert?

>ich hab noch nie einen timer gesetzt oder mit interupts gearbeitet
mit FastAVR?
Warum hast Du noch nie einen Timer gesetzt oder mit Interrupts 
gearbeitet?
geht doch mit FastAVR(zumindest die Versionen für Controller, die NICHT 
im erweiterten IO Bereich arbeiten müssen)ziemlich erstklassig.
Die neueren Versionen (4.2 + 4.3) sind eher nicht zu empfehlen, da die 
Nutzung des erweiterten IO Bereichs bei FastAVR nur "umschifft" wurde, 
statt konsequent NEU aufzusetzen.

Ich habe mich bis dato nur mit dem Empfang von Fernsteuersignalen 
auseinander gesetzt (Fahrregler). ein Servo anzusteuern kann ja soo 
schwer nicht sein.
Ein konkretes Beispiel habe ich jetzt nicht parat.
Willst Du die Stellgröße über die serielle vom PC vorgeben, sollen es 
zwei Tasten sein, oder soll das Servo automatisch hin- und her fahren?
Was ist mit "F1" und "PWM"?

XlR.
Gast #500557
Lesenswert?

Hat zwar nix mit Servos zu tun aber mit der PWM an sich. Ist ein 
Beispiel für das erste Pollinboard. Die erste LED wird per PWM 
interruptgesteuert auf und abgedimmt und die andere LED blinkt einfach 
so vor sich hin. Vielleicht fällt so der Einstieg in PWM/Interrupt 
leichter.

bye

Frank

$Device= m16      ' used device
$Stack = 32      ' stack depth
$Clock = 8.0000      ' adjust for used crystal

$Timer1=PWM,8,PwmA=Normal  ' PWM Modus setzen

$Def LED1=PORTD.5    ' Definieren der genutzten Ports
$Def LED2=PORTD.6    ' hier fürs Pollinbrett
$Def Buzz=PORTD.7

Declare Interrupt Oc1A()  ' Der wird hier benutzt

Dim a As Byte      ' Variable für Zählschleife


DDRD=&b11100000      ' Richtung festlegen
PORTD=&b00000000    ' interne Pullups setzen (oder nicht)

Enable Oc1A      ' den deklarierten Interrupt freischalten
Enable Interrupts    ' und nun Interrupte an sich freischalten

Start Timer1      ' damit der Timer auch rennt und interrupten kann

Do        ' Ab der nächsten Zeile gehts los
Toggle led2      ' nur damit im Hauptprogramm was sichtbares passiert
For a = 1 To 255    ' LED hochdimmen
Pwm1A=a
WaitMs 1
Next a
For a= 1 To 255      ' LED runterdimmen. Step -1 hat irgendwie nicht 
funktioniert
Pwm1A= 255 - a
WaitMs 1
Next a

Loop

End

'/////////////////////////////////////////////////////
Interrupt Oc1A(),Save All   'alle Register sichern
End Interrupt
#500784
Lesenswert?

ich hab jetzt mal so 4stunden reingehängt

es taktet auch schön

und das servo rennt mit timer0


bekomme aber nur 20zwischenschritte hin

wie kann man das ausrechnen bei 1mhz und nur 8bit timer das man da 255
schritte hinbekommt für 1ms(von 1ms bis 2ms) und dann noch die restzeit 
bis auf 20ms  das geht doch mit 8bit garnicht b

oder hat da einer nen tip
DANKE


#500792
Lesenswert?

Lothar Sammel wrote:
> ich hab jetzt mal so 4stunden reingehängt
>
> es taktet auch schön
>
> und das servo rennt mit timer0
>
>
> bekomme aber nur 20zwischenschritte hin
>
> wie kann man das ausrechnen bei 1mhz und nur 8bit timer das man da 255
> schritte hinbekommt für 1ms(von 1ms bis 2ms) und dann noch die restzeit
> bis auf 20ms  das geht doch mit 8bit garnicht b
>
> oder hat da einer nen tip

Du musst die 1 Mhz höher stellen.

Timer0 mit 1 Mhz (also kein Vorteiler) laufen lassen.
Bei einem Timerstand von 256 (also 0) kriegst du einen
Interrupt. D.h. du kriegst alle 0.000256 Sekunden einen
Interrupt. Das ist natürlich etwas viel Zeit, da du 1 ms
damit nur noch in 4 Teile zerteilen kannst.
Selbst wenn du den Timer jeweils vorlädst, sagen wir mal
mit 25, hast du immer noch Interrupts im Abstand von 0.025 ms.
Das erlaubt dann zwar schon eine Abstufung von 1 / 0.025, also
40 Stellungen und das ist nicht viel.

Geh mit der Taktfrequez höher und das Problem löst sich
in Luft aus.

Um die 20 ms musst du dir keine Sorgen machen. Die sind nicht
kritisch.


Das setzt natürlich voraus, dass du die Pulserzeugung selber
in einem Overflow Interrupt machst. Wenn du mehrere Servos
ansteuern willst, hast du aber sowieso keine andere Wahl.
#500870
Lesenswert?

danke für den tip

wie ist das mit den frequenzkristallen und den chips mit portund xtal 
auf einem pin

muss ich da fuses setzen oder erkennt der chip das da ein 10mhz
crystal da ist

in meinem selbstgebauten isp  LPT nach isp via 74HC244 kann ich mit 
bascom
keine fuses setzen

laut datenblatt sollte das mit sefprogramming 2xkurz power on innerhalb 
1sec funzen
Angehängte Dateien:
#500877
Lesenswert?

> in meinem selbstgebauten isp  LPT nach isp via 74HC244 kann ich mit
> bascom keine fuses setzen

Dann hast du ein Problem.
Aber je nachdem wie dieser Programmer aufgebaut ist,
kannst du vielleicht ein anderes Brennprogramm nehmen.
Obwohl mir das schon etwas seltsam vorkommt, dass du
mit dem BASCOM Brenner nicht an die Fuses rankommst.

> muss ich da fuses setzen oder erkennt der chip das da ein 10mhz
> crystal da ist

Du must die fuses setzen. Da führt kein Weg drann vorbei.

#500884
Lesenswert?

Hast Du Dir eigentlich mal den Link angesehen, den ich Dir weiter oben 
schrieb?
Da wirst Du sehen, dass 7 Servoimpulse für einen Mega48 mit 1MHz 
internem Takt kein Problem sind.
Auch wenn Du kein ASM kannst, es ist recht gut beschrieben, wie das 
Programm arbeitet. Du kannst zumindest den Ablauf (unabhängig von der 
Programmiersprache) ergründen und es in BASIC umsetzen. Auch mit BASIC 
kann man direkt auf die I/O-Register zugreifen.

Hat der Tiny26 eigentlich einen 16-Bit-Timer? Mit einem 8-Bit Timer muss 
man da nämlich etwas anders herangehen. Beim Tiny15 mit 1,6MHz 
verarbeite (und erzeuge) ich Servoimpulse mittels 8-Bit-Timer. Dabei 
benutze ich Vorteiler 16 und komme auf eine Auflösung von 0,01ms, also 
auf Zahlenwerte von 100 für 1ms und 200 für 2ms. Das sind 100 Stufen für 
den normalen Stellbereich des Servos. Einige Beispiele sind ganz dicht 
bei dem angegebenen Link zu finden.

Gibt es eigentlich einen triftigen Grund, das mit einem Tiny26 machen zu 
wollen? Mit dem Mega48 geht das nämlich ohne Verändern der Fuses, mit 
Mega8 natürlich auch, aber der ist schon Overkill.

...
Gast #764216
Lesenswert?

....Die neueren Versionen (4.2 + 4.3) sind eher nicht zu empfehlen, da 
die
Nutzung des erweiterten IO Bereichs bei FastAVR nur "umschifft" wurde,
statt konsequent NEU aufzusetzen......


ich bin neu im bascom und möchte evtl auf fastavr umsteigen.

kannst du deine aussage für die neueren versionen von fastavr mal genau 
untermauern?

mfg
Gast #764245
Lesenswert?

fastavrfan wrote:
> ....Die neueren Versionen (4.2 + 4.3) sind eher nicht zu empfehlen, da
> die
> Nutzung des erweiterten IO Bereichs bei FastAVR nur "umschifft" wurde,
> statt konsequent NEU aufzusetzen......
>
>
> ich bin neu im bascom und möchte evtl auf fastavr umsteigen.
>
> kannst du deine aussage für die neueren versionen von fastavr mal genau
> untermauern?
>
> mfg

nicht mehr... bin auf GCC umgestiegen

Axelr.

Im Anhang ein Screenshot der Fastavrgroup, wo der Support von Bojan I. 
zu erreichen ist.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren