www.mikrocontroller.net

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


Autor: Philipp H. (ennox)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <stdint.h>
#include <io.h>
#include <interrupt.h>
#include <delay.h>
#include <twi.h>
#include <sleep.h>

uint8_t DMX_senden;
uint8_t dmxdata[512];
uint16_t dmxbuffer_adr;

#include <USART.h>
#include <TWI_Slave.h>
sr(TWI_vect)
{
  switch (TW_STATUS)
  {
    case TW_SR_SLA_ACK:
  
        dmxbuffer_adr=0;  //Speicheradresse zurücksetzten
        TWI_Ack;
        
        
    break;
    
    case TW_SR_DATA_ACK:
        
      dmxdata[dmxbuffer_adr]=TWDR;  
      dmxbuffer_adr++;
      TWI_Ack;
  
    break;
      
    case TW_SR_STOP:     // Statuswert 0xA0  - Stop wurde empfangen
      
      DMX_senden=1;      // DMX-Routine freigeben
          
    break;

    case TW_BUS_ERROR:

      

    break;  

    default:

      TWI_Reset;
      
    break;
    return 0;
  }
}  

int main(int argc, char **argv)
{
  
  DDRC |= (1<<PIN0)| (1<<PIN2);  // Daten Richtungsregister genereller auf Ausgang gestellt
  PORTC = (0<<PORTC0);           // Port C0 - Leitung zum Transmitter gesperrt
  Usart_Init (0);              // Usart Inititalisieren mit Vorteiler 0 
  TWI_Slave_Adress(0x4b);         // Intialisiere I2C und setzte Adresse
  dmxbuffer_adr=0;
  sei();                  //*Interrupts global aktiieren        
  
  //for (uint16_t i=0;i<512;i++)
  //{
  //  dmxdata[i]=255;
  //}

  while (1)
  {
    if(DMX_senden ==1)
    {
      cli();                    // globale Interrupts sperren
      _delay_us(90);            // verzögere 90µs DMX-Reset
      PORTC = (1<<PORTC0);      // Leitung zum Transmitter freigegeben
      _delay_us(10);            // verzögere 50µs
      USART_Transmit(0);        // DMX-Gerätetype "Dimmer" - "Startbyte" übertragen
      
      for (uint16_t i=0; i<= 511;i++)  
      {                               //DMX-Daten Kanäle 0 - 512 übertragen
        USART_Transmit(dmxdata[i]);  
      }                  

      _delay_us(100);           // verzögere 500µs
      PORTC = (0<<PORTC0);      // sperre Leitung zum Transmitter
      DMX_senden = 0;           //DMX-Routine sperren
      dmxbuffer_adr=0;          //Speicheradresse zurücksetzten
      sei();                    // globale Interrupts freigegeben  
    }//Ende IF-Bedingung 
  }//Ende While-Schleife  
  
}//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 :
void TWI_Slave_Adress(uint8_t slave_adress)
{
  //TWI aktivieren und Adresseinstellung
  
  //-Programm Code-----------------------------------
  //-------------------------------------------------
  TWCR |= (1<<TWIE) | (1<<TWEN) | (1<<TWEA);
  TWCR &= ~(1<<TWSTA) | (1<<TWSTO);
  TWAR = (slave_adress<<1) | (0<<0);
  //-------------------------------------------------
  //-------------------------------------------------
  
  //---Erläuterung-----------------------------------
  //TWEN = Enable TWI
  //TWEA = Enable Acknowledge Bit
  //TWIE = Enable Interrupt
  //TWAR = Slave Adresse wird gesetzt
  //-------------------------------------------------
}

//Makros

//Acknolage bei Byte empfangen oder erwartet Ack bei gesendetem Byte
//-------------------------------------------------------------------
                          /*MSB*/                                                                   /*LSB*/
#define TWI_Ack TWCR  = (1<<TWINT) | (1<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWWC) | (1<<TWEN) | (1<<TWIE);
                           
//Not Acknolage nach Byte empfangen oder erwartet Nack bei gesendetem Byte
//------------------------------------------------------------------------
              /*MSB*/                                                                   /*LSB*/
#define TWI_Nack TWCR = (1<<TWINT) | (0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWWC) | (1<<TWEN) | (1<<TWIE);

//TWI Reset Bitmuster gleich mit TWI_Ack
//---------------------------------------
              /*MSB*/                                                                   /*LSB*/
#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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.