www.mikrocontroller.net

Forum: Codesammlung RC-Fernsteuerung 4-fach switch

Autor: Mark Struberg (struberg)
Datum: 30.10.2007 00:05
Dateianhang: switch4ch.zip (35,6 KB, 195 Downloads)

Hi!

Ich hab vor geraumer Zeit eine kleine Platine mit einem ATtiny13
entworfen, die es ermöglicht, mit einem Kanal einer RC-Fernsteuerung
(System JR zB Robbe, Futaba, Graupner, etc) 4 verschiedene Schaltkanäle
zu togglen.

Ein Schaltkanal ist mit einem 4A FET ausgelegt (IRLL024N), die
restlichen 3 mit normalen Transistoren.

Das layout ist einseitig und kann locker mit der Bügelmethode
hergestellt werden.

Die Sourcen werde ich in einer halben Stunde nachschießen.
Autor: Mark Struberg (struberg)
Datum: 30.10.2007 00:23
Dateianhang: switch4ch.c (6,7 KB, 389 Downloads) | formatierter Code

Und hier der Sourcecode dazu.

Ist sicher noch ausbaufähig und zB sollte ich noch eine Hysterese
einbauen um die Betriebssicherheit zu erhöhen. Aber vom Prinzip her
funktioniert das mit meinem Böötchen schon recht fein.

LieGrü,
strub
Autor: Mark Struberg (struberg)
Datum: 31.10.2007 21:28
Dateianhang: pcb.jpg (55,3 KB, 226 Downloads)
preview image for pcb.jpg

ein kleines bilchen vom geätzten pcb (Bügelmethode)
Autor: Mark Struberg (struberg)
Datum: 31.10.2007 21:28
Dateianhang: soldered.jpg (43 KB, 311 Downloads)
preview image for soldered.jpg

und noch eines vom fertig bestückten.
Autor: Dennis (Gast)
Datum: 22.04.2008 12:24

Hey Leute,

ist jemand in der Lage diesen Code für den atmega8 umzuschreiben. Oder
kann mir jemand einfach sagen welche Register ich in diesem Code auf den
atmega8 anpassen muss? Wäre eine super super dringende Angelegenheit und
ich wäre für jede Hilfe super dankbar!

MfG
Dennis
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 22.04.2008 14:44

Dennis wrote:
> Hey Leute,
>
> ist jemand in der Lage diesen Code für den atmega8 umzuschreiben. Oder
> kann mir jemand einfach sagen welche Register ich in diesem Code auf den
> atmega8 anpassen muss? Wäre eine super super dringende Angelegenheit und
> ich wäre für jede Hilfe super dankbar!

Hast du das schon mal durch den Compiler gejagt?
Beim Durchschauen des Codes ist mir nur eine Stelle
aufgefallen, die Anpassung braucht.

Original
  TIMSK0  |= (1 << TOIE0);                  // Timer 0 Overflow Interrupt enable

Für den Mega8
  TIMSK  |= (1 << TOIE0);                  // Timer 0 Overflow Interrupt enable
Autor: Mark Struberg (struberg)
Datum: 22.04.2008 14:55

Servus Dennis!

Ich habe vor längerer Zeit schon damit begonnen das ganze an den Mega8
anzupassen, jedoch habe ich auch die Funktionalität massiv erweitert -
damit dem mega8 nicht fad wird ;) Durch beruflichen Streß bedingt ist
das dann allerdings liegen geblieben, aber ein bißchen was hab ich noch
im Kopf:

1.) der mega8 hat nen 16 bit timer, dh du brauchst das timerHighByte und
natürlich auch den SIG_OVERFLOW0 interrupt nicht.

2.) die Ports sind ein bißerl anders.


Zu den damals geplanten Erweiterungen

A.) mehr Schaltkanäle, Ansteuerung per 'durchclicken' wie oben
beschrieben.

B.) Ich hab damals geplant auch eine Ansteuerung für bis zu 8 Servos
reinzuhängen. Und zwar würde ich gerne folgenden Trick ausprobieren:

Man öffnet die Servos und baut erst mal den Endanschlag und das
Potentiometer aus.
Die Potis der meisten Servos sind 5k. Dieses ersetzt man jeweils durch
einen cermet Spindeltrimmer mit 1kOhm und je 1 2k2R oben und unten in
Serie. Damit hat man einen effektiven Regelweg von 40% bis 60% zum
Einstellen des Nullanschlags (Servo steht still).

Das Standardsignal für alle 8 Servoausgänge liefert immer 1.50ms
(quarzgenau), dh quasi die Mittelstellung beim Servo. Jetzt werden die
Servos alle mit den Potis so eingestellt, daß sie sich in keine Richtung
drehen. Liefert ein Kanal jetzt 1ms, dann dreht sich dieser Servo
unendlich lange nach rechts, bei 2ms unendlich lange nach links (der
Istwert der Regelschleife ist ja auf 1.5ms fixiert!)

Das ganze hat soweit mit den billigen Standard Servos vom großen C ganz
gut funktioniert. Wie es mit der Langzeitstabilität aussieht muß ich bei
Gelegenheit (kann leider dauern) noch genauer untersuchen. Der uC ist
sicher nicht das Problem, aber die Elektronik in den Servos selbst
könnte mit der Temperatur davonlaufen...

Als Alternative wäre eine Ansteuerung mit L293DD möglich. Man könnte mit
1 IC bis zu 3 Motoren regeln (1Seite bleibt immer gleich und wird
gepulsed als common ground für alle verwendet, die 3 anderen
Leistungsstufen steuern auf der 2. Seite je einen Motor an.)

LieGrü,
strub
Autor: Dennis (Gast)
Datum: 22.04.2008 18:51

Erstmal ein super Dankeschön für die schnellen Antworten ;)

@ Karl

Ja, das war mir auch bereits aufgefallen, deswegen fragte ich welche
Register ich bei atmega8 verwenden müsste. Habs jetzt rausgefunden,
angepasst und siehe da: 0 Fehler :-)

Meine Frage wäre jetzt, kann man davon ausgehen, dass das jetzt so
problemlos (natürlich nach Anpassung der Ports) laufen würde. Habe
nämlich leider noch keine Möglichkeit das zu testen.

@ Mark

Deine Tipps würden über das Maß meine Anforderungen hinausgehen, aber
klingt natürlich auch sehr reizvoll. Leider darf die Servos nicht
modifizieren, auf Grund der Wettkampfbedingungen.

Wir müssen nämlich aus einem vorgegebenen Bausatz an Materialien
innerhalb von zwei Wochen einen Schlepper bauen, der eine Vielzahl an
Aufgaben lösen muss. Modifizierung der Servos ist dabei streng
untersagt....

Selbe Frage an dich: meinst du denn die paar notwendigen Änderungen des
Codes würden bereits zu einer funktionstüchtigen Lösung führen, auch
wenn bereits fehlerfrei kompiliert werden kann?

MfG
Dennis
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 22.04.2008 19:23

Dennis wrote:

> Meine Frage wäre jetzt, kann man davon ausgehen, dass das jetzt so
> problemlos (natürlich nach Anpassung der Ports) laufen würde. Habe
> nämlich leider noch keine Möglichkeit das zu testen.

Ich denke schon.
Im Code wird der 8-Bit Timer0 benutzt, den gibt es in gleicher
Ausführung auch beim Mega8. Und der Rest sind ein paar
Ausgaben auf Port B. Auch das gibt es so im Mega8.

Gut, wenn man das neu schreiben würde, würde man anstelle
von Timer0 den Timer1 nehmen. Dann bräuchte man nicht umständlich
einen 16-Bit Timer in Software machen. Auf der anderen Seite:
Wenn das so funktioniert und deine Bedürfnisse befriedigt: In
einen Mega8 gebrannt und ausprobiert.
Autor: Mark Struberg (struberg)
Datum: 22.04.2008 22:26

> Modifizierung der Servos ist dabei
> streng untersagt....

Genaugenommen verwende ich die Servos ja nicht als solche sondern
zweckentfremdet als kleine Getriebemotoren ;)
Autor: Dennis (Gast)
Datum: 27.04.2008 23:11

Seid ihr euch wirklich sicher, dass der Code so laufen müsste? Ich habe
nämlich Probleme in der praktischen Umsetzung. Bisher habe ich nur mit
einem Ausgang getestet und dieser geht immer automatisch an, auch wenn
der Servo auf  0% steht.

Der Original Code ist ausgelegt auf eine Taktfrequenz von 1,25MHz. Der
mega8 läuft ja aber mit 8MHz. Kann es sein dass dadurch das PWM Signal
falsch ausgewertet wird?

Bin echt nicht so fit in der Programmierung. Könntet ihr mir nochmal
bitte auf die Sprünge helfen?

MfG
Dennis
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 27.04.2008 23:30

Dennis wrote:

> Der Original Code ist ausgelegt auf eine Taktfrequenz von 1,25MHz. Der
> mega8 läuft ja aber mit 8MHz. Kann es sein dass dadurch das PWM Signal
> falsch ausgewertet wird?

Das Timing musst du natürlich schon auf deine verwendete
Taktfrequenz anpassen.
Wenn dein Kumpel vor sich hinzählt und du sagst ihm bei einem
'Zählerstand' von 200 soll er was machen, dann wirst du die
200 durch 400 austauschen müssen, wenn er plötzlich doppelt
so schnell zählt.
Autor: Mark Struberg (struberg)
Datum: 28.04.2008 00:58

Dennis wrote:
> und dieser geht immer automatisch an, auch wenn
> der Servo auf  0% steht.

meinst du mit 0% die Neutralstellung oder ganz auf minus?
Ursprünglich hab ich das für normale Ruderhebel programmiert, also
Nullstellung ist 50% des Signals. Hebel nach unten -> 0%, Hebel nach
oben -> 100%
Autor: Dennis (Gast)
Datum: 28.04.2008 10:45

Mit 0% meine ich die Neutralstellung (1,5ms PWM Signal). -100% wäre 1ms
und +100% 2ms. Habe ich gerade nachgemessen.

Ich flashe das ganze auf den mega8 vom Asuro. Mir ist aufgefallen, dass
wenn ich mit AVRStudio kompiliere nur 6 Pages zum Flashen erstellt
werden, mit dem Programmers Notepad und einer Make File (von der Asuro
CD) werden hingegen 31 Pages nach dem kompilieren geflasht. Ist das
normal oder mache ich grundsätzlich bereits beim Kompilieren etwas
falsch?

So langsam seh ich nämlich keine Hoffnung mehr den Controller noch zum
laufen zu bringen...Habe nämlich schon auch ziemlich alles ausprobiert,
auch an den Zeiten rumgespielt.

An Mark: Womit hast du den Code denn kompiliert und geflasht?
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 28.04.2008 11:08

Dennis wrote:

> Ich flashe das ganze auf den mega8 vom Asuro. Mir ist aufgefallen, dass
> wenn ich mit AVRStudio kompiliere nur 6 Pages zum Flashen erstellt
> werden, mit dem Programmers Notepad und einer Make File (von der Asuro
> CD) werden hingegen 31 Pages nach dem kompilieren geflasht. Ist das
> normal oder mache ich grundsätzlich bereits beim Kompilieren etwas
> falsch?

Der Unterschied könnte im Optimizer liegen. Beim AVR Studio hast
du ihn eingeschaltet, beim Makefile nicht.

Das Programm ist bei mir 388 Bytes groß. Da ich nicht weiß
wie groß eine Page bei deinem Übertragungsprogramm ist, kann
ich da nicht mehr dazu sagen. 388 Bytes klingt realistisch für
ein Programm dieser Größe, so dass ich dem Compiler mal vertraue.

> So langsam seh ich nämlich keine Hoffnung mehr den Controller noch zum
> laufen zu bringen...Habe nämlich schon auch ziemlich alles ausprobiert,
> auch an den Zeiten rumgespielt.

Welche Zeiten hast du denn angepasst und auf welche Zahlenwerte?
Im Programm sind eine Menge Konstanten, die alle auf die Zeiten
eingehen. Grob gesagt müssten deine Zahlenwerte so um den Faktor 6.4
( = 8 / 1.25) vergrößert werden. Aus 1500 wird so 9600
Autor: Läubi Mail@laeubi.de (laeubi) Benutzerseite
Datum: 28.04.2008 11:25

Oder man taktet den Mega8 einfach auch mit nem 1,25Mhz :)
Autor: Dennis (Gast)
Datum: 28.04.2008 12:18

An Umtakten haben wir auch schon gedacht, aber das dürfen wir nicht.

Von den Zeiten her habe ich nur die timerValue Konstanten abgeändert.
Bei den anderen bi nich mir nicht sicher, aber ich bin davon
ausgegangen, dass die ausreichen müsste. Anscheinen ja aber nicht...

Die Datei ist bei mir übrigens mit AVR Studio 1kB groß mit Notepad 6kB.
Schon ein Unterschied zu deiner Größe...
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 28.04.2008 12:46

Dennis wrote:

> Die Datei ist bei mir übrigens mit AVR Studio 1kB groß mit Notepad 6kB.
> Schon ein Unterschied zu deiner Größe...

Ich hab nicht von der Datei gesprochen. Eine HEX Datei ist immer
um ca. den Faktor 3 größer als derselbe Inhalt gemessen in Nutzbytes.

1kB ~ 300 Bytes. Kommt also gut hin.
Autor: Mark Struberg (struberg)
Datum: 28.04.2008 13:57

versuch mal kleinweise ein bißchen debugcode reinzuhängen.
Dh einmal alles aus den Hauptfunktionen

void performActionOnInvalidPulse()
und
void performAction(uint16_t timerValue)

auskommentieren und an 4 ports LEDs anhängen.

LED1 -> Signal -100% bis -50% (Hebel nach unten)
LED2 -> Signal -50% bis +50% (Mittelstellung)
LED3 -> Signal +50% bis +100% (Hebel nach oben)
LED4 -> Invalid Signal (performActionOnInvalidPulse())

Erst wenn das timing korrekt ist, dann probier die eigentliche
Funktionalität einzuhängen.

hope that helps,
strub
Autor: Dennis (Gast)
Datum: 29.04.2008 15:46
Dateianhang: switch4ch.c (6,9 KB, 41 Downloads) | formatierter Code

Also wir haben nun ziemlich viel versucht um den Code zum laufen zu
bekommen, allerdings war nichts von Erfolg gekrönt. Eine Vermutung von
uns wäre noch, dass der Pegel von dem PWM Signal zu niedrig für den
Atmega8 ist. Mit dem Oszi haben wir eine Amplitdue von ca. 3,5 Volt
gemessen. Vielleicht sind die Ports auch falsch. Natürlich kann es auch
sein das unser geänderter Code total falsch ist ;). Evtl. könnte jemand
sein geschultes Auge auf den Code werfen und uns etwas helfen, da wir
nun sehr unter Zeitdruck stehen (wir haben nur noch diese Woche Zeit und
unser Fahrzeug ist auch noch nicht fertig). Ich hab den Code mal
angehängt, ich wäre für jede Hilfe sehr dankbar.
Autor: Dennis (Gast)
Datum: 30.04.2008 08:25

Wir versuchen jetzt gerade mir etwas fremder Hilfe ein neues Programm zu
entwerfen, allerdings ohne Interrupts. Immerhin funktioniert es schon
bedingt :-).

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net