Mein Problem ist irgendwie... kompliziert. Ich versuche es aber so kurz und bündig wie möglich zu beschreiben.
Ich habe ein Programm mit der Arduino Umgebung geschrieben und dann über einen Arduino Uno (als ISP genutzt) in einen ATTiny84 geladen. Das Programm soll an einem PIN des ATTiny ein Trigger-Signal wahrnehmen und dann durch verschiedene Modi schalten, welche vier LEDs am Heck eines Feuerwehr-Fahrzeugs in unterschiedlichen Sequenzen leuchten lassen.
Mein aktueller Ansatz ist, den Trigger durch eine Hebelbewegung (oder Schalter) an der Fernsteuerung (Spectrum DX9) mit der Übertragung eines proportionalen Signals im negativen Bereich (Modi rückwärts schalten) oder positiven Bereich (Modi vorwärts schalten) zu realisieren.
Die Werte "< 1200" für den Ausschlag des Hebels zur einen Seite und "> 1600" für den Ausschlag zur anderen Seite habe ich dem Youtube-Video entnommen. Ich bin bzgl. PWM-Signalen noch nicht wissend genug, aber ich nehmen an, dass diese Werte einem allgemeinen Standard für PWM im Zusammenhang mit Servos entsprechen.
Ich schließe nun zum Test den ATTiny84 mit dem Programm an den Deltang Rx41d-1 (P5, als Servo-Ausgang konfiguriert, dem entsprechenden Kanal der Fernsteuerung zugeordnet) an. Die Stromversorgung mit 5V kommt bei diesem Test über den Arduino Uno, welcher auch über den Serielen Monitor das PWM-Signal darstellt. In dieser Konstellation funktioniert alles gut. Die PWM-Werte liegen im erwarteten Bereich, der ATTiny84 schaltet vorwärts und rückwärts durch die Modi.
Dann nehme ich den Arduino Uno aus dem Aufbau heraus. Der ATTiny84 und der Deltang werden an einen Lipo 1S 500mAh zur Stromversorgung (ca. 4V) angeschlossen. Nun ändert sich das Verhalten des ATTiny84: Der Microcontroller verhält sich so, als ob er dauerhaft einen PWM-Wert "< 1200" am PIN wahrnimmt. Die Modi werden ohne Pause rückwärts durch geschaltet. So funktioniert die Anwendung des ATTiny84 natürlich leider nicht...
Folgendes haben ich leider ohne Erfolg ausprobiert: - einen anderen Lipo 1S - einen anderen Deltang Rx43d-1 - gleichen Aufbau mit Lipo am P6 des Deltang (statt P5) - Servo am P5 angelötet - Servo funktioniert wie gewohnt
Und - ich habe den Deltang an den Lipo angeschlossen. Den Ausgang P5 hab ich an einen Input des Arduino Uno (eigene 5V-Stromversorgung über USB) gelötet und mit der Funktion pulseIn() das gesendete PWM-Signal ausgelesen. Am Serial Monitor werden mir dann plötzlich Werte zwischen 10000 und 11000 ausgegeben. Allerdings sind auch immer wieder mal Werte von 0 oder 900 oder dazwischen dabei, also hoch dynamisch. Interessanterweise haben die Hebelbewegungen an der Fernsteuerung nun auch keinen Einfluss mehr auf die PWM-Werte.
Hat irgendjemand Erfahrung mit dem Auslesen von Signalen vom Deltang an einem ATTiny84? Ich habe mich bisher nicht in BASCOM eingearbeitet, was ja viele hier im Forum nutzen, sondern wollte das möglichst mit der Ardunio Umgebung machen. Ein anderer Ansatz wäre die P5 vom Deltang als On/Off-Schalter zu konfigurieren und am ATTiny84 dann nur einen Schaltimpuls zu prüfen. Das habe ich aber noch nicht ausprobiert.
ich habe irgendwo gelesen (finde den Link leider nicht mehr), dass der ATTiny84 auf jedem INPUT/OUTPUT Pin ein PWM-Signal lesen, aber eben nur auf den Pins 5, 6, 7, 8 auch senden kann. Für diese Theorie würde ja auch sprechen, dass die Funktion voll gegeben ist, wenn ATTiny und Deltang die 5V gemeinsam vom Arduino Uno als Stromquelle beziehen...
@Björn Er ließt doch nur das PWM-Signal vom Deltang. Also hat er sicher Pin13/PA0 für den externen Interrupt verwendet.
@Daniel Ich kann mir eigentlich nur vorstellen, dass vielleicht das Signal vom Deltang nicht schnell genug den minimalen Highwert erreicht, weil keine Pullup-Widerstände fur den Eingangspin gesetzt wurden. Statt den Highwert würde ich aber lieber die steigende Flanke als Trigger nehmen.
Genau richtig. Der Pin 13 / PA0 ist mein Input-Pin vom Deltang kommend - aber tatsächlich ohne den Pull-Up Widerstand.
Den Hinweis mit der steigenden Flanke verstehe ich leider noch nicht, hast Du dazu Lektüre oder einen anderen Beitrag im Kopf, mit dem ich mich da annähern kann?
Und - ich habe den Deltang an den Lipo angeschlossen. Den Ausgang P5 hab ich an einen Input des Arduino Uno (eigene 5V-Stromversorgung über USB) gelötet und mit der Funktion pulseIn() das gesendete PWM-Signal ausgelesen. Am Serial Monitor werden mir dann plötzlich Werte zwischen 10000 und 11000 ausgegeben. Allerdings sind auch immer wieder mal Werte von 0 oder 900 oder dazwischen dabei, also hoch dynamisch. Interessanterweise haben die Hebelbewegungen an der Fernsteuerung nun auch keinen Einfluss mehr auf die PWM-Werte.
Hallo. Ich denke, hier war es notwendig, ein Allgemeines minus zu machen.
evtl. musst Du noch prüfen, ob Werte unterhalb bzw. überhalb eines bestimmten Wertes ignoriert werden. Ich habe auch vor einiger Zeit mal etwas mit ATTiny85 angefangen, mangels Zeit liegt das Projekt aber still. Das Problem in Kürze: der Prozessor kann nur mit 8-Bit-Werten intern umgehen, für Zeitwerte über 255 braucht man aber 16 Bit oder noch mehr. Für die Pulsezeiten von 1500 (für uns hier eigentlich der Bereich zwischen 900 und 2100) kann es bei den Timern theoretisch und auch praktisch Werte geben, die überhaupt nicht in diesen Puls passen, weil ein Interrupt genau in eine Berechnung reinhaut. Dann muss man sich Gedanken machen, was solche Werte auslösen kann, in den meisten Fällen wäre es sinnvoll, einzelne Ausreisser zu ignorieren. Kommen mehrere in Folge, dann ist etwas faul. Daher würde ich zum Test mal etwas programmieren, wenn der Wert unter 900 liegen (dann z.B. nur eine LED dauerhaft an für 5 Sekunden oder so) oder wenn der Wert über 2100 liegt (dann eine andere LED dauerhaft für s Sekunden an). Und dann mit der Funke oder einem Servotester ein wenig spielen. Wenn nach mehreren Minuten keine LED dauerhaft an war, ist die Umsetzung des Compilers und des Codes wohl gut gelöst. Bleibt eine LED an, solltest Du die Ausnahmen integrieren.