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 } }






Zitieren

Lesezeichen