Why I did bother building my own blinkenlights

It is always unpleasant, if you have to write-off your car after an accident. But still not as severe as it had been twenty years ago – the crumple zone did it’s job. Nobody was hurt.

In memoriam of this over the top „Pampers Bomber“ (the pram was too big for a 3 series – and the V8 powered 545i Touring was just available for a reasonable price… ^^ ) some pics of the car and the LPG-system, which allowed me to consider buying it at all, before getting to what I kept of it:

2011-03-30_18-25-21_815 CIMG40672011-06-20_08-32-04_66

SANY4704 DSCN5914

CIMG3984    DSCN5913

CIMG3983  CIMG3977

BTW: She-who-must-be-obeyed ordered me to buy „exactly that again“, so the successor became an E61 535d Touring. That one was sold this year, after it’s 10th birthday (and after I fixed the intake manifold by removing the swirl flaps – but that’s a different story).

…and now -finally- for the light guide and the badge I kept.

This is a PIC10F206 outputting three PWM-signals (from code) to the three colors of a Seoul Semiconductor SSC-SFT825N-S. They overlap, so the colors mix.

The other parts are just reverse polarity protection, a capacitor, a switch and and three NPN bipolar transistors to push a bit more current through the LEDs than the output buffers of the microcontroller could on their own. The „corona ring“ is normally illuminated by a 12V 10W bulb, but the multi-color-LED did fit just fine into the „angel eye“.

CIMG5118 CIMG5103

CIMG5106 CIMG5105

05 

It still stands at the window and glows while we watch TV in the evening.

(Original post: http://www.metalforum-owl.de/viewtopic.php?f=21&t=138&start=100#p41799, October 19th 2011)

Here is the Assembler code:

;**********************************************************************
; This file is a basic code template for assembly code generation *
; on the PIC10F206. This file contains the basic code *
; building blocks to build upon. *F
; *
; Refer to the MPASM User's Guide for additional information on *
; features of the assembler (Document DS33014). *
; *
; Refer to the respective PIC data sheet for additional *
; information on the instruction set. *
; *
;**********************************************************************
; *
; Filename: Farbwechsel.asm *
; Date: 13.10.2011 *
; File Version: 0.1 *
; *
; Author: Jan Beckendorf *
; Company: Martin Lehmann GmbH *
; *
; *
;**********************************************************************
; *
; Files Required: P10F206.INC *
; *
;**********************************************************************
; *
; Notes: *
; *
;**********************************************************************list p=10F206 ; list directive to define processor
#include ; processor specific variable definitions__CONFIG _MCLRE_ON & _CP_OFF & _WDT_OFF
; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.;************************************
; Konstanten *
;************************************
DURCHLAUF EQU D'50'
;************************************
; Variablen *
;************************************
CNT1 EQU 10h
CNT2 EQU 11h
CNT3 EQU 12h
ALT EQU 13h
NEU EQU 14h
ZUSTAND EQU 15h;**********************************************************************ORG 0x1FF ; processor reset vector; Internal RC calibration value is placed at location 0x1FF by Microchip
; as a movlw k, where the k is a literal value.ORG 0x000 ; coding begins here
MOVWF OSCCAL ; update register with factory cal value
GOTO INIT

FILL (GOTO INIT), 0x0A ; „INIT-Slide“

;************************************
; Initialisierung *
;************************************

INIT
; CLRWDT ; Watchdog zurücksetzen
MOVLW B’11001111′ ; Timer an internen Oszillator
OPTION ; Prescaler => Watchdog (Timer ohne Scaler), 1:128
MOVLW B’11110011′
MOVWF CMCON0 ; CMP aus
CLRF GPIO ; Port-Register setzen
MOVLW B’11111111′
TRIS GPIO ; GPIO = hohe Impedanz
MOVLW B’11111011′
MOVWF ALT
MOVLW B’11111110′
MOVWF NEU
CLRF ZUSTAND

GOTO MAIN

FILL (GOTO INIT), 0x0A ; „INIT-Slide“

;************************************
; Jump-Table für Unterprogramme *
;************************************

ZEHN GOTO HIGH_ZEHN
ZWANZIG GOTO HIGH_ZWANZIG
DREISSIG GOTO HIGH_DREISSIG
VIERZIG GOTO HIGH_VIERZIG
FUENFZIG GOTO HIGH_FUENFZIG
SECHZIG GOTO HIGH_SECHZIG
SIEBZIG GOTO HIGH_SIEBZIG
ACHTZIG GOTO HIGH_ACHTZIG
NEUNZIG GOTO HIGH_NEUNZIG

FILL (GOTO INIT), 0x0A ; „INIT-Slide“

;*************************************
;* Hauptprogramm *
;*************************************

MAIN
NOP
CLRF GPIO

; Umschalten der Farbe: Zustandsautomat
MOVF ZUSTAND, W
ADDWF PCL, F
GOTO ZUST_1
GOTO ZUST_2
GOTO ZUST_3
GOTO ZUST_4
GOTO ZUST_5
GOTO ZUST_6
GOTO ZUST_7
GOTO ZUST_8
GOTO ZUST_9
GOTO ZUST_10
GOTO ZUST_11
GOTO ZUST_12
GOTO ZUST_13
GOTO ZUST_14
FILL (GOTO INIT), 0x0A ; „INIT-Slide“

ZUST_1 ; (Wieder) rot leuchten
MOVF NEU, W
TRIS GPIO

CALL DEL_19BIT

INCF ZUSTAND, F
GOTO MAIN

ZUST_2 ; Übergang auf gelbes Licht
MOVF NEU, W
MOVWF ALT
MOVLW B’11111100′
TRIS GPIO
MOVWF NEU

CALL ZEHN
CALL ZWANZIG
CALL DREISSIG
CALL VIERZIG
CALL FUENFZIG
CALL SECHZIG
CALL SIEBZIG
CALL ACHTZIG
CALL NEUNZIG

INCF ZUSTAND, F
GOTO MAIN

ZUST_3 ; Gelb leuchten
MOVF NEU, W
TRIS GPIO

CALL DEL_19BIT

INCF ZUSTAND, F
GOTO MAIN

ZUST_4 ; Übergang auf grünes Licht
MOVF NEU, W
MOVWF ALT
MOVLW B’11111101′
TRIS GPIO
MOVWF NEU

CALL ZEHN
CALL ZWANZIG
CALL DREISSIG
CALL VIERZIG
CALL FUENFZIG
CALL SECHZIG
CALL SIEBZIG
CALL ACHTZIG
CALL NEUNZIG

INCF ZUSTAND, F
GOTO MAIN

ZUST_5 ; Grün leuchten
MOVF NEU, W
TRIS GPIO

CALL DEL_19BIT

INCF ZUSTAND, F
GOTO MAIN

ZUST_6 ; Übergang auf türkises Licht
MOVF NEU, W
MOVWF ALT
MOVLW B’11111001′
TRIS GPIO
MOVWF NEU

CALL ZEHN
CALL ZWANZIG
CALL DREISSIG
CALL VIERZIG
CALL FUENFZIG
CALL SECHZIG
CALL SIEBZIG
CALL ACHTZIG
CALL NEUNZIG

INCF ZUSTAND, F
GOTO MAIN

ZUST_7 ; Türkis leuchten
MOVF NEU, W
TRIS GPIO

CALL DEL_19BIT

INCF ZUSTAND, F
GOTO MAIN

ZUST_8 ; Übergang auf blaues Licht
MOVF NEU, W
MOVWF ALT
MOVLW B’11111011′
TRIS GPIO
MOVWF NEU

CALL ZEHN
CALL ZWANZIG
CALL DREISSIG
CALL VIERZIG
CALL FUENFZIG
CALL SECHZIG
CALL SIEBZIG
CALL ACHTZIG
CALL NEUNZIG

INCF ZUSTAND, F
GOTO MAIN

ZUST_9 ; Blaue leuchten
MOVF NEU, W
TRIS GPIO

CALL DEL_19BIT

INCF ZUSTAND, F
GOTO MAIN

ZUST_10 ; Übergang auf weißes Licht
MOVF NEU, W
MOVWF ALT
MOVLW B’11111000′
TRIS GPIO
MOVWF NEU

CALL ZEHN
CALL ZWANZIG
CALL DREISSIG
CALL VIERZIG
CALL FUENFZIG
CALL SECHZIG
CALL SIEBZIG
CALL ACHTZIG
CALL NEUNZIG

INCF ZUSTAND, F
GOTO MAIN

ZUST_11 ; Weiß leuchten
MOVF NEU, W
TRIS GPIO

CALL DEL_19BIT

INCF ZUSTAND, F
GOTO MAIN

ZUST_12 ; Übergang auf purpurnes Licht
MOVF NEU, W
MOVWF ALT
MOVLW B’11111010′
TRIS GPIO
MOVWF NEU

CALL ZEHN
CALL ZWANZIG
CALL DREISSIG
CALL VIERZIG
CALL FUENFZIG
CALL SECHZIG
CALL SIEBZIG
CALL ACHTZIG
CALL NEUNZIG

INCF ZUSTAND, F
GOTO MAIN

ZUST_13 ; Purpur leuchten
MOVF NEU, W
TRIS GPIO

CALL DEL_19BIT

INCF ZUSTAND, F
GOTO MAIN

ZUST_14 ; Übergang auf rotes Licht
MOVF NEU, W
MOVWF ALT
MOVLW B’11111110′
TRIS GPIO
MOVWF NEU

CALL ZEHN
CALL ZWANZIG
CALL DREISSIG
CALL VIERZIG
CALL FUENFZIG
CALL SECHZIG
CALL SIEBZIG
CALL ACHTZIG
CALL NEUNZIG

; „INCF“ => Neuinitialisierung, „CLRF“ zu neuem Durchlauf
INCF ZUSTAND, F
; CLRF ZUSTAND
GOTO MAIN

FILL (GOTO INIT), 0x0A ; „INIT-Slide“

;*************************************
;* Unterprogramme *
;*************************************

DEL_8BIT
MOVLW B’11111111′ ;RAM-Zellen (Zählvar.) füllen
MOVWF CNT1 ;0b11111111 = 0xFF = 255
D8_WAIT
DECFSZ CNT1, F ;RAM 0x10 Herunterzählen auf 0
GOTO D8_WAIT ;Bei 0:
RETLW B’00000000′

DEL_19BIT
MOVLW B’11111111′
MOVWF CNT1
MOVWF CNT2
MOVLW B’00001111′ ; 10 min statt 5 min Wartezeit!
MOVWF CNT3 ; => ca. 1,375s, da Zählschleife!
CNT_19BIT
DECFSZ CNT1, F ;RAM 10 Herunterzählen auf 0
GOTO CNT_19BIT ;Bei 0:

MOVLW B’11111111′ ;RAM-Zelle 10 wieder füllen,
MOVWF CNT1
DECFSZ CNT2, F ;RAM-Zelle 11 dekrementieren,
GOTO CNT_19BIT ;Bei 0:
; CLRWDT
MOVLW B’11111111′ ;RAM-Zelle 11 wieder füllen,
MOVWF CNT2
DECFSZ CNT3, F ;RAM-Zelle 12 dekrementieren,
GOTO CNT_19BIT ;Bei 0

RETLW B’00000000′

HIGH_ZEHN
CLRF CNT2
EINS_CNT
CALL DEL_8BIT
MOVF ALT, W
TRIS GPIO
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF NEU, W
TRIS GPIO

INCF CNT2, F
MOVLW DURCHLAUF
SUBWF CNT2, W
BTFSS STATUS, C
GOTO EINS_CNT

RETLW B’00000000′

HIGH_ZWANZIG
CLRF CNT2
ZWEI_CNT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF ALT, W
TRIS GPIO
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF NEU, W
TRIS GPIO

INCF CNT2, F
MOVLW DURCHLAUF
SUBWF CNT2, W
BTFSS STATUS, C
GOTO ZWEI_CNT

RETLW B’00000000′

HIGH_DREISSIG
CLRF CNT2
DREI_CNT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF ALT, W
TRIS GPIO
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF NEU, W
TRIS GPIO

INCF CNT2, F
MOVLW DURCHLAUF
SUBWF CNT2, W
BTFSS STATUS, C
GOTO DREI_CNT

RETLW B’00000000′

HIGH_VIERZIG
CLRF CNT2
VIER_CNT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF ALT, W
TRIS GPIO
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF NEU, W
TRIS GPIO

INCF CNT2, F
MOVLW DURCHLAUF
SUBWF CNT2, W
BTFSS STATUS, C
GOTO VIER_CNT

RETLW B’00000000′

HIGH_FUENFZIG
CLRF CNT2
FUENF_CNT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF ALT, W
TRIS GPIO
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF NEU, W
TRIS GPIO

INCF CNT2, F
MOVLW DURCHLAUF
SUBWF CNT2, W
BTFSS STATUS, C
GOTO FUENF_CNT

RETLW B’00000000′

HIGH_SECHZIG
CLRF CNT2
SECHS_CNT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF ALT, W
TRIS GPIO
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF NEU, W
TRIS GPIO

INCF CNT2, F
MOVLW DURCHLAUF
SUBWF CNT2, W
BTFSS STATUS, C
GOTO SECHS_CNT

RETLW B’00000000′

HIGH_SIEBZIG
CLRF CNT2
SIEBEN_CNT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF ALT, W
TRIS GPIO
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF NEU, W
TRIS GPIO

INCF CNT2, F
MOVLW DURCHLAUF
SUBWF CNT2, W
BTFSS STATUS, C
GOTO SIEBEN_CNT

RETLW B’00000000′

HIGH_ACHTZIG
CLRF CNT2
ACHT_CNT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF ALT, W
TRIS GPIO
CALL DEL_8BIT
CALL DEL_8BIT
MOVF NEU, W
TRIS GPIO

INCF CNT2, F
MOVLW DURCHLAUF
SUBWF CNT2, W
BTFSS STATUS, C
GOTO ACHT_CNT

RETLW B’00000000′

HIGH_NEUNZIG
CLRF CNT2
NEUN_CNT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
CALL DEL_8BIT
MOVF ALT, W
TRIS GPIO
CALL DEL_8BIT
MOVF NEU, W
TRIS GPIO

INCF CNT2, F
MOVLW DURCHLAUF
SUBWF CNT2, W
BTFSS STATUS, C
GOTO NEUN_CNT

RETLW B’00000000′

;********************
;* Ende *
;********************
FILL (GOTO INIT), 0x1FD-$ ; Restlichen Speicher mit Sprungbefehl füllen
END ; directive ‚end of program‘

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s