- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 34

Thema: SRF02. Wie ohne Timer Messwert-Abfrage steuern

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.708
    Erstmal vielen Dank Klebwax und Sternthaler für eure Geduld und Ausdauer.
    Soo schwer ist I2C nicht. Ich benutze dazu keine Libraries, die "paar" Zeilen mach ich selber ...
    Klar, das ist der richtige Ansatz. Bisher hatte ich die Anleitungen dazu in der Dokumentation von Fleury undoder von Atmel schon nach den ersten Zeilen wegen massiven Nichtverstehens weggelegt. Sorry. Das hatte mir schon vor vielen Monaten Schwierigkeiten gemacht - damals konnte ich nie schnellere I2C-Taktraten als 100 kHz störungsfrei fahren :-/ Hier bin ich mittlerweile mit so ner Art full speed (ok ok, da gibts natürlich Bremser vom Slave) störungsfrei *lichtblick*

    Grundlagen: Dokumentation zum mega1284 : 8272D–AVR–05/12 und die verwendete Bibliothek von PFleury : i2cmaster.zip

    Euer Entgegenkommen nutze ich mal noch mehr aus und versuche mal langsam mein Nicht-Verständnis abzubauen. Es fängt ja schon mit der von mir verwendeten Bibliothek an (Peter Fleurys I2C Master library).

    Code:
    Erklärung in der Dokumentation zur Bibliothek (siehe obigen Link "... Master lib..") :
    unsigned char i2c_start     (      unsigned char      addr      )      
    
    Issues a start condition and sends address and transfer direction.
    
    Parameters:
            addr     address and transfer direction of I2C device
    
    Return values:
            0     device accessible
            1     failed to access device 
    
    Hier die Startsequenz, stimmt im Wesentlichen mit der Dokumentation zum mega1284 überein.
    /*************************************************************************    
      Issues a start condition and sends address and transfer direction.
      return 0 = device accessible, 1= failed to access device
    *************************************************************************/
    unsigned char i2c_start(unsigned char address)
    {
        uint8_t   twst;
    
        // send START condition
        TWCR = (1<<TWINT) | (1<<TWSTA) | (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_START) && (twst != TW_REP_START)) return 1;
    
        // send device address
        TWDR = address;
        TWCR = (1<<TWINT) | (1<<TWEN);
    
        // wail until transmission completed and ACK/NACK has been received
        while(!(TWCR & (1<<TWINT)));
    
        // check value of TWI Status Register. Mask prescaler bits.
        twst = TW_STATUS & 0xF8;
        if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
    
        return 0;
    
    }/* i2c_start */
    
    /*************************************************************************
    Hier fehlt >für mich< schon mal der Wert für TW_STATUS. In der Atmeldokumentation steht dazu TWSR z.B. auf Seite 220 bei Check value of TWI Status Register :

    Code:
    if ((TWSR & 0xF8) != START)
    ERROR();
    und pfleury schreibt dazu
    Code:
        // check value of TWI Status Register. Mask prescaler bits
        twst = TW_STATUS & 0xF8;
    In myfile.lls finde ich dazu:
    Code:
        // check value of TWI Status Register. Mask prescaler bits.
        twst = TW_STATUS & 0xF8;
         25c:    80 91 b9 00     lds    r24, 0x00B9
         260:    88 7f           andi    r24, 0xF8    ; 248
        if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
         262:    88 30           cpi    r24, 0x08    ; 8
         264:    21 f0           breq    .+8          ; 0x26e <i2c_start+0x22>
         266:    80 31           cpi    r24, 0x10    ; 16
         268:    11 f0           breq    .+4          ; 0x26e <i2c_start+0x22>
         26a:    81 e0           ldi    r24, 0x01    ; 1
         26c:    08 95           ret
    und weiter oben:
    Code:
    void i2c_init(void)
    {
      /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
      
      TWSR = 0;                         /* no prescaler */
         240:    10 92 b9 00     sts    0x00B9, r1
      TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  /* must be > 10 for stable operation */
         244:    8c e0           ldi    r24, 0x0C    ; 12
         246:    80 93 b8 00     sts    0x00B8, r24
    
    }/* i2c_init */
         24a:    08 95           ret
    Und da setzts bei mir aus - ob das TWIStatusregister TWSR richtig angegeben ist. Und .. ich finde in den Quellen kein define für das TWSR . . .

    Einfach wäre es jetzt im fleury-code das TWI_TW_STATUS durch TWSR zu ersetzen. Aber es wäre eben experimentelle Softwareentwicklung :-/

    Danke im Voraus!

    Nachtrag:
    in der m1284def.inc steht bei "... TWI ..." nur:
    Code:
    ; TWSR - TWI Status Register
    .equ    TWPS0    = 0    ; TWI Prescaler
    .equ    TWPS1    = 1    ; TWI Prescaler
    .equ    TWS3    = 3    ; TWI Status
    .equ    TWS4    = 4    ; TWI Status
    .equ    TWS5    = 5    ; TWI Status
    .equ    TWS6    = 6    ; TWI Status
    .equ    TWS7    = 7    ; TWI Status
    Geändert von oberallgeier (30.09.2014 um 09:53 Uhr) Grund: Auszug aus der m1284def.inc zitiert
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. [ERLEDIGT] Probleme mit IF-Abfrage / Timer
    Von sammler im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 25.04.2011, 11:41
  2. SRF02 über RS232 Beispielcode ohne Funktion?
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 10.05.2009, 14:21
  3. problem mit button-abfrage im timer (c#)
    Von Roboman93 im Forum Open Source Software Projekte
    Antworten: 4
    Letzter Beitrag: 29.12.2008, 17:40
  4. SRF02 Messwert in Millimeter ermitteln
    Von Stiffer im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 29.03.2008, 12:00
  5. Messwert Diagramm erstellen... aber wie?
    Von raptor_79 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 15.11.2007, 08:30

Berechtigungen

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

12V Akku bauen