Hallo,
um dieses Thema mal wiederzubeleben, hier eine Anleitung wie man (m)eine alternative Software auf die Attiny13V-Lineartreiber bügelt.
Es wird keine Erfahrung in Sachen Microcontroller vorausgesetzt, ein paar Grundkenntnisse für Elektronik-Bastelei (und PC) schaden natürlich nicht...
Ansonsten braucht man kaum mehr als:
- PC mit paralleler Schnittstelle
- ein altes, paralleles Druckerkabel
- etwas Geschick für feine Lötarbeiten, hält sich aber wirklich in Grenzen
- die kostenfreie Demo-Version von
Bascom-AVR
Erst noch kurz und knapp zum Sinn der Sache, offenbar bin ich ja nicht der Einzige, der diese Treiber teils "überfunktioniert" findet, neben Geblinke auch im Memory eher Ärgernis als Nutzen sieht. Außerdem stören mich recht geringe PWM-Frequenzen.
Mein Programm bietet daher folgende Funktionen:
- 2,3 / 19 kHz PWM
- memoryfreie (1) 2 oder 3 Modi *
- Dimmstufen fein einstellbar, extrem niedriges "Low" möglich *
- 2stufiges Unterspannungsverhalten
- gute Ausnutzung der EEPROM-Lebensdauer (wurde hier ja schon thematisiert) >6Mio Wechsel
- * kann später ohne PC mittels "Sternchen" an der Unterseite noch verändert werden.
Wie bereits angedeutet, ist der Programmieradapter im einfachsten Fall lediglich ein profanes Druckerkabel, von dem ein Stecker aufgeschraubt, 5 Leitungen ausgelötet und zum Treiber verlegt werden. Sicherheitshalber empfiehlt sich jedoch zusätzlich ein paar Widerstände (so zwischen 100 bis 500 Ohm) einzusetzen, die machen sich m.E. am besten im Stecker der Gegenseite.
Hier der Schaltplan
(die Buchsenleiste können wir weglassen und direkt an den Treiber gehen)
Die Bezeichnungen findet man auf Seite 2 des
Attiny13-Datenblatt, oder auch in Bascom (View -> Pin Layout).
Dann durchleuchtet man den Treiber von unten (Leiterbahnverlauf) und notiert sich dankbar alle Möglichkeiten nicht direkt an den Pins löten zu müssen. Eine Ausnahme macht da - zumindest beim Layout meiner Version - nur der "Reset", erfreulicherweise der wohl bestzugängliche Pin.
Neben den Datenleitungen braucht der Tiny außerdem noch eine Stromversorgung.
Es gäbe zwar die Möglichkeit den Parallelport auch dafür zu nutzen, würde aber den Aufwand auch nicht gerade vereinfachen. Außerdem braucht man, wenn man später das Ergebnis testen möchte, eh eine andere Spannungsquelle (Akku / Netzteil).
Über den normalen Eingang des Treibers ist eine Spannung zwischen 3 und 6V genehm, notfalls wäre auch denkbar diese z.B. vom Batteriefach einer Fernbedienung mit zwei frischen Alkaline abzugreifen.
Wenn alle Leitungen verlegt sind, sollte es ungefähr so aussehen:
Übrigens, anfangs hätte ich wegen der Peripherie an Board - vor allem dem Spannungsteiler am SCK - evtl. Probleme erwartet, was sich jedoch nicht bestätigt hat.
So, die Hardware-Vorbereitungen soweit abgeschlossen, gehen wir zum Software-Part über.
Nachdem Bascom installiert und gestartet ist, wird ein unbeflecktes Fenster mit meinem Programm becopypastet:
(wenn man vorher auf meinen Beitrag "zitieren" geht und aus dem Fenster dann kopiert, sieht das ein bisschen geordneter aus, hier sind irgendwie die "Space-Zeichen" verloren gegangen)
$regfile = "attiny13.DAT"
$crystal = 4800000
$hwstack = 32
$swstack = 8
$framesize = 16
Portb = &B00111001
Tccr0a = &B00100011
Tccr0b.1 = 1 '<- 2,3kHz, für 19kHz ersetzen durch: TCCR0B.0 = 1
Admux = &B01000001 'ADC
Adcsra = &B11000110 '/ADC
Dim U1adc As Word
Dim U2adc As Word
Dim Index As Byte
Dim Count As Byte
Dim Modul As Word
'*********************
If Mcusr.0 = 0 Then
Powerdown
Else
Mcusr.0 = 0
End If
Waitms 100
Readeeprom Index , 63
Modul = Index.7
Reset Index.7
If 62 < Index Then
Index = Modul
Goto Init
End If
Readeeprom Count , Index
Incr Count
If Count = 0 Then
Init:
Incr Index
Count = Modul
Writeeeprom Count , Index
Index.7 = Modul
Writeeeprom Index , 63
Else
Writeeeprom Count , Index
End If
'****************************
Modul = Modul + 2
Index = Count Mod Modul
Count = 255
If Index = 0 Then
Readeeprom Count , 0
End If
If Modul = 3 Then
If Index = 1 Then
Readeeprom Count , 1
End If
End If
'************************
U1adc = 1000
Ddrb.1 = 1
Ocr0b = Count
Do
If Pinb.3 = 0 Then
Count = Count - 1
Gosub Flash
Writeeeprom Count , Index
End If
If Pinb.4 = 0 Then
Count = Count + 16
Gosub Flash
Writeeeprom Count , Index
End If
If Pinb.0 = 0 Then
Readeeprom Count , 63
Toggle Count.7
Gosub Flash
Bitwait Pinb.0 , Set
Writeeeprom Count , 63
Wait 1
End If
Waitms 50 'ADC
U2adc = U1adc
Shift U1adc , Left , 5
U1adc = U1adc - U2adc
U1adc = U1adc + Getadc(1)
Shift U1adc , Right , 5
If U1adc < 470 Then '<- 2,8V (470 / 1024 * 1,1 / 3 * 13 + 0,6)
Gosub Flash
Decr Count
If Count = 0 Then
Ddrb.1 = 0
Powerdown
End If
Elseif U1adc < 550 Then '<- 3,2V (550 / ...)
If Modul < 4 Then
Gosub Flash
Gosub Flash
Gosub Flash
End If
Modul = Modul + 64 '<- 51s Blink-Abstand (65536 / [<-Teiler] * 0,05)
End If '/ADC
Loop
'*********************
Flash:
Ocr0b = 0
Waitms 30
Ocr0b = Count
Waitms 400
Return
End
'******************************************************
Die Voreinstellungen bei Bascom habe ich nicht mehr 100%ig im Kopf, meine jedoch kaum etwas verstellt zu haben, was hier von besonderer Bedeutung wäre.
Mal unter Options->Programmer schauen, ob der "Sample Electronics Programmer" gewählt ist. Dort ein Häkchen bei Auto Verify und Erase Warning, der Rest ohne.
Die Parallelport-Einstellungen (378, Delay 0) blieben bei mir unverändert.
Per "Compile"-Button wird das Programm in eine Chip-gerechte Sprache übersetzt.
Das Treiber-Kabel-Gewirr angeschlossen (optimalerweise bereits vorm Rechner-Start) und stromversorgt, sollte ein Klick auf "Program Chip" den "Sample Electronics Programmer" ohne Fehlermeldungen starten und dieser automatisch einen "Attiny13" erkennen.
Im Programmer werden Aktionen i.d.R. ohne Nachfrage durchgeführt, dementsprechend vorsichtig muss man agieren. Das gilt besonders für den Reiter den wir uns gleich als Erstes anschauen, die "Lock and Fuse Bits".
Nun ist da ja noch ein Programm auf dem Chip, welches man sich vielleicht gern sichern würde, aber solange das Lockbit 21 nicht auf "11:No memory lock..." steht, kann man sich das laut Programmer trotzdem mögliche Lesen des "ROM" - und damit eine Datei voller Datenmüll - gleich sparen.
Der Chip kann nun gelöscht werden: "Erase chip(flash ROM and EEPROM)"
Wieder zurück zum Reiter Fuse Bits, mit der besonderen Vorsicht ist gemeint, daß man sich dort mit falschen Einstellungen (z.B. Ändern von "High 3") vom Chip aussperrt, also mit dem Parallel-Programmer keinen Zugriff mehr bekommt. Die Bits sind entsprechend der folgenden Abgebildung ggf. zu ändern und werden erst übertragen sobald man die "Write FS(H)" Buttons anklickt.
Anschließend wird der Chip mit dem Programm beschrieben, welches der Reiter "FlashROM" bereit hält und mittels "Write buffer to flash ROM" überträgt. Bei mir gab es da hin und wieder Übertragungsfehler ala "Difference at ..." (möglicherweise funkt die Peripherie ja doch ein wenig dazwischen), aber spätestens nach ein paar Anläufen war es dann immer fehlerfrei drin.
Als vorerst letzten Schritt, verpassen wir dem (Reiter) EEPROM, wo lauter "FF" stehen sollten (ansonsten: "Clear buffer"), halbwegs sinnvolle Werte für die beiden Dimmstufen. Dazu kommt ins 1. Feld (00,00) der Wert 09 und ins 2. (00,01) der Wert 32, anklicken->tippen->Enter, gefolgt vom "Write buffer to EEPROM"-Button.
Im Prinzip wäre die Sache nun soweit fertig, bevor man den Treiber wieder von der Verkabelung befreit, wäre aber ratsam mit einen kleinen Testaufbau zumindest ein paar Grundfunktionen zu prüfen. Zum Praxis-Test mit LED muss das Kabel vom PC getrennt sein. Der Parallelport ist eigentlich nicht zum An- und Abstecken bei laufenden Rechner gedacht, dessen Missachtung gelang mir zwar bislang ungestraft, eine Empfehlung möchte ich jedoch nicht daraus machen.
Der Treiber sollte nun mit der gewohnten Stromunterbrechungs-Prozedur drei deutlich unterschiedliche Modi nacheinander durchschalten.
Die mit PB3, PB4 und PB0 bezeichneten Pins führen jeweils zu offenen Lötbrücken, sowie Durchkontaktierungen an die Unterseite, teilweise als Sterne ausgeführt. Durch temporären Masseschluss dieser Pins ändert man die Helligkeit des jeweiligen Modus (ausgenommen High). PB4 durchläuft in 16 gröberen Schritten vorwärts die 256 Werte, PB3 macht die Feinabstimmung rückwärts.
Mit PB0 schaltet man (ebenso mittels "Antippen" einer Brücke, nicht zum dauerhaften Masseschluss gedacht!) den Treiber zwischen 2 und 3 Modi um. Die Helligkeit ändert sich bei wiederholten Schluss in zwei Stufen, welche keinerlei weitere Bedeutung haben, als den aktuellen Stand anzuzeigen: dunkler = 2, heller = 3.
Die Werte werden immer sofort gespeichert, die Modi können zum Vergleich durchgeschaltet werden.
Das Sternchen-Gefummel ist natürlich mehr Notbehelf als "UI", damit man später nicht nochmal an den PC muss. Vielleicht bekommt man es ja mit etwas chirurgischen Geschick auch ohne Zerlegen der Lampe hin.
Falls man über eine stufenlos regelbare Spannungsquelle verfügt, kann man gleich noch die Funktion bei Unterspannung testen.
Mit dem 10k-3k Spannungsteiler, der - soweit ich bei den häufig ändernden Layouts noch Überblick habe - immer mit diesen Werten verbaut ist (Aufdruck 103 und 302), sollte sich die Funktion wie folgt darstellen:
Stufe1: <3,2V LED blinkt in (umfangreich wählbaren) Abständen dreimal kurz.
Stufe2: <2,8V LED blinkt dauerhaft und wird dabei pro halbsekündlichen Blinker um je eine der max. 255 Stufen dunkler, demzufolge nach spätestens 2 Minuten = aus, Tiny geht schlafen.
Wo man recht einfach selbst Anpassungen im Programm vornehmen kann, ist an den entsprechenden Stellen mit Rechenformel kommentiert.
Zum ADC (Spannungssensor mit Umrechnung in digitale Werte) ist noch zu erwähnen, daß es mir zumindest auf Software-Ebene nicht gelungen ist, eine akzeptable Genauigkeit zu erreichen, sobald das PWM Richtung zweistellige kHz geht. Ich meine so ziemlich alles was das Datenblatt hergab probiert zu haben, die Schwellen drifteten je nach Tastgrad bis 0,3V drunter oder drüber...
Daher ist zwischen folgenden Möglichkeiten zu entscheiden:
- (Standardeinstellung) Beschränkung auf 2,3kHz, da sind keine nennenswerten Abweichungen feststellbar und das PWM ist auch bereits recht harmonisch, man muss den Blick schon extrem schnell bewegen, um noch ansatzweise "Punkt-Linien" der Lichtquelle wahrzunehmen.
- [EDIT] Kondensator-Methode war leider ein Fehlschluss, funktioniert in keinster Weise
- die gekennzeichneten ADC-Parts im Programm entfernen und sich auf den Helligkeitseindruck verlassen, eine Not-Abschaltung bei 2,4V hat man trotzdem noch - für Li-Ion allerdings schon recht ungesund, man sollte es im Normalfall früher wahrnehmen und reagieren.
So, ich hoffe nichts Wichtiges vergessen zu haben und daß jemand damit was anfangen kann, Fragen oder sonstiges Feedback sind natürlich jederzeit willkommen.