www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit TWI-Schnittstelle


Autor: B.L.M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Ich habe folgendes Problem:

Ich möchte mit folgendem Code eine Verbindung und damit eine 
Kommunikation zu einem I2C-bus-Analyzer herstellen.
Leider funktioniert das Programm im vornherein noch nicht ganz.

Fehler:
Beim herunterladen ist ein kurzes aufleuchten der Leds bemerkbar, wobei 
ich eigentlich eine Status-Anzeige des Statusregisters TWSR ausgeben 
möchte. Ich glaube dass das Programm irgendwo stecken bleibt, und zwar 
gleich nach der Initialisierung.
#include <inttypes.h>
#include <avr/io.h>    
#include <avr/delay.h>
#include <util/twi.h> 
#include <stdlib.h>


//-----------------------------------------------------------------------------------------------
// read and write address, A15 is uesd for communication between ATmega128 and DLP-USB245M
#define ADDRESS 0x8000

int SendeByte(unsigned char datenbyte, unsigned char adresse);

//----------------------------------------------------------------------------------------------


void sysinit(void)
{
  SFIOR=SFIOR|0x04;      // interne Pull-Ups abstellen, Seite 70 datenblatt 
  MCUCR=MCUCR|0x80;      // activate the external memory interface, P29
  XMCRA=0x00;          // The entire external memory address space is treated as one sector.
  XMCRB=0x00;          // Writing XMBK to one enables the bus keeper on the AD7:0 lines.
  
  DDRC=0xFF;          // Output
  DDRD=0xFF;          // Output
  DDRB=0xFF;          // Output
  DDRE=0xFF;          // Output
  DDRF=0xFF;          // Output
  PORTB=0x00;
  PORTE=0x00;
  PORTF=0x00;  
  PORTD=0xFF;          // Leds dunkel



  TWAR=0x03;          // Adresse 0x02 = erster und einziger Slave
  TWBR=0x01;          // Bit Rate Register -> SCLf = (CPUf/(16+2(01)*4^1))) = 149kHz
  TWCR=0x45;          // Control Register TWINT / TWEA / TWEN / TWIE -> "high"
//  TWDR=0xFF;          // Data Register
  TWSR=0xF8;          // Status Register

}


// CPUf = 3596400
  
int main(void)
{
  sysinit();
  
  unsigned char adresse, i;
  i=0x01;
  while(1)          //Hauptschleife
  {            
/*    PORTD = 0x01;
    _delay_ms(10);      // Blinklicht test (geht auch nicht)
    PORTD = 0x02;
    _delay_ms(10); */
      
    if(i==0x80) i=0x01;    //wenn am linken Ende, von vorne anfangen
    else i<<=1;        //ansonsten nach links schieben  
    PORTD = TWSR;
    _delay_ms(500);      //500ms warten
    SendeByte(adresse, i);  //Wert an Leds übertragen 
  }

  return 0;
}

int SendeByte(unsigned char datenbyte, unsigned char adresse)
{
  DDRC &= !((1<<DD0)|(1<<DD1));        //SDA und SCL lesen
  PORTC= (1<<DD0)|(1<<DD1);          //und Pullups aktivieren

  TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);    //TWI aktivieren und Start-Kondition auslösen
  while(!(TWCR & (1<<TWINT)));        //warten auf Start-Kondition

//  PORTD = TWSR;
//  _delay_ms(5000);

  if((TWSR & 0xF8) != TWSTA) return 0;    //Wenn keine Start-Kondition gesendet wurde, abbrechen

  
  TWDR=adresse & (0xFE);            //Adresse mit Schreibbit (XXXXXXX0) in Datenregister laden...
  TWCR= ((1<<TWINT)|(1<<TWEN));        //... und senden
  while(!(TWCR & (1<<TWINT)));        //warten auf ACK oder NAK
  if((TWSR & 0xF8) != TW_MT_SLA_ACK) return twiStop();    //Wenn kein Slave reagiert
                    
  TWDR=datenbyte;                //Byte in Datenregister laden...
  TWCR= ((1<<TWINT)|(1<<TWEN));        //... und senden
  while(!(TWCR & (1<<TWINT)));        //warten auf ACK oder NAK
  if((TWSR & 0xF8) != TW_MT_DATA_ACK) return twiStop();    //Wenn nicht von Slave akzeptiert, abbrechen

  TWCR= ((1<<TWINT)|(1<<TWSTO)|(1<<TWEN));  //STOP-Kondition
  return 0;                  
}      


Ich benutze AVR-Studio 4 mit einem STK500 Board und dem STK501 Aufsatz.

Über eine Idee oder einen Lösungsansatz wäre ich sehr froh, denn ich 
sitze nun seit etwa 3 Tagen am gleichen Problem.

Freundliche Grüsse
B.L.M

Autor: B.L.M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt...

Lösung:
SFIOR=SFIOR|0x04;      // interne Pull-Ups abstellen, Seite 70 datenblatt   LÖSCHEN!! 
  MCUCR=MCUCR|0x80;      // activate the external memory interface, P29   LÖSCHEN!!
  XMCRA=0x00;          // The entire external memory address space is treated as one sector.   LÖSCHEN!!    
  XMCRB=0x00;          // Writing XMBK to one enables the bus keeper on the AD7:0 lines.   LÖSCHEN!!
  
  DDRC=0xFF;          
  DDRD=0xFF;          
  DDRB=0xFF;          
  DDRE=0xFF;          
  DDRF=0xFF;          
  PORTB=0x00;
  PORTE=0x00;
  PORTF=0x00;  
  PORTD=0xFF;          // Nur die PORTs angeben die ihr braucht



  TWAR=0x03;          // Adresse 0x02 = erster und einziger Slave
  TWBR=0x01;          // Bit Rate Register -> SCLf = (CPUf/(16+2(01)*4^1))) = 149kHz
  TWCR=0x45;          // Control Register TWINT / TWEA / TWEN / TWIE -> "high"   LÖSCHEN!!
  TWDR=0xFF;          // Data Register   LÖSCHEN!!
  TWSR=0xF8;          // Status Register   LÖSCHEN!! 

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.