1-Wire Emulation per ATTiny

Aus FHEMWiki
Wechseln zu: Navigation, Suche

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 [2] 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.

PIN Interrupt Routine / EEPROM sichern

Ebenso wird die Routine auch aufgerufen, wenn die Spannung an dem Spannungsteiler R1/R2 auf Low Level geht. Hierdurch wird der folgende Programmteil durchlaufen und die entsprechenden Werte des jeweiligen Chip ins EEPROM geschrieben.

if (((PINA&(1<<PINA0))==0))
{ /* Power fail signal */
uint8_t		i;
cli();									/* disable any interrupt */
eeprom_update_byte((uint8_t *)0,0x0);	/*clear the magic number */
for (i=0;i<sizeof(Register_state);i++)
  {
  eeprom_update_byte((uint8_t *)(i+1),Register_state[i]);
  }
eeprom_update_byte((uint8_t *)0,0x55); /*value is now valid */
software_reset();		 /* Wait until the the system get reset (or power off)  */
}

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 Tobias Mueller ist hier ein nützliches Werkzeug.

Fuse Bits

Fuse Bit des Controllers

Der Controller verwendet nur BODLEVEL von 4.3 Volt. Bei Erreichen dieser Versorgungsspannung wird der Controller automatisch in den Reset-Modus gesetzt. Der Watchdog wird per Software eingeschaltet. Die CPU arbeitet mit 8Mhz ohne externen Quarz.

Quellen

Webseite

Datenblätter