mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Master am TWI Bus haengt wenn.


Autor: Axel Krüger (axel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend!

Ich habe 2 Atmega8 mittels TWI verbunden. Derzeit sendet nur der Eine im 
Master Transmitmode.

Das Problem ist, dass sobald ich die Warteschleife von 10ms nach senden 
der Startbedingung auf 9ms verkuerze, dann laeuft der Transfer immernoch 
vollstaendig durch, aber es findet kein weiterer statt - so als ob wie 
Bedingung in der while Schleife nie erfuellt wird.

Kann mir da jemand weiterhelfen? Theoretisch sollte eigentlich garkeine 
Warteschleife vonnoeten sein. Bei einem Controllertakt von 1Mhz 
uebrigends funzt alles bei 28ms delay und bei 27ms nicht mehr....

Hier der Code vom Master:
#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 8000000UL     /* Quarz mit 8 Mhz */
#endif
#include <util/delay.h>
#include <util/twi.h> 
#include <avr/interrupt.h>
#include <stdlib.h> //fuer NULL

//TWI SLAVE EINSTELLUNGEN
#define TWI_BIT_RATE 40
#define TWI_PRESCALER 0
#define TWI_EIGENE_ADRESSE 120  //eigene SLAVE ADRESSE 1...127
#define TWI_ADRESSE_SLAVE 127 

#define TWI_GENERAL_CALL_enable 0 //1=Generral Call enabled / 0=disabled



unsigned char DATENTABELLE [30] [3]; //2 Dimensionales Array - Speicherort aller zu sendenden Daten
#define GOESSE_DATENTABELLE_IN_BYTES 90
unsigned char *LAUFENDER_ZEIGER_AUF_DATENTABELLE = NULL;

unsigned char TWI_EMPFANGENE_DATEN [1] [3]; //2 Dimensionales Array - Speicherort fuer ueber TWI empfangene Daten
unsigned char *LAUFENDER_ZEIGER_AUF_TWI_EMPFANGENE_DATEN = NULL;


unsigned char TWI_BUSY_FLAG = 0;


void init_twi() {  
  TWBR = TWI_BIT_RATE;
  TWSR = TWI_PRESCALER;
  TWAR = (TWI_EIGENE_ADRESSE << 1 | TWI_GENERAL_CALL_enable << TWGCE); 
  TWCR = (0<<TWINT | 1<<TWEA | 1<<TWEN | 1<<TWIE);
}



unsigned char next_byte() {
  unsigned char temp_char = *LAUFENDER_ZEIGER_AUF_DATENTABELLE;
  LAUFENDER_ZEIGER_AUF_DATENTABELLE ++ ; 
  return temp_char;
}



ISR(TWI_vect){ //Two-wire Serial Interface Handler

  switch (TWSR & 0xF8){

    //MASTER TRANSMITTER

    case TW_START: //start condition transmitted 
      //Load SLA + "W"  (W=0)
      TWDR = (127 << 1); //general call
      TWCR = (1<<TWINT) | (1<<TWEN| 1<<TWIE); //send SLA + "W"  (W=0)
      PORTB &= ~(1<<PB5);
      break;

    case TW_MT_SLA_ACK: //SLA+W transmitted, ACK received 
      //Load data byte
      TWDR = next_byte();
      //senden - Clear TWINT                                 
      TWCR = (1<<TWINT) | (1<<TWEN| 1<<TWIE);
      PORTB &= ~(1<<PB4);
      break;

    case TW_MT_DATA_ACK: //data transmitted, ACK received 

      if (LAUFENDER_ZEIGER_AUF_DATENTABELLE > ((&DATENTABELLE[0][0]) + 90)){ //Zeiger ausserhalb der DATENTABLELLE

        //transmit STOP condition
        TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO| 1<<TWIE );
        PORTB &= ~(1<<PB2);
        TWI_BUSY_FLAG = 0;  //es darf erneut gesendet werden
        
      }
      else {
        //Load data byte
          TWDR = next_byte();
          //senden - Clear TWINT                                 
          TWCR = (1<<TWINT) | (1<<TWEN| 1<<TWIE);
        PORTB &= ~(1<<PB3);
          }
      break;

    //ERROR
    PORTD &= ~(1 << PD0);
    

  }
}



void TWI_MASTER_TRANSMITTER(){

  LAUFENDER_ZEIGER_AUF_DATENTABELLE = &DATENTABELLE[0][0]; //Zeiger auf Adresse "DATENTABELLE [0][0]"
  //transmit START condition
  
  PORTB = 0xFF; 
  PORTB &= ~(1<<PB0);
  TWCR = (1<<TWINT|1<<TWSTA|1<<TWEN |1<<TWIE);
   
  _delay_ms(10);
}

 


int main (void) {
  DDRB = 0xFF;  //Alle Pins auf Ausgang
  PORTB = 0xFF;
  DDRD = 0xFF;  //Alle Pins auf Ausgang
  PORTD = 0xFF;
  DDRC = 0x00;  //PORT C alles EINGÄNGE
  

  init_twi();  //TWI INITIALISIERUNG
  _delay_ms(4000);

  sei(); //Interrupts global freigeben

  while (1) {

    if (TWI_BUSY_FLAG == 0) {
      PORTB = 0xFF;
      TWI_BUSY_FLAG = 1;
      TWI_MASTER_TRANSMITTER();
    }


  } //End while
  return 0;
} //End main

gruss Axel

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.