Forum: Mikrocontroller und Digitale Elektronik Atmega88 als TWI-Slave an NGW100


von Philipp H. (ennox)


Lesenswert?

Hallo Leute,

ich bin derzeit dabei einen ATmega88 als Slave am TWI des NGW100 zu 
betreiben. ER arbeitet rein als TWI-Slave-Empfänger

Das Problem:

Der 88 wird mit der passenden Adresse gefunden, aber speichert keine 
Byts
1
#include <stdint.h>
2
#include <io.h>
3
#include <interrupt.h>
4
#include <delay.h>
5
#include <twi.h>
6
#include <sleep.h>
7
8
uint8_t DMX_senden;
9
uint8_t dmxdata[512];
10
uint16_t dmxbuffer_adr;
11
12
#include <USART.h>
13
#include <TWI_Slave.h>
14
sr(TWI_vect)
15
{
16
  switch (TW_STATUS)
17
  {
18
    case TW_SR_SLA_ACK:
19
  
20
        dmxbuffer_adr=0;  //Speicheradresse zurücksetzten
21
        TWI_Ack;
22
        
23
        
24
    break;
25
    
26
    case TW_SR_DATA_ACK:
27
        
28
      dmxdata[dmxbuffer_adr]=TWDR;  
29
      dmxbuffer_adr++;
30
      TWI_Ack;
31
  
32
    break;
33
      
34
    case TW_SR_STOP:     // Statuswert 0xA0  - Stop wurde empfangen
35
      
36
      DMX_senden=1;      // DMX-Routine freigeben
37
          
38
    break;
39
40
    case TW_BUS_ERROR:
41
42
      
43
44
    break;  
45
46
    default:
47
48
      TWI_Reset;
49
      
50
    break;
51
    return 0;
52
  }
53
}  
54
55
int main(int argc, char **argv)
56
{
57
  
58
  DDRC |= (1<<PIN0)| (1<<PIN2);  // Daten Richtungsregister genereller auf Ausgang gestellt
59
  PORTC = (0<<PORTC0);           // Port C0 - Leitung zum Transmitter gesperrt
60
  Usart_Init (0);              // Usart Inititalisieren mit Vorteiler 0 
61
  TWI_Slave_Adress(0x4b);         // Intialisiere I2C und setzte Adresse
62
  dmxbuffer_adr=0;
63
  sei();                  //*Interrupts global aktiieren        
64
  
65
  //for (uint16_t i=0;i<512;i++)
66
  //{
67
  //  dmxdata[i]=255;
68
  //}
69
70
  while (1)
71
  {
72
    if(DMX_senden ==1)
73
    {
74
      cli();                    // globale Interrupts sperren
75
      _delay_us(90);            // verzögere 90µs DMX-Reset
76
      PORTC = (1<<PORTC0);      // Leitung zum Transmitter freigegeben
77
      _delay_us(10);            // verzögere 50µs
78
      USART_Transmit(0);        // DMX-Gerätetype "Dimmer" - "Startbyte" übertragen
79
      
80
      for (uint16_t i=0; i<= 511;i++)  
81
      {                               //DMX-Daten Kanäle 0 - 512 übertragen
82
        USART_Transmit(dmxdata[i]);  
83
      }                  
84
85
      _delay_us(100);           // verzögere 500µs
86
      PORTC = (0<<PORTC0);      // sperre Leitung zum Transmitter
87
      DMX_senden = 0;           //DMX-Routine sperren
88
      dmxbuffer_adr=0;          //Speicheradresse zurücksetzten
89
      sei();                    // globale Interrupts freigegeben  
90
    }//Ende IF-Bedingung 
91
  }//Ende While-Schleife  
92
  
93
}//Ende Main-Funktion

Der Usartteil funktioniert Problemlos. Nur die Datenanliefrung scheit 
nicht zu funktioniern.Irgentwie scheint die ISR nicht aufgerufen zu 
werden.

Hier mal die Treiber-datei dazu :
1
void TWI_Slave_Adress(uint8_t slave_adress)
2
{
3
  //TWI aktivieren und Adresseinstellung
4
  
5
  //-Programm Code-----------------------------------
6
  //-------------------------------------------------
7
  TWCR |= (1<<TWIE) | (1<<TWEN) | (1<<TWEA);
8
  TWCR &= ~(1<<TWSTA) | (1<<TWSTO);
9
  TWAR = (slave_adress<<1) | (0<<0);
10
  //-------------------------------------------------
11
  //-------------------------------------------------
12
  
13
  //---Erläuterung-----------------------------------
14
  //TWEN = Enable TWI
15
  //TWEA = Enable Acknowledge Bit
16
  //TWIE = Enable Interrupt
17
  //TWAR = Slave Adresse wird gesetzt
18
  //-------------------------------------------------
19
}
20
21
//Makros
22
23
//Acknolage bei Byte empfangen oder erwartet Ack bei gesendetem Byte
24
//-------------------------------------------------------------------
25
                          /*MSB*/                                                                   /*LSB*/
26
#define TWI_Ack TWCR  = (1<<TWINT) | (1<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWWC) | (1<<TWEN) | (1<<TWIE);
27
                           
28
//Not Acknolage nach Byte empfangen oder erwartet Nack bei gesendetem Byte
29
//------------------------------------------------------------------------
30
              /*MSB*/                                                                   /*LSB*/
31
#define TWI_Nack TWCR = (1<<TWINT) | (0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWWC) | (1<<TWEN) | (1<<TWIE);
32
33
//TWI Reset Bitmuster gleich mit TWI_Ack
34
//---------------------------------------
35
              /*MSB*/                                                                   /*LSB*/
36
#define TWI_Reset TWCR  = (1<<7) | (1<<6) | (0<<5) | (0<<4) | (0<<3) | (1<<2) | (1<<0);

Teilweise muss sie zumindest funktionieren da ja der 88 auf dem Bus 
gefunden wird. Bei NGW100 nutzen wir i2cdetect dazu. Die Senderoutine 
wird vom meinem Projektpartner gebaut. ich möchte nur sicher gehen das 
hier der Fehler nicht liegt um bessere Fehlerjagt zu betreiben.

Eventuel weis ja einer von euch was.

Mit freundlichen Grüßen

Philipp

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.