www.mikrocontroller.net

Forum: Projekte & Code RC-Fernsteuerung 4-fach switch


Autor: Mark Struberg (struberg)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ein kleines bilchen vom geätzten pcb (Bügelmethode)

Autor: Mark Struberg (struberg)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und noch eines vom fertig bestückten.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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 (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
> 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:

Bewertung
0 lesenswert
nicht lesenswert
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 (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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 (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder man taktet den Mega8 einfach auch mit nem 1,25Mhz :)

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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 E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.