main.c-Dateireferenz

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/twi.h>
#include <stdint.h>

Include-Abhängigkeitsdiagramm für main.c:

gehe zum Quellcode dieser Datei

Datenstrukturen

struct  tstMenue
struct  tstZeile

Makrodefinitionen

#define SLAVE_ADD   0x50
#define REGISTER_ANZ   7
#define TWCR_ACK   TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);
#define TWCR_NACK   TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);
#define TWCR_RESET   TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);

Aufzählungen

enum  enRegisterAdr {
  INBuffer = 1, OUTBuffer, INCounter, OUTCounter, PaketReqID,
  Status, GPIO
}

Funktionen

void init_twi_slave (uint8_t adr)
 Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse.
int main (void)
 ISR (TWI_vect)
 Interrupt wird ausgelöst ein Ereigniss auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann ein Statuscode, anhand dessen die Situation festgestellt werden kann.

Variablen

volatile uint8_t register_adr
struct {
   unsigned   bFirstAccess:1
twi_status


Makro-Dokumentation

#define REGISTER_ANZ   7

Definiert in Zeile 23 der Datei main.c.

#define SLAVE_ADD   0x50

Definiert in Zeile 22 der Datei main.c.

Wird benutzt von main().

#define TWCR_ACK   TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);

Definiert in Zeile 29 der Datei main.c.

Wird benutzt von ISR().

#define TWCR_NACK   TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);

Definiert in Zeile 31 der Datei main.c.

#define TWCR_RESET   TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);

Definiert in Zeile 33 der Datei main.c.

Wird benutzt von ISR().


Dokumentation der Aufzählungstypen

enum enRegisterAdr

Aufzählungswerte:
INBuffer 
OUTBuffer 
INCounter 
OUTCounter 
PaketReqID 
Status 
GPIO 

Definiert in Zeile 47 der Datei main.c.


Dokumentation der Funktionen

void init_twi_slave ( uint8_t  adr  ) 

Initaliserung des TWI-Inteface. Muss zu Beginn aufgerufen werden, sowie bei einem Wechsel der Slave Adresse.

Parameter:
adr gewünschte Slave-Adresse

Definiert in Zeile 88 der Datei main.c.

Benutzt register_adr und twi_status.

Wird benutzt von main().

00089 {
00090         TWAR= adr;                                                                                                                                              // Adresse setzen
00091         TWCR &= ~(1<<TWSTA)|(1<<TWSTO);                                                 // START und STOP deaktivieren
00092         TWCR|= (1<<TWEA) | (1<<TWEN) | (1<<TWIE);               // aktivieren von: Acknowledge, Interrupt und TWI 
00093         register_adr=0x00;                                                                                                              // registeradresse zurücksetzen
00094         twi_status.bFirstAccess = 1;                                                                    // erster zugriff nach stop
00095         
00096         DDRB = 0xff;
00097         PORTB = 0x00;
00098         DDRA = 0xff;
00099         PORTA = 0x00;
00100 }

ISR ( TWI_vect   ) 

Interrupt wird ausgelöst ein Ereigniss auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann ein Statuscode, anhand dessen die Situation festgestellt werden kann.

Definiert in Zeile 110 der Datei main.c.

Benutzt GPIO, INBuffer, INCounter, OUTBuffer, OUTCounter, PaketReqID, register_adr, Status, TWCR_ACK, TWCR_RESET und twi_status.

00111 {
00112         uint8_t data = 0;
00113         switch (TW_STATUS)                      // TWI-Statusregister prüfen und nötige Aktion bestimmen 
00114         {       
00115                 case TW_SR_SLA_ACK:             // 0x60 Slave Receiver, wurde adressiert        
00116                         TWCR_ACK;                                               // nächstes Datenbyte empfangen, ACK danach
00117                         PORTA = 0xFC;
00118                         break;
00119                         
00120                 /***   Daten Empfangen   ****/  
00121                 case TW_SR_DATA_ACK:            // 0x80 Slave Receiver,Daten empfangen
00122                         data=TWDR;                                              // Empfangene Daten auslesen
00123                         if(twi_status.bFirstAccess)     // erte Adressierung nach STOP
00124                         {
00125                                 register_adr = data;// Empfangene Register Adresse speciern
00126                                 PORTA = register_adr;
00127                                 twi_status.bFirstAccess = 0;
00128                         }
00129                         else
00130                         {
00131                                 switch( register_adr)
00132                                 {
00133                                         case INBuffer:
00134                                         case OUTBuffer:
00135                                         case INCounter:
00136                                         case OUTCounter:
00137                                         case PaketReqID:
00138                                         case Status:
00139                                         case GPIO:
00140                                                 PORTB = data;
00141                                                 break;
00142                                         default:
00143                                                 PORTB = 0xff;
00144                                 }
00145                                 register_adr++;
00146                         }                                                               
00147                         TWCR_ACK;
00148                         break;
00149                         
00150                 /***   Daten versenden   ***/
00151                 case TW_ST_SLA_ACK:             // 0xA8 Slave Transmitter wurde adressiert
00152                 case TW_ST_DATA_ACK:            // 0xB8 Slave Transmitter, weitere Daten wurden angefordert
00153                         TWCR_ACK;
00154                         break;
00155                         
00156                 case TW_ST_DATA_NACK:           // 0xC0 Keine Daten mehr gefordert 
00157                 case TW_SR_DATA_NACK:           // 0x88 Keine Daten weiteren empfangen
00158                 case TW_ST_LAST_DATA:           // 0xC8  Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received
00159                 case TW_SR_STOP:                                // 0xA0 STOP empfangen
00160                 default:                                                                // alle anderen codes
00161                                 twi_status.bFirstAccess = 1;
00162                                 TWCR_RESET;                             // Übertragung beenden, warten bis zur nächsten Adressierung
00163         } // end switch
00164 }// end ISR

int main ( void   ) 

Definiert in Zeile 72 der Datei main.c.

Benutzt init_twi_slave() und SLAVE_ADD.

00073 {
00074         init_twi_slave(SLAVE_ADD);
00075         sei();
00076         while(1);
00077 }


Variablen-Dokumentation

unsigned bFirstAccess

Definiert in Zeile 43 der Datei main.c.

volatile uint8_t register_adr

Definiert in Zeile 39 der Datei main.c.

Wird benutzt von init_twi_slave() und ISR().

struct { ... } twi_status

Wird benutzt von init_twi_slave() und ISR().


Erzeugt am Thu Oct 18 23:22:14 2007 für nDisply von  doxygen 1.5.1-p1