1

Samstag, 28. Oktober 2017, 21:02

Attiny2313 als RC - Schalter HILFE

Hallo liebe Foren-Gemeinde,

ich beschäftige mich zurzeit mit dem Attiny2313 da ich diesen in einem Modell als RC - Schalter einsetzen möchte.

Das ein oder andere Programm habe ich in Bascom geschrieben und auch schon erfolgreich geflasht.
Allerdings scheitert es jetzt daran das ganze mit der Fernsteuerung auch zu schalten. Im Internet findet man ja schon ähnliche
Programme in Bascom, aber irgendwie komme ich auf keinen grünen Zweig

Ich hoffe ihr könnt mir helfen. Wie oben gesagt bin ich Anfänger auf dem Gebiet.
Also meine Fragen:
Darf/Kann ich nur einen bestimmten Pin als Impulseingang nehmen?
Auf was muss ich achten?

Als Fernsteuerung hab ich eine Spektrum DX10t
Mit meiner Schaltung verschohne ich euch lieber, alles nur provisorisch auf einem Steckbrett und das auch nicht unbedingt schön.

Der Code fängt so an:
$regfile = "attiny2313.dat"
$crystal = 1000000

Config Portb. 2 = Output
Config Portb. 6 = Output
Config Portb. 7 = Input

Dim W As Word

Do

Pulsein W , Portb , 7 , 0

If W <= 100 Then
Portb.2 = 0
Portb.6 = 0
End If

If W > 100 And W <= 200 Then
Portb. 2 = 1
Portb. 6 = 1

Hoffe ich hab alles aufgeführt was ihr braucht um mir zu helfen.

a_rueckert

RCLine User

Wohnort: Kaiserslautern / Germany

Beruf: Software Engineer

  • Nachricht senden

2

Sonntag, 29. Oktober 2017, 00:19

Ok, ich hab noch nie was mit dem Attiny gemacht, also alles ohne Gewähr.

Wenn Du die PWM Weite mit nem Timer + Interrupt messen willst, geht das wohl nur mit dem Input Capture Pin (ICP). Das wäre D6:

https://startingelectronics.org/tutorial…nate-functions/

Hier ist das Prinzip erklärt:

https://www.mikrocontroller.net/articles…ut_Capturing.29

Hier ist ein Beispiel Programm in C:

http://www.avrfreaks.net/forum/rc-brake-…ewtopic&t=49849
Heli: Twister CP V2,Carbooon CP,T-Rex 450 S-CF,CopterX,DF64C
Fläche: Jede Menge Flächenmodelle aus alten Tagen
Futaba FX 18 V2, Robbe Terra Top, Robbe Terra, Turnigy 9x

hsh

RCLine User

Wohnort: Österreich

  • Nachricht senden

3

Sonntag, 29. Oktober 2017, 00:31

Darf/Kann ich nur einen bestimmten Pin als Impulseingang nehmen?
Auf was muss ich achten?
Das kommt darauf an ;)
Wenn du mit den Funktionen und der Performance von Bascom (oder z.B. auch von Arduino) zurecht kommst, dann gibt es nicht viel zu beachten. In der Regel überlegt man sich beim Schaltungsentwurf aber sehr genau, welche µC-Pins und Hardwaremodule man für welche Aufgaben nutzen will/kann/muss. Wenn das Hauptprogramm sonst nichts zu tun hat, kann man ein paar Eingänge ohne zu großen Jitter überwachen und auswerten. Meist wird man aber eher auf eine Timer/Counter Unit oder Pin-Change Interrupts zurückgreifen.

Da ich Bascom nicht kenne, nur eine Vermutung - laut [1] erwartet die von dir genutzte Funktion als zweiten Parameter ein PIN-Register und liefert die Impulsbreite mit eine Auflösung von angeblich 10µs zurück. Anscheinend ist die Auflösung aber konfigurierbar. Es ist anzunehmen, dass da im Hintergrund ein Timer genutzt wird (wie z.B. auch bei millis() oder micros() in der Arduino-Welt) und über Vorteiler und/oder Endwerte entsprechend konfiguriert werden kann (aber immer vom Systemtakt abhängt).

Mit den beiden IF-Statements wird demnach zwischen einem gültigen Servosignal (1-2ms) und Impulsbreiten <1ms unterschieden. Dieser Bereich wird bei vielen Sendern nur bei entsprechender Trimmung und maximalen Servoweg erreicht. Ev. solltest du dein Testsignal zumindest mit einem Servotester, besser noch mit einem Oszilloskop überwachen. Das ist aber ein anderes Thema.

Was dein Programmschnippsel angeht - ohne Schaltplan und genauere Beschreibung, was du eigentlich von deinem Programm erwartest, kann man dir nicht wirklich weiterhelfen. Ich gehe aber sehr stark davon aus, dass zumindest dein Funktionsaufruf

Quellcode

1
Pulsein W , Portb , 7 , 0
nicht korrekt ist, und

Quellcode

1
Pulsein W , PINB , 7 , 0
lauten müsste. Wie kritisch Bascom mit Groß/Kleinschreibung ist, weiß ich allerdings nicht. Bei den mir bekannten Werkzeugen sind Makros immer in Großbuchstaben definiert, d.h. Portb wäre nicht das Register von PORTB aus dem Datenblatt... aber ich komme eher aus der C-Ecke.

[1] https://avrhelp.mcselec.com/index.html?pulsein.htm
mfg Harald

4

Sonntag, 29. Oktober 2017, 09:08

Also ich würde auch die ICP Funktion eines 16 Bit Timers verwenden.
Das dürfte bei 2313 der ICP 1 sein ( Im Datenblatt nach Timer 1 und ICP suchen ).

Dazu würde ich einen Interrupt beim ICP auslösen lassen.
In diesem Interrupt wird das sensing des Pins immer wieder umgestellt.

Der Timer wird mit dem Prozessorttakt und Prescaler 8 ( oder höher ) eingestellt.
Das Sensing wird vorerst auf steigende Flanke ( rising Edge ) eingestellt.
Der ICP Interrupt wird aktiviert.

Kommt nun so ein steigender Impuls am ICP Pin wird der Interrupt ausgelöst.
In der Interruptroutine wird nun das Interrupt Capture Register ausgelesen und in einer Variable abgelegt.
Und das Sensing auf fallende Flanke umgestellt zusätzlich ein Flag gesetzt bzw. gelöscht - wie man will.
Dieses Flag dient dazu auszuwählen, ob die steigende Flanke oder fallende Flanke des Signals dran ist.

Kommt nun vom Fernsteuersender die fallende Flanke wird der Interrupt durch das umgestellte Sensing erneut ausgelöst, das Input Capture Register wird wieder ausgelesen und der vorher ausgelesene Wert ( in der Variable ) davon abgezogen.
Das Ergebnis entspricht der Impulslänge die vom Sender ausgegeben wurde.
Das kann man nur gleich direkt verarbeiten, oder in einer Variable abspeichern.
Das Sensing wird wieder auf steigende Flanke, für den nächsten Impuls umgestellt.

Wurde ein gültiger Wert ermittelt, kann man direkt den gewünschten Portpin in der Interruptroutine setzen oder löschen.
Ein anderer Weg wäre ein weiteres Flag zu setzen und diese Aufgabe in der Hauptschleife anzusiedeln.

Der Hauptvorteil dieser Methode ist, das der Controller nur Rechenzeit verbrät wenn eine Flanke am ICP auftaucht.
Die ICP Interruptroutine sollte - wie alle Interrupts - so kurz wie möglich gehalten werden.
Also umfangreiche Berechnungen sollte man sich sparen.

Übrigens kann man mit dieser Methode auch mehrere Servosignale überwachen, wenn man auch die beiden Interrupt Pins INT0 und INT1 und/oder die Pin Change Interrupts als Eingang benutzt.
Die präziseste Methode ist aber die mit dem ICP, weil da der aktuelle Wert des Timers beim Interrupt automatisch in das Interrupt Capture Register geschrieben wird.
Bei der INTx Methode wird aber das TCNTx Register ausgelesen und das läuft ja mit jedem Prozessortakt / Prescaler weiter.
Wir reden hier von ca. 5 Counts.
Deshalb sollte bei diesen Eingängen das TCNTx Register möglichst früh in der Interruptroutine ausgelesen werden!

Hat der Prozessor 8MHz Takt und stellt man den Prescaler auf /8 erhält man Ergebnisse in µS, also etspräche eine Impulslänge von 1,5ms ( = Servomitte ) dem Wert 1500. Bei höherem bzw. niedrigerem Takt muss man das eben anpassen.

Wie man das Ganze bei BASCOM einstellt kann ich Dir nicht sagen, Ich mach so was in C.
Ich vermute, das Pulsein das Ganze per polling ( ständige Abfrage des Ports ) macht und das belastet den Controller stark.

Hier im Forum gibt's im Elektronik Spezial Bereich auch ein Tutorial für so was.

Noch was, der interne Taktgenerator der AVR Controller ist nicht sehr genau.
Man kann ihn über Kalibrierungsregister kaibrieren, oder gleich einen externen Quarz oder Schwingkristall anschließen.
Die Temperaturdrift bleibt aber!
Für eine Auswertung kurzer, mittlerer, langer Servoimpuls ist auch der interne Oszillator gut genug.
Für genauere Messungen taugt er nicht!

5

Sonntag, 29. Oktober 2017, 21:35

Schon mal danke euch dreien.

Zum Thema Groß/ - Kleinschreibung, Bascom macht das bei den Kommandos alleine, diese haben also gepasst. Pin und Port hab ich auch schon durchgetauscht bevor ich hier geschrieben habe, war sogar anfangs ein Pin.
Das Programm soll erstmal nur ein Servosignal auswerten und dann LED´s schalten. Erstmal möchte ich es schaffen, dass die LED´s eben mit Schalter/Steuerhorn in der einen Richtung an sind und in der anderen aus. Für den Anfang ganz simpel.
Steuern soll das ganze später mal die Beleuchtung meines neuen RC-Cars, aber wie gesagt erstmal muss ich es schaffen das das Impulssignal auch wirklich ausgewertet wird.

Habe heute einige Kodes/Programme die im Internet als funktionierende RC-Schalter zu finden sind probiert - leider ohne Erfolg.
Ich bin echt ratlos. Ist die Spektrum so verkorkst das so unmögliche Impulse ausgegeben werden?
Ich meine so unterschiedlich können die Impulssignale doch nicht sein von Hersteller zu Hersteller, oder?

Vielleicht haben wir hier einen der ein ähnliches Projekt mit einer Spektrum realisiert hat?

Bin euch echt um jeden Tipp dankbar.

hsh

RCLine User

Wohnort: Österreich

  • Nachricht senden

6

Sonntag, 29. Oktober 2017, 22:50

Das hat nichts mit Spektrum zu tun, außer du nutzt einen Satellitenempfänger... Bei Spektrum ist das ein serielles Protokoll, bei den meisten anderen Systemen ein Summensignal oder alternativ ein Bussystem.
Um eine Servoimpuls auszuwerten muss dein Aufbau und Programm in der Lage sein die Flanken zu erkennen und die Impulsdauer zu messen. Wie der Servoimpuls aussieht wurde schon verlinkt, bzw. lässt sich problemlos im Netz finden. Die ca. 50Hz bzw. 20-22ms beziehen sich noch auf die guten alten 35/40MHz Systeme. Bei manchen aktuellen Systemen können/werden Digitalservos auch schneller angesteuert. HOTT kann man z.B. auf 10ms / 100Hz konfigurieren.

Irgendwelche Programmschnippsel aus dem Internet zu porbieren wird dich nicht weiter bringen. Wenn du schon mit Atmel AVR oder Tiny und Bascom gearbeitet hast, dann geh in deinem Aufbau noch einmal den Schritt zurück und überprüfe ob alles passt -> LED blinken lassen, Frequenz kontrollieren, Debug Ausgaben nutzen oder statt dem Seroimpuls einfach einmal 100x langsamer mit einem Taster arbeiten...
Wie du so ein Projekt sauber aufsetzt, hat dir wkrug ja schon perfekt erläutert. Wenn sich deine bisherige Bascom-Erfahrung eher nur aufs flashen von fertigen Programmen beschränkt, solltest du dir vielleicht noch überlegen, zur Arduino-Ecke überzulaufen.

Bitte zeig deinen Schaltplan, Aufbau, Sourcecode und Fehlerbeschreibung in vernünftiger Form, sonst kann man dir nicht wirklich weiterhelfen.
Welche Werkzeuge und Programmer stehen dir zum Testen zur Verfügung (Signalgenerator, Oszi, Servotester, Multimeter,...)?
mfg Harald

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »hsh« (29. Oktober 2017, 23:10)


hsh

RCLine User

Wohnort: Österreich

  • Nachricht senden

7

Sonntag, 29. Oktober 2017, 23:08

Pin und Port hab ich auch schon durchgetauscht bevor ich hier geschrieben habe, war sogar anfangs ein Pin
Es muss auch das PINn Register sein! Mit PORTn kann das nicht funktionieren. Bei deinem µC werden die IOs über die Register PORTn und DDRn konfiguriert und über die PINn-Register kannst du die Pegel der IOs einlesen. Schau dir das bitte im Datenblatt noch einmal durch.
mfg Harald

8

Dienstag, 31. Oktober 2017, 08:51

Zitat

Habe heute einige Kodes/Programme die im Internet als funktionierende RC-Schalter zu finden sind probiert - leider ohne Erfolg.

Wie weiter oben schon beschrieben, hängt das Ganze auch von Prozessortakt ab.
Die Codeschnipsel werden nur funktionieren, wenn dein Controller mit genau dem gleichen Takt arbeitet wie in der ursprünglichen Schaltung, wo der Quellcode herstammt.
( Es sei denn der Programmieren hättes das im ursprünglichen Quellcode berücksichtigt )

Wenn Du nur die Impulslängen auswertest, ist es dem Controller vorerst mal völlig egal, was für eine Wiederholfrequenz ( Pulsrate ) das Signal hat.

Wenn Du der Meinung bist der Empfänger gibt ein "komisches" Signal aus, kannst Du das sehr einfach mit einem Oszilloskop überprüfen.
1...2ms Impuls, 10...24ms Pause wäre Standard.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wkrug« (31. Oktober 2017, 08:56)


9

Sonntag, 19. November 2017, 21:49

Also nach langem probieren rätseln und rechechieren habe ich es geschafft. Schalter ein an der Funke und es blinkt. Jetzt würde ich das ganze gern weiter spinnen und einen Memory Schalter daraus machen. Also Schalter so und so lange in Position ein, dann Programm A. Schalter so und so lang ein, dann Programm B. Und das solang bis der Schalter wieder für den Zeitraum eingeschaltet wird.

Habt ihr Tipps für mich. Bin recht ratlos wie die Befehle lauten müssen. Hoffe ihr könnt mir helfen.

a_rueckert

RCLine User

Wohnort: Kaiserslautern / Germany

Beruf: Software Engineer

  • Nachricht senden

10

Montag, 20. November 2017, 05:40

Du könntest Dein aktuelles Programm zeigen und bekommst evtl Tipps, wie Du es erweitern kannst?

Aber warum nicht gleich so einen richtigen Multiswitch basteln?
Heli: Twister CP V2,Carbooon CP,T-Rex 450 S-CF,CopterX,DF64C
Fläche: Jede Menge Flächenmodelle aus alten Tagen
Futaba FX 18 V2, Robbe Terra Top, Robbe Terra, Turnigy 9x

hsh

RCLine User

Wohnort: Österreich

  • Nachricht senden

11

Montag, 20. November 2017, 22:03

Schön zu hören, dass du drann geblieben bist.
Solche Aufgaben löst man meistens mit einem Zustandsautomat (finite state machine [1]). Du must dir überlegen (skizzieren) welche Bedingungen zu welchen Zuständen führen sollen. In der Hauptschleife fragst du dann einfach deine Bedingungen ab und aktivierst oder konfigurierst deine IOs die deine Schaltfunktionen übernehmen sollen. Du solltest dabei darauf achten, dass die Hauptschleife regelmäßig ausgeführt wird und du deinen Programmabauf nicht irgendwie blockierst. Für einfache Fälle müsstest du mit IF THEN ELSE oder SELECT CASE eigentlich auskommen.
Was hast du im Detail denn noch vor?

[1] https://www.mikrocontroller.net/articles…hine#Einleitung
mfg Harald