Author Archives: elektrowolle

Vuvozero (filter vuvozela sounds from soccer games)

For all people who feel annoyed by the bee-swarm sound, I’ve created a small Ableton Live Set containing a filter for the main frequencies of the vuvuzela.

Installation:

Usage:

Put channel 1 into record mode (by clicking the small circle below the “S” in the first track). Connect your satellite receiver to the line in of your PC/Mac and the line out to your amplifier.

Enjoy the games.

Serial RGB-Dot (Update 4)

Ein neues Projekt ist gerade unterwegs: Ähnlich dem FNordlicht bzw. BlinkM suchte ich eine Lösung eine einzelne RGB-LED seriell anzusteuern, die 100 einzelnen LEDs werden etwa einen Meter entfernt voneinander sein, so dass die bereits existierenden RGB Treiber für 8 oder 64 LEDs nicht wirklich praktikabel oder zu teuer waren. Momentan liefert digikey die PIC12F508 samt RGB-LEDs und pcb-pool wird nächste Woche die passenden Platinen in den Briefkasten werfen.

Statt I2C wird in dem PIC ein 24-Bit Schieberegister mit Latch realisiert. Nach dem Latch liegen dann die drei Software PWMs. Da links und rechts auch noch Lötpads hinmüssen, ist die Platine mit 10mmx17mm dann doch größer geworden als ursprünglich geplant, aber immer noch kleiner und deutlich günstiger.

Der PIC-Code samt Arduino-Library folgt sobald die ersten Tests erfolgreich waren.

Update 1:

Die Platinen sind zwar noch unterwegs, aber der PIC-Code ist mittlerweile fertig. Vorerst nur mit einem 8-Bit PWM, später folgt vielleicht ein Upgrade auf 10-Bit.

Ursprünglich sollte der Latch über den Watchdog-Timer erfolgen (wenn 18ms lang kein Taktsignal vorliegt, werden die Daten aus dem Schieberegister in die PWM-Register kopiert). Da unter den einzelnen Prozessoren der WDT-Timer aber schwanken kann (laut Datenblatt zwischen 9ms und 30ms) erfolgt jetzt die Übernahme über den integrierten Timer nach 10ms.

Update 2:Von pcb-pool kam jetzt das erste Bild vom Produktionsprozess. So wie es ausschaut, wird am Wochenende alles zusammengebaut.

Update 3:Alle Platinen sind nun bestückt und verlötet, morgen erfolgt der Upload des PIC-Codes:

Update 4:Die LEDs sind jetzt auch alle verbaut, fehlt nur noch der Funktionstest.

;; PWM-Code fuer RGB-Dot
;; Copyright 2010 Wolfgang Jung (w@elektrowolle.de)
    list     p=12f508
    #include p12f508.inc

    __CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC
;; Register
REG_B_RED    EQU   0x08
REG_B_GREEN  EQU   0x09
REG_B_BLUE   EQU   0x0A
REG_C_RED    EQU   0x0B
REG_C_GREEN  EQU   0x0C
REG_C_BLUE   EQU   0x0D
REG_LCLK     EQU   0x0E
REG_OVERFLOW EQU   0x0F
REG_PWMCNT   EQU   0x10
REG_WORK     EQU   0x11
;; Pinassignments
PIN_RED      EQU  H'0'
PIN_GREEN    EQU  H'1' 
PIN_BLUE     EQU  H'2'
PIN_SDIN     EQU  H'3'
PIN_SDOUT    EQU  H'5'
PIN_SCLK     EQU  H'4'
;; Konstanten
DEF_OPTION  EQU 0xC7 ; Kein Wakeup, Kein Pull-Up, TOCS=fOSC/4, TOSE=1, PSA=TMR0, Prescale=256
DEF_TIMEOUT EQU 39   ; Bei 4 MHz und Prescale=256 -> etwa 10ms

    ORG 0x000
;; startup
    MOVLW    DEF_OPTION 
    OPTION
;; Port-Config OIIOOO
    MOVLW   0x18
    TRIS    GPIO
L_MAIN
    MOVF    GPIO, W                ; Lade Port nach W
    XORWF   REG_LCLK, W            ; XOR mit letztem CLK
    MOVWF   REG_WORK
    BTFSS   REG_WORK, PIN_SCLK    ; Flanke von SCLK?
    GOTO    L_NO_EDGE       
L_EDGE_DETECTED:
    BTFSC   REG_LCLK, PIN_SCLK    
    GOTO    L_FALLING_EDGE
L_RISING_EDGE:
    ;; steigende Flanke -> SDIN auswerten    
    CLRF    REG_OVERFLOW
    BCF     STATUS, C            ; clear CARRY-Flag
    BTFSC   GPIO, PIN_SDIN
    BSF     STATUS, C            ; CARRY-Flag enthaelt nun SDIN, nun das Bit durch die 24-Bit schieben
    RLF     REG_B_RED, 1
    RLF     REG_B_GREEN, 1
    RLF     REG_B_BLUE, 1
    ;; letztes Bit merken fuer das naechste Modul
    BTFSC   STATUS, C
    BSF     REG_OVERFLOW, 0
    GOTO    L_CLR_WDT
L_FALLING_EDGE:
    ;; Fallende Flanke -> letztes Bit wieder auf SDOUT schreiben
    BCF     GPIO, PIN_SDOUT
    BTFSC   REG_OVERFLOW, 0
    BSF     GPIO, PIN_SDOUT
L_CLR_WDT:
    ;; Timer0 zuruecksetzen, Prescaler muss danach angepasst werden    
    MOVLW   0
    MOVWF   TMR0
    MOVLW   DEF_OPTION
    OPTION
    ;; letzten Input merken
    MOVF    GPIO, W
    MOVWF   REG_LCLK
L_NO_EDGE:
    ;; Keine Flanke seit DEF_TIMEOUT timer0 
    MOVLW   DEF_TIMEOUT
    SUBWF   TMR0, W
    ;; Prescaler muss angepasst werden    
    MOVLW   DEF_OPTION
    OPTION
    ;; Skip, wenn tmr0 < DEF_TIMEOUT
    BTFSS   STATUS, C
    GOTO    L_DO_PWM
L_COPY_BUFFER_TO_PWM:
    ;; Daten aus Schieberegister in PWM-Register
    MOVF    REG_B_RED, W
    MOVWF   REG_C_RED
    MOVF    REG_B_GREEN, W
    MOVWF   REG_C_GREEN
    MOVF    REG_B_BLUE, W
    MOVWF   REG_C_BLUE
L_DO_PWM:
    DECF    REG_PWMCNT, F          ; Ist pwmCnt == 0?
    BTFSS   STATUS, Z
    GOTO    L_PWM_RED
    ;;; PWMCnt == 0 -> Also alle Pins auf high
    BSF     GPIO, PIN_RED
    BSF     GPIO, PIN_GREEN
    BSF     GPIO, PIN_BLUE    
L_PWM_RED:    
    MOVF    REG_PWMCNT, W
    SUBWF   REG_C_RED, W
    BTFSS   STATUS, Z            ; Skip, wenn pwmCnt > red
    GOTO    L_PWM_GREEN    
    MOVF    REG_C_RED, W         ; Wenn red==0, dann niemals an
    BTFSS   STATUS, Z    
    BCF     GPIO, PIN_RED
L_PWM_GREEN:    
    MOVF    REG_PWMCNT, W
    SUBWF   REG_C_GREEN, W
    BTFSS   STATUS, Z
    GOTO    L_PWM_BLUE    
    MOVF    REG_C_GREEN, W
    BTFSS   STATUS, Z    
    BCF     GPIO, PIN_GREEN
L_PWM_BLUE:    
    MOVF    REG_PWMCNT, W
    SUBWF   REG_C_BLUE, W
    BTFSS   STATUS, Z
    GOTO    L_MAIN                ; Zurueck zum Anfang
    MOVF    REG_C_BLUE, W
    BTFSS   STATUS, Z    
    BCF     GPIO, PIN_BLUE

mbed.org als Alternative zu Arduino

Nach dem Erfolg des Arduino ist NXP auch auf den Zug der einfachen Mikrocontrollerentwicklung aufgesprungen. Unter mbed.org gibt es die Übersicht der beiden verschiedenen Modelle LPC2368 (ARM7) und LPC1768 (Cortex-M3), die einen interessanten Ansatz mit einem Online-Compiler umsetzen (auf dem eigenen Rechner muss keine Entwicklungsumgebung installiert werden).

Preislich sind beide auf dem gleichen Niveau (Einzelpreis 48,80€ bei Farnell) und durchaus eine Alternative zu einem Arduino, da beide doch um einiges leistungsfähiger sind. Hier der Auszug aus dem Datenblatt:

  • 100 MHz operation
  • 512 KB of Flash memory
  • 64KB of SRAM
  • 10/100 Ethernet MAC
  • USB 2.0 full-speed device/Host/ OTG controller with on-chip PHY
  • Four UARTs with fractional baud rate generation, RS-48, modem control, and IrDA
  • Two CAN 2.0B controllers
  • Three SSP/SPI controllers
  • Three I2C-bus interfaces with one supporting Fast Mode Plus (1-Mbit/s data rates)
  • I2S interface for digital audio

Einen konkrete Anwendung schwebt mit zwar noch nicht vor, aber das wird sich bestimmt noch ergeben.
Einzige Minuspunkte, die ich bislang finden konnte sind der nur einfach vorhandene 12-Bit DAC und das sämtlicher Code auf den NXP-Servern liegt.

Falls doch mehr DAC-Kanäle benötigt werden, scheint ein TLV5628, TLV5608, TLV5610 oder ähnliches ganz brauchbar zu sein (8-Fach, 8/10/12-Bit DAC über SPI).

Wichtiger Hinweis am Rande: Sämtliche Digital-IOs sind zwar 3,3V aber 5V tolerant.

16 Bit Port Extender mit I2C-Bus PCA9555

Texas Instruments bietet mit dem PCA9555 einen 16 Bit Port-Extender an, von dem maximal 8 Stück parallel an einem I2C Bus betrieben werden können. Insgesamt können so 128 individuell als Ein- oder Ausgang konfigurierbare Leitungen bereitgestellt werden, wobei alle Eingänge bei jedem Flankenwechsel einen Interrupt auslösen.

Die Ausgänge sind in der Lage 25 mA dauerhaft gegen Masse zu schalten, für LEDs also ausreichend.

Sobald die Bestellung da ist, wird an dieser Stelle die dazu passende Arduino Bibliothek veröffentlicht.

Sammlung von Tipps und Tricks

Microchip hat unter 01146B.pdf eine schöne Sammlung an Tipps zusammengestellt, die sich auch auf andere Mikroprozessoren anwenden lassen.

Aus der Übersicht:

  1. 4×4 Keyboard with 1 Input
  2. 5V → 3.3V Active Clamp
  3. Brushless DC Fan Speed Control
  4. Creating a Dithered PWM Clock

Und viele weitere. Insbesondere Punkt 2 war für mich eine überraschend einfache Lösung für das übliche Problem mit Klemmdioden (Sättigung der 3,3V Schiene):

Auszug aus obigen PDF

Analog Multiplier MPY634

In dieser Kategorie landet von Zeit zu Zeit ein integrierter Schaltkreis, der für den einen oder anderen vielleicht praktisch sein könnte.

Diese Woche: Burr Brown (mittlerweile Texas Instruments) MPY-634. Dieser Chip enthält alles um rein analog Multiplikationen, Divisionen oder die Bestimmung von Quadratwurzeln durchzuführen.

Das Datenblatt auf focus.ti.com sagt eigentlich alles. In dem Zusammenhang gibt es von Analog Devices noch die App-Note MT-079 auf www.analog.com die die Grundlagen dieser (in Vergessenheit geratenen) Bausteine erklärt.