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.
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
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
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
1 | TIMSK0 |= (1 << TOIE0); // Timer 0 Overflow Interrupt enable |
Für den Mega8
1 | TIMSK |= (1 << TOIE0); // Timer 0 Overflow Interrupt enable |
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
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
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.
> Modifizierung der Servos ist dabei > streng untersagt.... Genaugenommen verwende ich die Servos ja nicht als solche sondern zweckentfremdet als kleine Getriebemotoren ;)
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
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.
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%
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?
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
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...
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.
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
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.
Wir versuchen jetzt gerade mir etwas fremder Hilfe ein neues Programm zu entwerfen, allerdings ohne Interrupts. Immerhin funktioniert es schon bedingt :-).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.