Mostfun

Unverhofft kommt ja bekanntermaßen oft... Beim Rumprobieren mit dem reparierten Optotronix-Modul habe ich es dann doch noch geschafft, das Modul verkehrt herum anzustecken. Das Ergebnis war, dass das Modul wieder keinen Mucks mehr machte. Wieder ein Blick in die Bedienungsanleitung brachte die Erklärung: Das Pro Control ist nicht verpolsicher und wird beim Verpolen defekt.

 

Diesmal war es der Mikroprozessor (ATTiny45) der durchgebrannt war. Meine Frustration war entsprechend groß, denn der ca. 1EUR teure Käfer läßt sich wegen der enthaltenen Software nicht so leicht ersetzen wie der Treiberbaustein bei der ersten Reparatur (Optotonix Pro Control reparieren Teil1). Die Pro Control ist neu nicht mehr zu erwerben, und die Nachfolger geben entweder nur 5V-Schaltsignale raus oder sind noch einmal deutlich teurer.

Das war nun der Zeitpunkt wo ich das AVR-Studio (Link) herunter geladen, und meine C-Kenntisse wieder etwas aufgefrischt habe.

 

Der Programmieradapter

Es musste ein SMD SO8 Programmieradapter her (dachte ich, mehr dazu später), ein neuer Prozessor und ein passendes Programm.

Leider gibt es ersteres für Privatpersonen nicht so einfach zu kaufen, und wenn doch, dann zu horrenden Preisen. Aus der Zeit bei meiner Arbeit bei Delphi habe ich mich an die Nadelbettadapter-Nadeln in der Fertigung erinnert. Diese sind fein genug um die Beinchen zu kontaktieren, sind vergoldet und federn mechanische Toleranzen weg. Allerdings sind diese Nadelbettadapternadeln auch nicht leicht zu bekommen. Bei Conrad-Elelktronik bin ich aber fündig geworden.

Hier gibt es unter der Bestellnummer 736944 Präzisionsprüftifte (die korrekte Bezeichnung) die gut geeignet sind - nicht ganz billig aber funktional. Für den Adapter benötigt man 6 Stück davon. Außerdem braucht man zwei drei Leiterplattenabschnitte von einer Experimentierplatine im Rastermaß 1,27mm.

 

Auf den Leiterplattenabschnitten werden die Löcher für die Prüfstifte passend aufgebohrt, damit diese durch die Platine gesteckt werden können.

 Auf eine Leiterpatte habe ich etwas Depron geklebt. Dieses Stück dient als mechanische Schablone damit die Prüfstifte besser ausgerichtet werden können.

Die Prüfstifte werden nun durch die beiden ersten Leiterplatten gesteckt.

Das Zählschema für den Adapter sieht so aus (DIL-Zählweise):

7 6 5
1 2

WICHTIG: Die Positionen 2 und 3 werden nicht mit Prüfstiften bestückt!!!

Auch wichtig ist, das die zweite Leiterplatte mindestens noch einen Millimeter Sicherheitsabstand zu den federnden Spitzen der Prüfstifte hat. Ich hatte beim ersten Versuch das Problem, dass beim Löten Lötzinn in den Spalt zum federnden Teil floss. Dann sind die Stifte defekt. Das ganze wird dann mit den Spitzen in die dritte Platine eingefädelt (die mit dem Depron). Das ganze wird auf eine gerade Fläche aufgesetzt und dann alle Stifte einmal unter Druck gesetzt und dann wieder losgelassen. Dann sollten die Spitzen der Prüfstifte durch das Depron und durch die dritte Leiterplatte einen gleichmäßigen Abstand zu der geraden Fläche haben. Die Stifte können nun vorsichtig mit wenig Lötzinn mit den ersten beiden Leiterplatten verlötet werden.

Auf der oberen Leiterplatte werden nun Kabel angelötet. Auch das ist eine sehr filigrane Arbeit. Ich benutze dafür gerne farbige Flachbandleitungen, die bergen weniger Verwechslungsgefahr und bei der Dokumentation ist es durch die Farben auch einfacher, das Kabel zu verfolgen.

Auf der anderen Seite des Kabels wird eine 6polige Stiftleiste, Rastermaß 2,54mm zweireihig angelötet.

Das Zählschema bei der Stiftleiste sieht so aus:

 1
 2  4  6

Traditionell wird der Pin 1 irgendwie markiert (Folienstift, Punkt).

Auf dem SO8-Adapter wird der Pin 1 auch mit einem Punkt markiert.

 

Das Lötschema sieht so aus:

Stiftleiste
Pin
Kabel
Farbe
SO8
Pin
Bedeutung
ISP
 1 braun   MISO
 2  rot  8  VCC
 3  orange  7  SCK
 4  gelb  5  MOSI
 5  grün  1  /RESET
 6  blau  4  GND

Dieser Adapter kann mit den handelsüblichen Programmierern von Atmel zusammengesteckt werden. Ich benutze ein JTAG3. Das Aufsetzen der Nadeln auf die Pins erfordert etwas Übung, aber es geht. Damit kann jetzt der Prozessor in der Schaltung programmiert werden.  Nachfolgend noch die Belegung der Prozessorpins in Relation zu den Ausgängen und dem Empfänger-Eingang (Servo_In):

 

 

 

 

 

 

Das  Programm ist als "Rahmen" zu verstehen. Wenn man etwas anderes haben möchte, als das Programm macht, sollte es mit dem Programm einfacher zu realisieren sein.

Am Anfang war wo was wie ein Anforderungskatalog. Das Programm soll folgende Eigenschaften haben:

Steuerung von 4 Ausgängen, kompatibel zum Pro Control (wegen festgelegtem Platinenlayout)

Eingang für einen Servo-Kanal zur Beeinflussung der Lichtshow mit dem Sender während des Fluges

Jeder Kanal hat folgende Funktionsmöglichkeiten: Aus, An, Blinker, Blitzer, Doppelblitz, Doppelblitz mit Nachzünden, Dreifachblitz

Abgrenzungskriterien:

Das Programm ist nicht über den Servo-Kanal programmierbar, sondern nur über das Programm

Das Programm ist nicht perfekt aber es geht.

 

Hier ist das Projekt als Source (ProControlRep2Source.zip).

 (Herunterladen mit rechter Maustaste und dann "Ziel speichern unter")

 

Generelle Hinweise

Der Code hat 1588 Byte Programmspeicher und 142 Byte RAM. Der EEPROM wird zwar initialisiert, aber nicht benutzt. Entsprechende Codestellen können auch auskommentiert werden.

WICHTIG: Beim Programmieren des Prozessors ist unbedingt darauf zu achten, dass die "FUSE" für die Taktteilung "CKDIV8" deaktiviert werden muss, sonst läuft alles den Faktor 8 langsamer ab.

 

Hinweise zur HEX-Variante

In der "HEX"-Variante hat das Modul einen Dreifachblitz, einen Landescheinwerfer (auch Positionslichter), einen Doppelblitz und einen Einfachblitzt an den Ausgängen nutzbar.

Funktion   Effekt  CPU-Pin Modulausgang 
 1 Dreifachblitz  PB0  CH3
 2 Landescheinwerfer  PB1  CH2
 3 Positionslichter  PB2  CH1
 4 Einfachblitz  PB3  CH4

Der Empfängereingang beeinflußt die Effekte so:

 

PWM Ausgang  Dreifachblitz  Landescheinwerfer Positionslichter  Einfachblitz 
kein Anschluß ein ein ein ein
<33%  aus aus   aus  aus
<66%  ein  aus  aus  aus
 >66%  ein  ein  ein  ein

Die Überlegung war die, dass es möglich sein muss alle Beleuchtung auszuschalten (Stromsparen) und dass ohne die Fahrtwindkühlung während eines Bodenaufenthaltes die dauernd leuchtenden LEDs sehr heiß werden könnten und deshalb nach der Landung/vor dem Start diese abschaltbar sein sollten.

 

------------------------------------------------------------------------

Der Source-Code

Hinweise für alle, die den Code ändern wollen:

Das Verhalten des Moduls ist an drei Stellen eingestellt: 1. Definitionsteil, 2. Funktion "LED_init" und dem Hauptprogrammteil.

1. Definitionsteil:

Festlegung für das System:
#define
LED_max4//Anzahl der LED-Kanäle
#definePWM_max1//Anzahl der PWMs
#definePWM_software1//Flag, dass die PWM ohne Hardwareunterstützung ausgewertet wird (ist ungenauer, aber es wird keine Hardware benötigt)
#defineFlash_max3 //Es werden maximal Dreifachblitzer benötigt (jeder Blitz ist frei definierbar)

 

Hier wird nun der ganze Zeitrahmen festgelegt:
#define
Clock_Speed8000000//8MHz CPU-Frequenz
#defineZyklus_Interrupt240//Abtastrate 30us/33,3kHz --->Wie schnell die PWM abgetastet wird
#defineblinktimer_max0x0040//tmin=3,7ms, Fmax=133Hz --->Wie kurz ein Blitz sein kann, hier 3,7ms

Pinbelegung:
#define
port_PWM14 //Bedeutet hier z.B. die PWM1 ist mit PB4 verbunden.
#defineport_PWM24
#defineport_LED10
#defineport_LED21
#defineport_LED32
#defineport_LED43


2. LED_init(void)-Teil

index=0; //hier wird die LED0 angesprochen
//ACL-Dreifachblitz
LED[index].Funktion=2;// Durchlaufen der Timing-Sequenzen, d.h. Blinken, Blitzen. eine "0" schaltet die LED aus, eine "1" erzeugt Dauerlicht.
LED[index].Port_pin=port_LED1;//Zuweisen des Ausgangspins
LED[index].State=0;//Rücksetzen der State-Machine. Hier können Blitzer synchronisiert oder de-synchronisiert werden, wenn das Timing gleich ist.
//folgende Angaben definieren die Blink/Blitzfunktion:
LED[index].Timing[0].time_cnt=0;
LED[index].Timing[0].time_max=540;//Off 540*3,7ms=1998ms
LED[index].Timing[1].time_cnt=0;
LED[index].Timing[1].time_max=30;//On 30*3,7ms=111ms
LED[index].Timing[2].time_cnt=0;
LED[index].Timing[2].time_max=120;//Off
LED[index].Timing[3].time_cnt=0;
LED[index].Timing[3].time_max=20;//On
LED[index].Timing[4].time_cnt=0;
LED[index].Timing[4].time_max=60;//Off
LED[index].Timing[5].time_cnt=0;
LED[index].Timing[5].time_max=10;//On

Die LED macht also erst einmal 2s Pause, Blitzt dann für 111ms und so fort. Mit dem Timing kann nun auch die Einschaltdauer berechnet werden: (30+20+10)*3,7ms=222ms. Die Aus-Zeit ist dagegen 720*3,7ms=2664ms. Das Impuls/Pause-Verhältnis ist damit 1/12, das bedeutet, gegenüber einer dauernd leuchtenden LED verbraucht der Blitzer 1/12 der Leistung und die LED wird auch nur 1/12 so heiß. Bei gleichen Verhältnissen können damit (Datenblatt beachten) 12mal höhere Ströme ohne/mit schlechtem Kühlkörper verarbeitet werden. Das ist eine gute Nachricht.

 

3. Hauptprogramm

Da alle Funktionen Interrupt-getrieben im Hintergrund ablaufen, stellt das Hauptprogramm lediglich die Funktionen der LEDs in Abhängigkeit zum PWM-Eingang um.

Mit etwas Elan/Fleiß könnte auch dies im Hintergrund passieren. Nachfolgend ein Code-Schnipsel, aus dem sich die ganze Logik ableitet:

 

if(PWM[0].Tick_value>0x37)//wenn  die PWM größer als Hex(37)=55*30us=1650us=1,65ms ist, was 65% PWM entspricht, dann:
            {LED[0].Funktion=2;//LED1 blitzen
            
LED[1].Funktion=1;//LED2 einschalten
            
LED[2].Funktion=1;//LED3 einschalten
            
LED[3].Funktion=2;//LED4 blitzen
            
}

Der Hintergrund sei vielleicht noch erwähnt: Das PWM-Signal das aus dem Empfänger kommt hat eine Einschaltdauer von 1ms...2ms, wobei die (Knüppel-)mitte 1,5ms ist. die 1,65ms die gemessen wurden müssen also erst einmal mit dem Minialbetrag von 1ms subtrahiert werden. Es bleiben 0,65ms in einem Bereich von (2ms-1ms=)1ms. Das sind 65% vom Knüppelausschlag. 

Programmieradapter, Nachtrag

Nun noch einmal zum Programmieradapter und dessen Nützlichkeit. Ich habe das Teil nun schon einige male in Betrieb gehabt und ziehe nun folgendes Resumee: Der Adapter ist in dieser Form schwer anzuwenden und auch schwer zu fertigen. Wer nur einen oder wenige Prozessoren programmieren muss dem sei geraten, entweder mit Fädeldraht an den Prozessor zu gehen (für die Dauer der Programmierung) oder, falls Platz ist einen Stecker vorzusehen.

Die ISP-Schnittstelle wird nur ein einziges Mal benötigt, um die Fuses richtig einzustellen und gegebenenfalls auf den Modus "Debug-Wire" umzustellen. Im "Debug-Wire"-Modus kann der Prozessor mit drei Anschlüssen Vcc, RESET und GND programmiert werden. Zwei der Anschlüsse sind normalerweise ohnehin gut verfügbar: die Versorgungsspannung und die Masse. Was bleibt ist der RESET, was den Umgang deutlich einfacher macht.

 

Fazit:

Die Reparatur hat gut funktioniert, mein Nachtschwärmer läuft wie früher.