- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 6 von 6

Thema: Status vom TWI beim Senor BMA020

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    36
    Beiträge
    106

    Status vom TWI beim Senor BMA020

    Anzeige

    Praxistest und DIY Projekte
    Guten abend,

    bin mal wieder am verzweifeln.

    Also... Ich versuche einen BMA020 über TWI zu konfigurieren und auszulesen.

    Nun bin ich hergegangen und habe folgenden C-code gebastelt:
    Code:
    /*
     * BMA020.c
     *
     * Created: 26.01.2014 14:28:04
     *  Author: Jimmy
     */ 
    
    
    #include <avr/io.h>
    #include <avr/delay.h>
    #include <util/twi.h>
    
    int main(void)
    {
        
        // Portrichtung
        DDRD=0xFF;
        DDRC &= ~((1<<PC5) | (1<<PC4));
        PORTC|=(1<<PC5) | (1<<PC4);
        _delay_ms(1000);
        DDRB=0xFF;
        
        // TWI Initialisieren
        TWBR=32;
        TWSR=0;
        
        TWCR|=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);    // TWI starten
        while (!(TWCR & (1<<TWINT)));
        
            
        TWDR=0x70;    // Adresse laden (schreiben)
        TWCR|=(1<<TWINT)|(1<<TWEN);    // Adresse senden
        while(!(TWCR&(1<<TWINT)));
        PORTD=TWSR;
        
        TWDR=0x14;    // Zielregister laden
        TWCR|=(1<<TWINT)|(1<<TWEN);    // Zielreigster ansprechen
        while(!(TWCR&(1<<TWINT)));
        
        
        TWDR|=(1<<0);    // Inhalt fürs Register 0x14h laden
        TWCR|=(1<<TWINT)|(1<<TWEN);    // Inhalt senden
        while(!(TWCR&(1<<TWINT)));
        
        TWCR|=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);    // TWI beenden
        while(!(TWCR&(1<<TWINT)));
        
        while(1)
        {
            _delay_ms(1000);
            PORTB|=(1<<PB7);
            _delay_ms(1000);
            PORTB&=~(1<<PB7);
        }
    }
    ähm ja...
    jetzt zu meinem Problemm. Ich verstehe nicht was der TWI da macht, bzw. warum er was falsches macht.

    Laut Datenblatt des BMA020 soll das Protokoll zum Konfigurieren so aussehen:

    TWI starten ---> BMA020-Schreib adresse --> welches Register --> Daten fürs Register --- > TWI Ende

    Jetzt habe ich mit PORTD=TWSR; mir den Status auf eine LED-Anzeige legen lassen.
    Dabei stelle ich folgendes fest:

    Code:
      TWCR|=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);    // TWI starten
        while (!(TWCR & (1<<TWINT)));
    Status nach dem Starten des TWI: 08h

    Code:
     TWDR=0x70;    // Adresse laden (schreiben)
        TWCR|=(1<<TWINT)|(1<<TWEN);    // Adresse senden
        while(!(TWCR&(1<<TWINT)));
        PORTD=TWSR;
    Status nach Senden der Adresse: 18h

    Code:
    TWDR=0x14;    // Zielregister laden
        TWCR|=(1<<TWINT)|(1<<TWEN);    // Zielreigster ansprechen
        while(!(TWCR&(1<<TWINT)));
    Status nach Senden des Zielregister: 10h (hier müsste aber 28h stehen)

    Laut Datenblatt vom ATmega8 sind die 08h und 18h dort wo sie sind richtig.

    Warum sendet der Controller nicht den Inhalt von TWDR wie gefordert, sondern wiederholt den Start des TWI?

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    ... bin ... am verzweifeln ... BMA020 über TWI zu konfigurieren und auszulesen ...
    Der Sterntaler hatte dazu so ein hübsches Codeschnippsel geschrieben das ich später auch bei meinem Übungen genau angesehen hatte. - das erklärt zwar nicht Deine Probleme, aber es läuft und läuft und ... ich habe damit den BMA ausgelesen, umgemodelt - d.h. Register gesetzt - alles problemlos.

    Wo Dein Problem steckt habe ich jetzt (sorry, tut mir leid) garnicht geprüft, vielleicht helfen Dir die Links trotzdem.

    Viel Erfolg
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    36
    Beiträge
    106
    Eigentlich wollte ich ohne eine fremde Bibliothek auskommen. Da zu einem mir eigentlich die Sache klar und logisch schein, sowohl als in eueren Wikis, als auch in meine Büchern.

    Werde mir aber dennoch mal die Bib. zu gemüte führen, vielleicht werde ich dort schlauer.

    EDIT (20:54):

    Ich habe nun den Code von Fleury und mir vergliechen:

    hier der Code zum Schreiben von Fleury:
    Code:
    unsigned char i2c_write( unsigned char data )
    {    
        uint8_t   twst;
        
        // send data to the previously addressed device
        TWDR = data;
        TWCR = (1<<TWINT) | (1<<TWEN);
    
        // wait until transmission completed
        while(!(TWCR & (1<<TWINT)));
    
        // check value of TWI Status Register. Mask prescaler bits
        twst = TW_STATUS & 0xF8;
        if( twst != TW_MT_DATA_ACK) return 1;
        return 0;
    
    }/* i2c_write */

    und hier mein Code:
    Code:
    TWDR=0x14;    // Zielregister laden
        TWCR|=(1<<TWINT)|(1<<TWEN);    // Zielreigster ansprechen
        while(!(TWCR&(1<<TWINT)));
    Der einzigste unterschied, dass Fleury den Status noch als Rückgabewert benutz, um zu signaliesieren, dass eine Übertragung erfolgreich war, oder nicht.
    Geändert von Jimmybot (27.01.2014 um 19:58 Uhr)

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Der einzigste unterschied, dass Fleury den Status noch als Rückgabewert benutz, um zu signaliesieren, dass eine Übertragung erfolgreich war, oder nicht.
    Das sehe ich nicht so.

    Während Peter Fleury dem TWCR einen entsprechenden Wert zuweist, änderst du mit

    TWCR|=(1<<TWINT)|(1<<TWEN);

    nur die beiden Bits TWINT und TWEN. Der Rest steht dann ja noch im TWCR. Oder sollte ich übersehen haben, dass das irgendwo automatisch zurückgesetzt wird.

    sast

    雅思特史特芬
    开发及研究

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    36
    Beiträge
    106
    Das wäre natürlich eine Fehlerquelle. Ich bin mir nicht ganz sicher welchen Zustand TWRC nach dem Ausführen hat. Werde das mal nach der Arbeit mal Zuhause testen.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.04.2010
    Ort
    Im Städtedreieck Köln-Bonn-Aachen
    Alter
    36
    Beiträge
    106
    Tatsächlich das war der Fehler.
    Vielen dank für euere Hilfe.

Ähnliche Themen

  1. Status LED Rot - Beim Programieren
    Von M1C im Forum Asuro
    Antworten: 9
    Letzter Beitrag: 12.07.2009, 16:05
  2. Statusregister (TWSR) TWI beim mega168
    Von bedboy27 im Forum Assembler-Programmierung
    Antworten: 9
    Letzter Beitrag: 23.08.2008, 20:59
  3. USB Status vom ATMEGA im Visual Basic erkennen und überwache
    Von Steffen44 im Forum AVR Hardwarethemen
    Antworten: 0
    Letzter Beitrag: 08.08.2007, 19:12
  4. Antworten: 5
    Letzter Beitrag: 11.08.2005, 20:49
  5. Twi, wie liest der Master vom Bus?
    Von batti112 im Forum C - Programmierung (GCC u.a.)
    Antworten: 14
    Letzter Beitrag: 31.12.2004, 14:59

Berechtigungen

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

LiFePO4 Speicher Test