HomeMatic:      Aufbau   ·   «Kleine Schritte»   ·   Protokolle   ·   Bootloader   ·   Firmware

Die ersten Programmierschritte


An dieser Stelle muss man sich nun entscheiden: will ich zuerst so viel wie möglich über die Original Firmware und ihre Protokolle wissen, oder will ich die Firmware jetzt sofort überschreiben und die LED zum Blinken bringen.

Da ich mehrere Module habe und noch keine Zentralle zum auslesen der Protokolle entscheide ich mich, die Firmware zu überschreiben. Und tschüss.


Pins und Ports

Fix in den Schaltplan geschaut:

  • PA0 (ADC) hängt am Stromsensor
  • PB0 steuert die LED
  • PB4 ist /CS für den Trasceiver
  • PB5 ist MOSI
  • PB6 ist MISO
  • PB7 ist SCK, also der Takt für die SPI Schnittstelle
  • PC0 ist SCL und spricht mit dem Flash RAM
  • PC1 ist SDA, also der zweite Teil des i2c Bus
  • PD0 geht über die Wippe an Masse - schade, dies wäre auch RxD
  • PD2 ist GDO0 and Transceiver und kann Interrupts auslösen - gut!
  • PD3 geht an GDO2 und kann das ebenfalls - sehr gut!
  • PD4 schaltet das Relais
  • PD6 geht ebenfalls an die Wippe
  • PD7 geht über den Config Taster an Masse
  • PD1 ist TxD und läft auf einen Testpunkt. Hier könnten wir Debug-Nachrichten ausgeben. Allerdings muss hier ein Optokoppler in die Leitung weil wir sonst wieder mal 220V auf dem Laptop haben, und das will ich nicht.

Also was wollen wir als erstes tun? Das klassische Microkontroller "Hallo Welt"-Programm ist nu einmal die blinkende LED. Also los geht's.


das erste Programm

#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
  DDRB = 0x01;	/* set pin 0 as output */
  for(;;) {
    PORTB |= 0x01; /* switch pin 0 on */
    _delay_ms(250); /* wait */
    _delay_ms(250);
    PORTB &= ~0x01; /* switch pin 0 off */
    _delay_ms(250); /* wait */
    _delay_ms(250);
  } /* do it again */
}


Compilieren

avr-gcc -Wall -Os -DF_CPU=8000000 -mmcu=atmega644 -c main.c -o main.o
avr-gcc -Wall -Os -DF_CPU=8000000 -mmcu=atmega644 -o main.elf main.o
rm -f main.hex
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
avr-size --format=avr --mcu=atmega644 main.elf


und ab damit zum HM Modul

avrdude -c avr911 -P /dev/cu.SLAB_USBtoUART -p atmega644 -U flash:w:main.hex:i


und nun?

So, nachdem die Bytes in den AVR geladen wurde und das Verify uns eine gute Übertragung bestätigt hat ist aus dem Universal Unter-Putz Funklichtschalter ein simples Blinklicht geworden. Ein simples und teures Blinklicht.

Aber egal. Der ATmega lässt sich also problemlos mit neuer Firmware ausstatten, der Schaltplan stimmt zumindest in Bezug auf die SPI und die LED, und drei Tage Lesewut haben zu einem erwarteten Ergebnis geführt.

HURRA - jetzt geht die Arbeit richtig los... .