-
        

Ergebnis 1 bis 1 von 1

Thema: I2C mit Codesys und Atmega32

  1. #1

    I2C mit Codesys und Atmega32

    Anzeige

    Hallo,
    ich habe ein Problem mit meiner I2C Programmierung. Ich soll eine I2C Kommunikaton mit einem Master (BECK Prozessor) und einem Slave ATMEGA32 realisieren. Leider hat mein erster Versuch nicht richtig funktioniert, deshalb habe im 2. Versuch es mit Interruptprogrammierung versucht.

    Auf dem ersten Bild kann man einen Auszug von einem Logikport sehen. Das eigentliche problem ist das es mir nicht möglich ist das erste Datenbyte im Bild 11111111 zu verändern.

    Bild 2 zeigt nur die Codesys Oberfläche.

    Die kommunikation MasterTransmitter -->Slave Receiver funktioniert also einwandfrei.

    Aber die Richtung Slave Transmitter -->Master Receiver funktioniert nicht.

    Code:
    #include<avr/interrupt.h>
    #include<util/twi.h>
    #include<avr/io.h>
    #include<util/delay.h>
    
    
    ISR(TWI_vect)
    {
        switch(TWSR)
        {
            //SR - Slave Receiver
            
            case 0x60: //Der Slave erkennt seine Adresse und erhält die SLA+W Anweisung des Masters. Daraufhin bestätigt er mit ACK
                TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
            break;        
            
            case 0x80: //Der explizit adressierte Slave empfängt das  vom Master gesendete Datenbyte und bestätigt durch ACK.
                   TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA); 
            break;       //Dies wird solange wiederholt, bis die STOP-Bedingung eintrifft.
       
            case 0xA0: //STOP-Bedingung wurde erkannt 
                TWCR=0;
                TWCR=(1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
            break;        
            
            //ST - Slave Transmitter
    
            case 0xA8: //Der Slave erkennt seine Adresse und die SLA+R Anweisung und bestätigt durch ACK.
                TWCR=0;
                TWCR=(1<<TWEN)|(1<<TWEA)|(1<<TWIE)|(1<<TWINT);
            break;    
            
            case 0xB8: //Das in TWDR gespeicherte Byte wurde übertragen und ACK wurde vom Master empfangen.
                //TWCR=0;
                TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);
                TWDR = 0b11110000;
            break;
                
            
            default:
                while(1)
                {
                    asm volatile ("nop");
                }
            break;    
        }
    }
    
    
    int main ()
    {
        sei();
        TWAR=96;
        TWBR=32;
        TWSR=0;
        TWCR=0;
        TWCR=(1<<TWEN)|(1<<TWIE)|(1<<TWEA);
        
        while(1)
        {
            asm volatile ("nop");
        }
    }

    Vielleicht kann jemand mal über meinen C Text gucken und mir sagen warum ich das Datenbyte nicht verändern kann.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Unbenannt1.jpg   Unbenannt2.jpg  
    Geändert von BASTIUniversal (07.04.2011 um 20:09 Uhr)

Ähnliche Themen

  1. I2C an ATMEGA32
    Von WeiserDruide im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 31.07.2010, 13:27
  2. ATMega32 + KTY 81-210
    Von Ratman2000 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 01.09.2008, 18:29
  3. datenaustausch von atmega32 zu atmega32 über spi usw...
    Von roboterheld im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 14.10.2007, 23:39
  4. ATMEGA32 ADC PWM
    Von karthago im Forum C - Programmierung (GCC u.a.)
    Antworten: 22
    Letzter Beitrag: 04.04.2007, 18:23
  5. Speicherplatz des ATmega32 + Display an ATmega32
    Von Rob.Anfänger im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 19.11.2006, 02:59

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •