Der Code ist in ein größeres Programm eingebunden,
prinzipiell sieht er so aus:
Code:
/*                    
* Der ATMEGA 32 wird als Slave konfiguriert, und wartet auf die Anweisungen des Masters.                   *
* Bekommt er eine 11 geschickt, soll der seine Lämpchen blinken lassen, bei einer 00 soll das Lauflicht    *
* gestartet werden.  Unterschreitet die Spannung am AC 2,5V, soll aus dem Programm ausgestiegen werden
*/

#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 160000000UL
#endif
#include <util/delay.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include "outpin.h"         // Lib um Pins ein und aus zu schalten
#include "i2csylvia.h"  // Lib für die I2C übertragung
#include <avr/interrupt.h>  // Externe Interrupts





outpin_t led2;
outpin_t led3;
outpin_t led4;
outpin_t led5;

uint16_t i;

uint8_t Spannung_weg;  //Variable zur Betriebsspannungs anzeigen

int befehl;



void lauflicht(void)
{
	....Code für ein Lauflicht
}


void blinklicht(int n, int ms)
{
	.....Code für Blinklicht
}



// den Befehl ausführen
void takeorder()
{
	TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);   // Clear TWINT to start tranmission, send ACK to receive mor Bits
	while (!(TWCR & (1<<TWINT)));            // Wait for TWIN flag is set.This indicates that
	                                           // Data byte has been received, and ACK/NACK has been returned 
	befehl = i2cReadData();
		switch(befehl)
		{
			case 11: blinklicht(2,200);   // wird eine 11 geschikt : 2x langsam blinken
			break;
			case 00: lauflicht();           // bei einer 00 : 2 x lauflicht
			break;
			//default : blinklicht (4,100);   // wird etwas anderes geschickt: schnelles Fehlerblinken
			break;
		}										   
}

int main (void)
{
	DDRB &= ~(1<<PB3); // AIN1 als Eingang initialisieren
	PORTB &=~(1<<PB3); // Sicherheitshalber Pullup abschalten
	
	
	outpin_init(&led2,'A',7);  // Initialisierung der LED`s 2-3 auf Port    Ausgänge 3-7
	outpin_init(&led3,'A',6);
	outpin_init(&led4,'A',4);
	outpin_init(&led5,'A',3);
	
	
	
	sei(); // set enable interrupt --> global interrupts einschalten
	
	i2cinit(16);
	uart_init();
	
	
	
	
	ACSR |= (1<<ACBG);   // AC Auf Interne Referenzspannung (2,56V) umschalten
	ACSR &= ~(1<<ACD);  // AC explizit einschalten
	SFIOR &= ~(1<<ACME);  // AIN1 wird mit dem Invertierten Eingang des Comperators verbunden
	
	TWAR = 0x40;       // Die Slave Adresse wird auf "64" festgelegt
	TWCR = (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO);  // Das Senden der Bestätigungsbits (ACK) zulassen,Start und Stop auf 0 setzen
	TWCR =(1<<TWIE); // Interrupts zulassen
	blinklicht(3,1000);   // 3x langsam Blinken als optische bestätigung, das der Slave wartet
	
while(1)            // In einer Endlosschleife auf die Befehle des Masters warten
	{

	Spannung_weg = ACO;   // Comperator auslesen, sobald die Spannung am Testwiderstand 2,56V unterschreitet, ist ACO auf High (1)
		if(Spannung_weg ==1)  //Wenn die Betriebsspannung weg ist, aus dem Programm ausssteigen
		{
			blinklicht(1,1000);
			break;
		}
		
		
		takeorder();   // Den gesendeten Befehl ausführen	
	}
	
}