1-Wire Emulation per ATTiny: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
(Erstellung der Basisartikel)
Zeile 1: Zeile 1:
{{todo|Diese Seite soll die Erstellung und Einbindung der 1wire Emulation per ATTiny25 erläutern und ist noch im Aufbau.}}
== Einführung ==
Der Atmel Atiny oder andere Mikrokontroller des Atmel Familie lassen sich mittels Software zu einem 1-Wire Baustein konfigurieren. Basis dieses Gedanken war die Tatsache das der Zählerbaustein DS2423 von Dallas abgekündigt wurde. Jedoch wurden mit diesem Baustein viele Schaltung realisiert und aus diesem Grund wurde eine Software-Lösung gefunden. Die Software Lösung bietet aber noch weitere Vorteile, welche die Standard-Bausteine nicht bieten. So können z.B. Kurze Impulse festgehalten werden, Steuerfunktionen und Notfunktionen dezentral gelöst werden ohne den Busmaster mit diesen Funktionen zu belasten.
=== Foren Links ===
* Wer sich für den Nachbau des DS2423 interessiert, sollte sich diesen Thread durchlesen/verfolgen. [http://forum.fhem.de/index.php?t=msg&th=10962&start=0&rid=118 Alternative zum DS2423 Counter]
* der hier besprochene Quellcode basiert auf dieser Software [http://forum.fhem.de/index.php/topic,22431.msg158105.html#msg158105 AVR Attiny44A als 1Wire Slave konfiguierbar DS2423/DS18BS20/DS2408/DS2408]
== Hardware ==
=== ATtiny44A ===
[[Bild:atmel1wireslaveschaltung.png|mini|100px|rechts|1-Wire Slave Schaltung]]
Die hier gezeigte Schaltung zeigt einen ATTINY44A als 1-Wire Slave, welcher folgende Funktionen hat:
* 4 Status LED's, welche den Zustand der Eingänge anzeigt.
* 1 Taster. Zeigt bei Betätigung den Status der Eingänge
* 4 Eingänge über je einen Operationsverstärker, welcher als Vergleicher arbeitet
* 1 Programmierschnittstelle 6 polig zum laden der Software
=== ATtiny25 ===
Die Hardware vom DS2423, welcher hier im Forum sehr bekannt ist,
kann von seiner Webseite [http://m1n1.de/html/1w_counter_v1_7.html] eingesehen werden.
== Software ==
Die Grundfunktion der Software wurde von Maximum in der [http://www.maximintegrated.com/en/app-notes/index.mvp/id/126 Applikation Note 126] beschrieben. Hier hat Tobias Mueller eine gute Implementierung der Umsetzung auf seiner [http://www.tm3d.de/index.php/1-wire-device-mit-avr Webseite] gemacht. Er zeigt hier das Signalverhalten und die einzelnen Schritte der Software in verschiedenen Diagrammen. Für ein generelles Verständnis ist diese Webseite ein guter Einstieg.
Der hier vorgestellte Quellcode basiert auf seiner Vorlage. Es wurden jedoch die bestehenden 1-Wire Typen DS2423 & DS18BS20 in eine Datei von Ihm übernommen. Zusätzlich sind der 1-Wire DS2408/DS2413 eingefügt worden. Die Code wurde aufgeräumt und nochmals zusätzlich modularisiert und dokumentiert.
Der Quellcode wurde in diesem [http://forum.fhem.de/index.php/topic,22431.msg158105.html#msg158105 Forumsthread] abgelegt.


Quellen:
=== Programmierung ===
Die Software ist in C geschrieben und verwendet hierbei die speziellen Funktionen des Controllers. Eine genaues Einlesen in das Handbuch des Mikrocontroller ist hierbei unerlässlich, um die einzelnen Funktionen zu verstehen. Dies ist auch notwendig, wenn man die bestehende Software auf einen anderen Controller umschreiben will. Wie im im Schaltplan erkennen kann, werden die einzelnen Pin's mehrfach belegt.
=== Datenblätter ===
Hier findet man das Datenblatt zum Mikrocontroller. In diesem Dokument sind alle Funktionen und Register des jeweiligen Mikrocontroller in englisch beschrieben. Für das Verständnis der Funktionen des Mikrocontroller ist eine Kenntnis diese Dokument notwendig.
[http://www.atmel.com/Images/doc8006.pdf Datenblatt von Attiny 24/44/88]
=== Programmierumgebungen ===
* AVR Studio
* AVRDude
=== Der Quellcode ===
Die Funktionen der Software werden in drei Teile getrennt.
* Zeitkritische Funktionen, welche über einen PIN - Interrupt realisiert sind
* Zeitabhängige Funktionen, welcher über einen Timer - Interrupt realisiert sind
* Zeitunkritische Funktionen, welche über das Hauptprogramm realisiert sind
Im folgenden Abschnitt werden die einzelnen Funktion des Quellcodes erklärt.
==== Allgemeine Deklaration ====
// selection of the used
//#define DS2423 1
//#define DS18BS20 1
#define DS2408 1
//#define DS2413 1
...
#define SET_BIT(PORT, BITNUM) ((PORT) |= (1<<(BITNUM)))
#define CLEAR_BIT(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM)))
In dieser Sektion sind generelle Deklarationen definiert.
So wird hier durch die Definitionen DS2423...DS2413 der jeweilige 1-Wire Slave Typ bei der nächsten Kompilierung erstellt.
Es darf nur ein Typ ausgewählt sein, da es sonst zu nicht funktionsfähigen Code kommt.
==== Controller Spezifische Deklarationen ====
#ifdef __AVR_ATtiny44A__
// OW_PORT Pin 7  - PB2
//
//OW Pin
//
#define OW_PORT PORTB //1 Wire Port
#define OW_PIN PINB //1 Wire Pin as number
...
#endif // __AVR_ATtiny44a__
In dieser Sektion können die jeweiligen Realisierungen der verschiedenen Mikrocontroller Typen abgelegt werden.
Da die Registerbelegung von Controller zu Controller unterschiedlich sind, können diese dem Compiler mittels Makroanweisungen hier
entsprechend zugewiesen werden.
==== 1-Wire Baustein spezifische Deklarationen ====
#ifdef DS2423
#define PC_INT_ISR ISR(PCINT0_vect) { /*ATT44 with 0 by PCINT*/ \
if (((PINA&(1<<PINA4))==0)&&((istat&(1<<PINA4))==(1<<PINA4))) { Counter[0]++; } \
if (((PINA&(1<<PINA3))==0)&&((istat&(1<<PINA3))==(1<<PINA3))) { Counter[1]++; } \
if (((PINA&(1<<PINA0))==0)&&((istat&(1<<PINA0))==(1<<PINA0))) \
{ \
eeprom_write_byte((uint8_t *)0,0x55);\
eeprom_write_dword((uint32_t *)1,Counter[0]);\
eeprom_write_dword((uint32_t *)5,Counter[1]);  \
} \
istat=PINA;}
#define INIT_COUNTER_PINS /* Counter Interrupt */ \
GIMSK|=  (1<<PCIE0);\
PCMSK0=  (1<<PCINT3)|(1<<PCINT4)|(1<<PCINT0); \
DDRA &=~ (1<<PINA1) | (1<<PINA2); \
istat=PINB;
#endif
 
Über eine solche Deklaration wird dem bei dem jeweiligen 1-Wire Type die entsprechende Konstante entsprechend konfiguriert.
Für weitere 1-Wire Typen sind entsprechende Konstanten vorzusehen. Einige der Deklarationen sind nur für den jeweiligen Type
notwendig, andere sind für jeden Typ notwendig.
==== Globale Variablen Deklarationen ====
// --------------------- Device depending variables ------------------------------------
#ifdef DS2423
typedef union
{
volatile uint8_t bytes[13];//={1,1,2,0,0,0,0,0,0,0,0,5,5};
struct
{
uint16_t addr;
uint8_t read;
uint32_t counter;
uint32_t zero;
uint16_t crc;
};
} counterpack_t;
counterpack_t counterpack;
volatile uint32_t Counter[2]; // Counter Buffer
#endif
In diesem Bereich werden globale Variablen definiert, welche nur für den jeweiligen 1-Wire Typen notwendig sind.
==== Byte Definitionen des 1-Wire Bus ====
#define OWM_SLEEP 0 //Waiting for next reset pulse
#define OWM_RESET 1 //Reset pulse received
#define OWM_PRESENCE 2 //sending presence pulse
...
#define OW_RESET_ACTIVITY_LATCHES 0xC3
In diesem Bereich sind die einzelnen Kommandos und Status Variablen des 1-Wire Bus deklariert. Diese Definitionen finden sich in den einzelnen
Datenblätter der 1-Wire Bausteine wieder.
==== PIN Interrupt Routine ====
PIN_INT
{
...
}
In dieser Routine wird das Datenhandling bei Statuswechsel des 1-Wire PIN's durchgeführt.
==== Timer Interrupt Routine ====
TIMER_INT
{
}
Alle zeitbasierenden Funktionen werden über diesen Interrupt ausgeführt. Wartezeiten mit Signalprüfungen und dergleichen.
==== Main Routine / Start up ====
Main()
{
}
In dieser Funktion wird der Mikrocontroller und dessen Hardware aufgesetzt. Danach erfolgt die eigentliche
1-Wire Steuerung nur über Interrupts. In der Mainroutine können zusätzlich Funktionen programmiert werden.
Es kann jedoch kein Zugriff auf Interrupt-Funktionen verwendet werden (z.B. SPI, I2C via Interrupt) da hierdurch
das Timing des 1-Wire Bus nicht mehr garantiert werden kann (Vorsetzung bei diesem Mikrocontroller Type).
=== Slave-ID Berechnung ===
Sollte man eigene Slave erstellen wollen, so ist es notwendig die Slave ID entsprechend berechnen zu lassen.
Der Rechner von [http://www.tm3d.de/index.php/tools#berechnungid Thomas Mueller] ist hier ein nützliches Werkzeug.
=== Compilieren ===
kommt noch
=== Programm in den Atmel laden ===
kommt noch
 
= Quellen =
* [http://forum.fhem.de/index.php?t=msg&th=10962&start=0&rid=118 Alternative zum DS2423 Counter]
* [http://forum.fhem.de/index.php?t=msg&th=10962&start=0&rid=118 Alternative zum DS2423 Counter]
* [http://www.tm3d.de/index.php/1-wire-device-mit-avr 1-Wire Device mit AVR-Mikrocontroller]
* [http://www.tm3d.de/index.php/1-wire-device-mit-avr 1-Wire Device mit AR-Mikrocontroller]
 
* [http://forum.fhem.de/index.php/topic,22431.msg158105.html#msg158105 AVR Attiny44A als 1Wire Slave konfigurierbar DS2423/DS18BS20/DS2408/DS2408]
* [http://www.atmel.com Hersteller der Mikrocontroller Atmel]
[[Kategorie:1-Wire]]
[[Kategorie:1-Wire]]

Version vom 2. Mai 2015, 23:47 Uhr

Einführung

Der Atmel Atiny oder andere Mikrokontroller des Atmel Familie lassen sich mittels Software zu einem 1-Wire Baustein konfigurieren. Basis dieses Gedanken war die Tatsache das der Zählerbaustein DS2423 von Dallas abgekündigt wurde. Jedoch wurden mit diesem Baustein viele Schaltung realisiert und aus diesem Grund wurde eine Software-Lösung gefunden. Die Software Lösung bietet aber noch weitere Vorteile, welche die Standard-Bausteine nicht bieten. So können z.B. Kurze Impulse festgehalten werden, Steuerfunktionen und Notfunktionen dezentral gelöst werden ohne den Busmaster mit diesen Funktionen zu belasten.

Foren Links

Hardware

ATtiny44A

1-Wire Slave Schaltung

Die hier gezeigte Schaltung zeigt einen ATTINY44A als 1-Wire Slave, welcher folgende Funktionen hat:

  • 4 Status LED's, welche den Zustand der Eingänge anzeigt.
  • 1 Taster. Zeigt bei Betätigung den Status der Eingänge
  • 4 Eingänge über je einen Operationsverstärker, welcher als Vergleicher arbeitet
  • 1 Programmierschnittstelle 6 polig zum laden der Software

ATtiny25

Die Hardware vom DS2423, welcher hier im Forum sehr bekannt ist, kann von seiner Webseite [1] eingesehen werden.

Software

Die Grundfunktion der Software wurde von Maximum in der Applikation Note 126 beschrieben. Hier hat Tobias Mueller eine gute Implementierung der Umsetzung auf seiner Webseite gemacht. Er zeigt hier das Signalverhalten und die einzelnen Schritte der Software in verschiedenen Diagrammen. Für ein generelles Verständnis ist diese Webseite ein guter Einstieg. Der hier vorgestellte Quellcode basiert auf seiner Vorlage. Es wurden jedoch die bestehenden 1-Wire Typen DS2423 & DS18BS20 in eine Datei von Ihm übernommen. Zusätzlich sind der 1-Wire DS2408/DS2413 eingefügt worden. Die Code wurde aufgeräumt und nochmals zusätzlich modularisiert und dokumentiert. Der Quellcode wurde in diesem Forumsthread abgelegt.

Programmierung

Die Software ist in C geschrieben und verwendet hierbei die speziellen Funktionen des Controllers. Eine genaues Einlesen in das Handbuch des Mikrocontroller ist hierbei unerlässlich, um die einzelnen Funktionen zu verstehen. Dies ist auch notwendig, wenn man die bestehende Software auf einen anderen Controller umschreiben will. Wie im im Schaltplan erkennen kann, werden die einzelnen Pin's mehrfach belegt.

Datenblätter

Hier findet man das Datenblatt zum Mikrocontroller. In diesem Dokument sind alle Funktionen und Register des jeweiligen Mikrocontroller in englisch beschrieben. Für das Verständnis der Funktionen des Mikrocontroller ist eine Kenntnis diese Dokument notwendig. Datenblatt von Attiny 24/44/88

Programmierumgebungen

  • AVR Studio
  • AVRDude

Der Quellcode

Die Funktionen der Software werden in drei Teile getrennt.

  • Zeitkritische Funktionen, welche über einen PIN - Interrupt realisiert sind
  • Zeitabhängige Funktionen, welcher über einen Timer - Interrupt realisiert sind
  • Zeitunkritische Funktionen, welche über das Hauptprogramm realisiert sind

Im folgenden Abschnitt werden die einzelnen Funktion des Quellcodes erklärt.

Allgemeine Deklaration

// selection of the used 
//#define		DS2423		1
//#define		DS18BS20	1
#define		DS2408		1
//#define		DS2413		1
...
#define SET_BIT(PORT, BITNUM)	((PORT) |= (1<<(BITNUM)))
#define CLEAR_BIT(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM)))

In dieser Sektion sind generelle Deklarationen definiert. So wird hier durch die Definitionen DS2423...DS2413 der jeweilige 1-Wire Slave Typ bei der nächsten Kompilierung erstellt. Es darf nur ein Typ ausgewählt sein, da es sonst zu nicht funktionsfähigen Code kommt.

Controller Spezifische Deklarationen

#ifdef __AVR_ATtiny44A__
// OW_PORT Pin 7  - PB2
//
//OW Pin
//
#define OW_PORT PORTB								//1 Wire Port
#define OW_PIN PINB									//1 Wire Pin as number
...
#endif // __AVR_ATtiny44a__ 

In dieser Sektion können die jeweiligen Realisierungen der verschiedenen Mikrocontroller Typen abgelegt werden. Da die Registerbelegung von Controller zu Controller unterschiedlich sind, können diese dem Compiler mittels Makroanweisungen hier entsprechend zugewiesen werden.

1-Wire Baustein spezifische Deklarationen

#ifdef DS2423
#define PC_INT_ISR ISR(PCINT0_vect) { /*ATT44 with 0 by PCINT*/ \
if (((PINA&(1<<PINA4))==0)&&((istat&(1<<PINA4))==(1<<PINA4))) {	Counter[0]++;	}		\
if (((PINA&(1<<PINA3))==0)&&((istat&(1<<PINA3))==(1<<PINA3))) {	Counter[1]++;	}		\
if (((PINA&(1<<PINA0))==0)&&((istat&(1<<PINA0))==(1<<PINA0)))	\
{ \
eeprom_write_byte((uint8_t *)0,0x55);\
eeprom_write_dword((uint32_t *)1,Counter[0]);\
eeprom_write_dword((uint32_t *)5,Counter[1]);  \
}	\						
istat=PINA;}					
#define INIT_COUNTER_PINS 	/* Counter Interrupt */ \
GIMSK|=  (1<<PCIE0);\
PCMSK0=  (1<<PCINT3)|(1<<PCINT4)|(1<<PCINT0);	\
DDRA &=~ (1<<PINA1) | (1<<PINA2); \
istat=PINB;	 
#endif

Über eine solche Deklaration wird dem bei dem jeweiligen 1-Wire Type die entsprechende Konstante entsprechend konfiguriert. Für weitere 1-Wire Typen sind entsprechende Konstanten vorzusehen. Einige der Deklarationen sind nur für den jeweiligen Type notwendig, andere sind für jeden Typ notwendig.

Globale Variablen Deklarationen

// --------------------- Device depending variables ------------------------------------
#ifdef DS2423
typedef union 
{
volatile uint8_t bytes[13];//={1,1,2,0,0,0,0,0,0,0,0,5,5};
struct 
{
uint16_t addr;
uint8_t read;
uint32_t counter;
uint32_t zero;
uint16_t crc;
};
} counterpack_t;
counterpack_t counterpack;
volatile uint32_t Counter[2];										// Counter Buffer
#endif

In diesem Bereich werden globale Variablen definiert, welche nur für den jeweiligen 1-Wire Typen notwendig sind.

Byte Definitionen des 1-Wire Bus

#define OWM_SLEEP									0			//Waiting for next reset pulse
#define OWM_RESET									1			//Reset pulse received 
#define OWM_PRESENCE								2			//sending presence pulse
...
#define OW_RESET_ACTIVITY_LATCHES			0xC3

In diesem Bereich sind die einzelnen Kommandos und Status Variablen des 1-Wire Bus deklariert. Diese Definitionen finden sich in den einzelnen Datenblätter der 1-Wire Bausteine wieder.

PIN Interrupt Routine

PIN_INT 
{
...
}

In dieser Routine wird das Datenhandling bei Statuswechsel des 1-Wire PIN's durchgeführt.

Timer Interrupt Routine

TIMER_INT 
{
}

Alle zeitbasierenden Funktionen werden über diesen Interrupt ausgeführt. Wartezeiten mit Signalprüfungen und dergleichen.

Main Routine / Start up

Main()
{
}

In dieser Funktion wird der Mikrocontroller und dessen Hardware aufgesetzt. Danach erfolgt die eigentliche 1-Wire Steuerung nur über Interrupts. In der Mainroutine können zusätzlich Funktionen programmiert werden. Es kann jedoch kein Zugriff auf Interrupt-Funktionen verwendet werden (z.B. SPI, I2C via Interrupt) da hierdurch das Timing des 1-Wire Bus nicht mehr garantiert werden kann (Vorsetzung bei diesem Mikrocontroller Type).

Slave-ID Berechnung

Sollte man eigene Slave erstellen wollen, so ist es notwendig die Slave ID entsprechend berechnen zu lassen. Der Rechner von Thomas Mueller ist hier ein nützliches Werkzeug.

Compilieren

kommt noch

Programm in den Atmel laden

kommt noch

Quellen