AVR Webserver Software

Inhalt:

  1. Vorwort
  2. Hardware
  3. Grundkonfiguration
  4. Mainloop
    1. serielle Schnittstelle
    2. Scheduler (zeitgesteuerte Aufgaben)+
  5. Hintergrundprozesse (Daemon)
    1. http-Server
    2. Telnet-Server
    3. FTP-Server+
  6. NTP
  7. LCD-Modul
  8. AD-Wandler
  9. Kamera
  10. E-Mail Versand
  11. http-Client (Wetterdaten empfangen)
  12. WOL (Wake on Lan)
  13. SD-Kartenanbindung+
  14. IR-Fernbedienung mit RC5-Codes+
  15. 1-Wire Bus mit DS18x20 Temperatursensoren+
  16.  Befehle auf der Kommandozeile

Vorwort

Die Software existiert zur Zeit in zwei Versionen:

Funktionen die nur in der erweiterten Version vorhanden sind sind hier mit + gekennzeichnet.

Hardware (Unterschiede)

Die Software kann auf den hier vorgestellten AVR-Modulen eingesetzt werden. Der Unterschied in der Hardware sieht wie folgt aus:

Feature ETH_M32_EX AVR Webmodule Pollin Net-IO
10MBit Ethernet X X
X
serielle RS232 X X X
ISP-Schnittstelle X X X
SD-Kartenslot O X O
ohne SMD-Bauteile
(leichte Lötbarkeit)
X O X
ATmega32
X O X
ATmega644(P) X X X
Hutschienengehäuse O X O

Grundkonfiguration

An Einstellungen für das „eigene“ Modul ist folgendes zu überprüfen und eventuell zu ändern:

  • Verwendeter Prozessor:  ATmega32 / 644 / 644P
  • Verwendeter Quarz: #define F_CPU xxx
  • IP Einstellungen: DHCP oder eigene IP / Router / DNS-Server
  • MAC-Adresse und IP-Adresse des Moduls (wichtig falls mehrere Module im gleichen Netz)
  • Baudrate der seriellen Schnittstelle

Einstellen der Fuses

Ist ein wichtiger Schritt und es werden an dieser Stelle gern Fehler gemacht.
Eingeschaltet (aktiviert) werden muss:

  • Brown-out detection level at VCC=4.3V [BODLEVEL=100]
    (für das AVR-Webmodul: Brown-out detection level at VCC=2.7V [BODLEVEL=101] )
  • Serial program downloading (SPI) enabled [SPIEN=0]
  • Boot Flash section size=4096 words Boot start address =$F000; [BOOTSZ=00]; default value
  • Ext. Crystal Osc; Frequency 8.0- MHz; Start-up time: 16K CK + 65ms; [CKSEL=1111 SUT=11]

Die  anderen Fusebit  deaktivieren.

Mainloop

serielle Schnittstelle

Über die serielle Schnittstelle können mit Hilfe eines Terminal-Programms die Ausgaben des Webservers mitgelesen werden (z.B. für debugging). Außerdem können verschiedene Kommandos an den Server gesendet und Einstellungen angepasst werden. Beispielsweise lassen sich WakeOnLan Packete versenden. Die Tabelle (rechts) zeigt alle derzeit möglichen Befehle. Die Einstellungen der seriellen Schnittstelle ist:  9600Baud, 8Datenbits, no Parity und 1 Stoppbit des weiteren kein Handshake.

Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1471&p=6077
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1462&p=6046

Scheduler (zeitgesteuerte Aufgaben)+

Mit dem Scheduler können Aufgaben auf Websever zeitgesteuert ausgeführt werden.

Zu den möglichen Aufgaben gehört:

  • Das Starten von Anwendungen (mit oder ohne Parametern)
  • Der Aufruf von Internetseiten
  • Der Vergleich von Temperaturen
  • Das Schalten von Verbraucher

Diese Aufgaben können zu folgenden Zeitpunkten bzw. in folgenden Intervallen automatisch durchgeführt werden:

  • Mehrfach pro Tag (Zeitgesteuert)
  • Täglich
  • Wöchentlich
  • Monatlich
  • Einmalig

Die Einsatzmöglichkeiten des Scheduler sind vielfältig, z.B:

  • Regelmäßige Kontrolle einer Heizung oder Warmwasseranlage
  • Regelmäßige Kontrolle von Temperaturen
  • Lüftungssteuerung
  • u.v.m.

Hintergrundprozesse (Daemon)

Über den Ethernet-Stack in der Software können getrennt für TCP und UDP mehrere Prozesse definiert werden, die im Hintergrund auf Anfragen auf den entsprechenden Ports antworten.

Dazu werden die Prozesse ( auszuführende Funktionen ) mit der Portnummer und der auszuführenden Funktion in die Tabellen TCP_PORT_TABLE bzw. UDP_PORT_TABLE eingetragen. Dies wird gewöhnlich über die xxx_init()-Funktionen ausgeführt (z. B. httpd_init() ). Trifft nun ein Ethernetpaket von außen ein, wird im Stack entsprechend dieser Tabellen an die jeweilige Funktion (z.B. httpd(index) ) weiterverzweigt. In der Tabelle 'tcp_entry[MAX_TCP_ENTRY+1]' werden dann alle gerade aktiven TCP Verbindungen aufgelistet (UDP hat keine Rückmeldung und daher keine 'aktive' Verbindung). Per Parameter 'index' bekommen die Daemon-Funktionen einen Zeiger auf ihre aktive Verbindung mitgeteilt und müssen nun selbst über den Status und Verarbeitungsfortschritt der Verbindung entscheiden.

Folgende Prozesse sind aktuell implementiert:

http-Server

Ein Webserver überträgt Dokumente an Clients wie z. B. einen Webbrowser. Die zur Verfügung gestellten Dokumente können statisch (eine HTML-Seite) oder dynamisch (Messwerte) sein. Als Übertragungsmethoden dienen standardisierte Übertragungsprotokolle (HTTP, HTTPS) und Netzwerkprotokolle (TCP/IP) üblicherweise über Port 80 (HTTP) und Port 443 (HTTPS).

Telnet-Server

Auf Port 23 horcht ein Telnetserver und tauscht Daten mit der seriellen Schnittstelle des Boards aus. Somit ist die RS232-Schnittstelle des Boards über das Internet "tunnelbar" und es können viele Geräte (z.B. Telefonanlagen) aus der Ferne gesteuert werden.

Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1480

FTP-Server+

FTP steht für File Transfer Protocol, also ein Protokoll, das es erlaubt Dateien mit dem Webserver auszutauschen. Dazu sind Port 21 und 2100 zuständig. Client-Programme sind z.B. FileZilla oder ws_ftp.

Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=35&t=973

NTP

config.h / ntp.c / ntp.h
NTP (Network Time Protocol) ist ein Standard zur Synchronisierung von Uhren in Computersystemen und verwendet den UDP Port 123. Diese Funktion stellt Datum und Uhrzeit bereit. Verwendet wird diese Funktion z.B. im Scheduler. Man kann man auch eine kleine Ethernet Uhr bauen, die über das Internet die aktuelle Uhrzeit empfängt.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=35&t=1269&p=5086

LCD-Modul

config.h / lcd.c / lcd.h
Über folgende defines lässt sich in der config.h ein Standard-LCD (HD44870, SED1278F und kompatible) ansteuern.
#define USE_SER_LCD    1    //!< LCD Routinen mit einbinden
#define USE_LCD_4Bit    0    //!< LCD im 4Bit Mode oder seriell

Alternativ kann das LCD im 4-bit Modus angeschlossen werden oder über die folgende Zusatzschaltung seriell mit 3 Datenleitungen plus Vcc und GND. Die dadurch frei gewordenen Portpins können zum Schalten oder Abfragen von Zuständen genutzt werden.

Anschluss des seriellen LCD Interface
Eine Platine für diese Schaltung gibt es im Shop. (LCD Seriell Leiterplatte)

Verwendete Hardware-Ports sind wie folgt:

Im 4Bit Mode: (USE_LCD_4bit =1) Im seriellen Mode: (USE_LCD_4Bit=0)

PortC Pin0 - LCD D4
PortC Pin1 - LCD D5
PortC Pin2 - LCD D6
PortC Pin3 - LCD D7
PortC Pin4 - LCD RS
PortC Pin5 - LCD RW
PortC Pin6 - LCD Enable
PortC Pin7 - LCD Busybit

PortC Pin2 - LCD Enable
PortC Pin3 - 74AC164 Data
PortC Pin4 - 74AC164 Clock

In der Datei lcd.h ist noch einzustellen, wie viele Zeilen das Display darstellen kann:
#define TWO_LINES
//#define THREE_LINES
//#define FOUR_LINES

Für die formatierte Ausgabe auf das Display kann dann die Funktion
void  lcd_print (unsigned char zeile, unsigned char spalte, const char *Buffer,...);
verwendet werden.

Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1321&p=5677

AD-Wandler

config.h / analog.c  / analog.h
Analog-Digital-Wandler wandeln analoge Eingangssignale in digitale Signale um. Somit ist es möglich z. B. Temperaturen zu überwachen.  Die Messdaten stehen in var_array [0] bis var_array[7] zur Auswertung bereit.

Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1252&p=4935

Kamera

config.h / cam.c  / cam.h
Die Kamera stellt Bilder direkt auf eine Seite des WWW dar. Für dieses Gimmick sollte ein ATMega644P verwendet werden, da der ATMega32 nur eine serielle Schnittstelle zur Verfügung stellt.

Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1385&p=5665
http://www.ulrichradig.de/forum/viewtopic.php?f=33&t=1552

E-Mail Versand

config.h / sendmail.c / sendmail.h
Werden Temperaturen nicht erreicht oder versagt eine Pumpe ihren Dienst, ist die E-Mail eine gute Wahl, sich benachrichtigen zu lassen. Dazu sollte der Webserver einen eigenen  E-Mail-Account haben.

Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1328&p=5407

http-Client (Wetterdaten empfangen)

Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=993&p=3811

WOL (Wake On Lan)

Mittels Wake on LAN kann ein Gerät (PC oder ähnliches) über das  Netzwerk eingeschaltet werden. Die Netzwerkkarte des Geräts wartet auf ein so genanntes Magic Packet (Schutzmarke von AMD), bei dessen Empfang das Gerät eingeschaltet wird. Das Datenpaket ist direkt an die Netzwerkkarte adressiert oder wird als Broadcast verschickt. Es enthält 6 Mal in Folge den hexadezimalen Wert FF; unmittelbar danach erscheint die ununterbrochene 16-malige Wiederholung der MAC-Adresse der Netzwerkkarte.

Trägt man die MAC-Adresse 'seines' PCs ein, so kann der PC durch den Webserver aufgeweckt werden (vorausgesetzt der PC ist für WOL konfiguriert).

WOL kann eine knifflige Angelegenheit sein, je nach dem welche Hardware- und Software-Kombination auf dem zu startenden Gerät im Einsatz ist und wie diese eingestellt wurden. Also nicht gleich aufgeben!

Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=818&p=2606

SD-Kartenanbindung+

MMC/SD oder miniSD
Für manche Projekte benötigt man mehrere Mega-Byte Speicher z.B. für einen MP3Player oder auch für die Datenerfassung. Da stellt sich die Frage, was nehmen bei der unüberschaubaren Anzahl sich auf dem Markt befindlichen Speicherkarten. Mein Favorit ist eindeutig die MMC/SD Karte. Dafür sprechen mehrere Gründe.

  1. Die MMC/SD - Karte ist eine mit der kleinsten Speicherkarten.
  2. Sie benötigt nur 4 I/O Pins am Mikrocontroller und kommt ohne weitere Logik aus.
  3. Es wird, auf Grund der 3,3 Volt Betriebsspannung, ein Level Shifter benötigt. Im einfachsten Fall reichen da paar Widerstände.
  4. http://www.ulrichradig.de/home/index.php/avr/mmc-sd
  5. Der Anschluß gestaltet sich einfacher als bei so mancher anderen Karte

microSD

Der wichtige Unterschied zu MMC/SD und miniSD ist eine abweichende Pinbelegung.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=35&t=973

IR-Fernbedienung mit RC5-Codes+

Als IR-Empfänger verwendet man einen TSOP1736, der direkt an 5V und einen Inputport (RC5_PIN) angeschlossen wird.

Ein Beispiel zur Verwendung der Fernbedienung findet sich in der Mainloop 'Steuerung mit IR-Fernbedienung'. Sollen kurze im Millisekundenbereich liegende Pulse an Ausgängen erzeugt werden sollte auch der Abschnitt zu dem Countdown-Timer T3 beachtet werden.

1-Wire Bus mit DS18x20 Temperatursensoren+

OW-Anschluss.png

Anschluss der 1-Wire Sensoren DS18B20

An die Klemmleiste OW werden die einzelnen DS18B20 über einen "Klingeldraht"-Bus hintereinander angeschlossen. Kurze Abzweige sind möglich. Funktionieren tut das auch noch mit 20 Sensoren und 50 Meter Kabel.

Der Widerstand R1 kann ab ca. 2K2 aufwärts gewählt werden.

Aktivierung mittels USE_OW in der config.h

Weitere Info:
www.ulrichradig.de/forum/viewtopic.php

Was machen, wenn es nicht geht?

  • Hardware prüfen
  • Ist alles sauber gelötet?
  • Gibt es Lötbrücken?
  • Sind alle Bauteile an der richtigen Stelle?
  • Stecken die IC  mit Pin 1 richtig?
  • Stimmt die Polung der Kondensatoren?
  • Stimmen die Quarzangaben mit dem im Makefile überein?
  • Sind die Fusebit eingestellt?
  • Stecken die Jumper?
  • Einstellungen im Terminal prüfen
  • Ist die IP Adresse an das eigene Netzwerk angepasst?
  • Fehler beim Programmieren? SD-Karte herausnehmen!+

Befehle der Kommandozeile

Übersicht der Befehle
reset

Zetzt den AVR-Controller zurück

arp

Gibt  die aktuelle ARP-Tabelle aus

tcp

Gibt die aktuelle Tabelle der TCP Verbindungen aus

ip [<ip>]

Gibt die aktuelle IP Adresse des Boards aus, oder überschreibt diese mit <ip>

net [<netmask>]

Gibt die aktuelle Netzwerkmaske des Boards aus, oder überschreibt diese mit <netmask>

router [<ip>]

Gibt die aktuelle IP Adresse des Routers aus, oder überschreibt diese mit <ip>

ntp [<ip>]

Gibt die aktuelle IP Adresse des NTP-Servers aus, oder überschreibt diese mit <ip>

ntpr

Holt die Zeit vom NTP-Server und stellt die Uhr des Boards

mac

Gibt die MAC-Adresse des Boards aus

ver

Gibt die versionsnummer des ENC-Netzwerkchips aus

sv

 

time

Gibt die aktuelle Zeit aus

wol [<mac>] [<ip>]

Versendet ein MagicPackt an die gespeicherte MAC-Adresse,

oder überschreibt die MAC-Adresse,

oder überschreibt die MAC-Adresse und die Broadcast-IP

help, ?

Gibt eine Hilfe aus


+ nur in dieser Version: http://www.ulrichradig.de/forum/viewtopic.php?f=35&t=1214