- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 12

Thema: Atmega: Prozessorauslastung feststellen und Fehlerhandling

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    ... Prozessorauslastung ... auf meinem Atmega ... I2C/UART/SPI läuft im Interrupt ... über fifos gefüttert ...
    Diese Messungen sind so ne Sache.

    Du KÖNNTEST natürlich in jeder ISR zu Beginn ne LED anknippsen und vorm RETI wieder ausmachen. Das wäre ziemlich real, total chaotisch und es fehlt dabei der ISR-Overhead zum Sichern und Wiederbeleben von Registern etc.

    Die andere Möglichkeit ist etwas Handarbeit (Kopfarbeit): in der Datei deinfile.lls steht der komplette Code als Hex, dazu disassembliert - also Mnemonics - und als Assemblercode mit den zugehörigen, absoluten Adressen. Hier kannst Du Dir also anhand der jeweiligen Befehlslaufdauer (Zyklenzahl) und der Anzahl Befehle die benötigte Laufdauer (beachte die Zeit pro Befehl - abhängig vom Quarztakt) von Programmabschnitten, Subroutinen und ISRs errechnen.

    Nachtrag zu Fehlerbehandlung:
    ... Wie macht ihr bsp. das Fehlerhandling bei nicht antwortenden Slaves ...
    Je nach (z.B. I²C-) Bibliothek bzw. Gestaltung der Subroutinen muss evtl. der Hänger abgefangen werden. Und die Fehlererkennung/-meldung/-behandlung geht bei mir z.B. so :
    Code:
        if(!(i2c_start(SLAVE_MoCo+I2C_WRITE))) //Slave bereit zum schreiben?
        {                                   //
          i2cdmy  =  i2c_write (0x01);      // Buffer Startadresse 01 setzen     
          i2cdmy  =  i2c_write (byte1);     //   zum Schreiben. 01 {0, 10}
          i2cdmy  =  i2c_write (byte2);     //
          i2cdmy  =  i2c_write (byte3);     //
                    i2c_stop();             // Zugriff beenden
        }                                   //
        else                                  // Melde jetzt: Kein Byte geschrieben
        {                                     //   und Fehlerblinken
          uputs0("\r\n\tKein I2C-Schreiben möglich.\r\n");     //
          i2cerr      = 0b00000010;           // i2c-write nicht möglich
          for(i=0; i<2; i++)  {               // Fehlermeldung: LED i-fach blinken
            SetBit(PORTC, 2);                 // LED EIN, HELL
            waitms(3);                        // 
            ClrBit(PORTC, 2);                 // LED AUS, Dunkel
        }                   // Ende if(!(i2c_start(SLAVE_MoCo+I2C_WRITE)))
    //      Schreiben an Slave ist erledigt oder nicht - dann Fehlermeldung
    das sieht dann in der *.lls so aus (und da drin stehen dann wirklich auch die entsprechenden Zeilen mit dem Quellcode ! ! !) :
    Code:
        if(!(i2c_start(SLAVE_MoCo+I2C_WRITE))) //Slave bereit zum schreiben?
        1d38:    82 e8           ldi    r24, 0x82    ; 130
        1d3a:    0e 94 6d 00     call    0xda    ; 0xda <i2c_start>
        1d3e:    88 23           and    r24, r24
        1d40:    d9 f5           brne    .+118        ; 0x1db8 <I2CTST01+0x10c>
        {                                   //
          i2cdmy  =  i2c_write (0x01);      // Buffer Startadresse 01 setzen     
        1d42:    81 e0           ldi    r24, 0x01    ; 1
        1d44:    0e 94 c6 00     call    0x18c    ; 0x18c <i2c_write>
          i2cdmy  =  i2c_write (byte1);     //   zum Schreiben. 01 {0, 10}
        1d48:    80 2f           mov    r24, r16
        1d4a:    0e 94 c6 00     call    0x18c    ; 0x18c <i2c_write>
          i2cdmy  =  i2c_write (byte2);     //
        1d4e:    81 2f           mov    r24, r17
        1d50:    0e 94 c6 00     call    0x18c    ; 0x18c <i2c_write>
          i2cdmy  =  i2c_write (byte3);     //
        1d54:    8f 2d           mov    r24, r15
        1d56:    0e 94 c6 00     call    0x18c    ; 0x18c <i2c_write>
     Terminates the data transfer and releases the I2C bus
    *************************************************************************/
    void i2c_stop(void)
    {
        /* send stop condition */
        TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
        1d5a:    60 92 bc 00     sts    0x00BC, r6
        
        // wait until stop condition is executed and bus released
        while(TWCR & (1<<TWSTO));
        1d5e:    80 91 bc 00     lds    r24, 0x00BC
        1d62:    84 fd           sbrc    r24, 4
        1d64:    fc cf           rjmp    .-8          ; 0x1d5e <I2CTST01+0xb2>
                    i2c_stop();             // Zugriff beenden
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          uputs0("\t3 Bytes an Slave\t");    // Melde: Bytes wurden geschrieben an
        1d66:    85 e1           ldi    r24, 0x15    ; 21
        1d68:    94 e0           ldi    r25, 0x04    ; 4
        1d6a:    0e 94 b1 01     call    0x362    ; 0x362 <uputs0_>
          uputs0i (SLAVE_MoCo+I2C_WRITE);     //   Slaveadresse
        1d6e:    82 e8           ldi    r24, 0x82    ; 130
        1d70:    90 e0           ldi    r25, 0x00    ; 0
        1d72:    0e 94 b7 0b     call    0x176e    ; 0x176e <uputs0i>
          uputs0("   =>\t");                 // 
        1d76:    88 e2           ldi    r24, 0x28    ; 40
        1d78:    94 e0           ldi    r25, 0x04    ; 4
        1d7a:    0e 94 b1 01     call    0x362    ; 0x362 <uputs0_>
          uputs0i(byte1);     uputs0("    ");
        1d7e:    80 2f           mov    r24, r16
        1d80:    90 e0           ldi    r25, 0x00    ; 0
        1d82:    0e 94 b7 0b     call    0x176e    ; 0x176e <uputs0i>
        1d86:    8f e2           ldi    r24, 0x2F    ; 47
        1d88:    94 e0           ldi    r25, 0x04    ; 4
        1d8a:    0e 94 b1 01     call    0x362    ; 0x362 <uputs0_>
          uputs0i(byte2);     uputs0("    ");
        1d8e:    81 2f           mov    r24, r17
        1d90:    90 e0           ldi    r25, 0x00    ; 0
        1d92:    0e 94 b7 0b     call    0x176e    ; 0x176e <uputs0i>
        1d96:    8f e2           ldi    r24, 0x2F    ; 47
        1d98:    94 e0           ldi    r25, 0x04    ; 4
        1d9a:    0e 94 b1 01     call    0x362    ; 0x362 <uputs0_>
          uputs0i(byte3);     uputs0("    ");
        1d9e:    8f 2d           mov    r24, r15
        1da0:    90 e0           ldi    r25, 0x00    ; 0
        1da2:    0e 94 b7 0b     call    0x176e    ; 0x176e <uputs0i>
        1da6:    8f e2           ldi    r24, 0x2F    ; 47
        1da8:    94 e0           ldi    r25, 0x04    ; 4
        1daa:    0e 94 b1 01     call    0x362    ; 0x362 <uputs0_>
          uputs0("\r\n");                // Zeilenvorschub
        1dae:    87 e4           ldi    r24, 0x47    ; 71
        1db0:    91 e0           ldi    r25, 0x01    ; 1
        1db2:    0e 94 b1 01     call    0x362    ; 0x362 <uputs0_>
        1db6:    1c c0           rjmp    .+56         ; 0x1df0 <I2CTST01+0x144>
        }                                   //
        else                                  // Melde jetzt: Kein Byte geschrieben
        {                                     //   und Fehlerblinken
          uputs0("\r\n\tKein I2C-Schreiben möglich.\r\n");     //
        1db8:    89 e5           ldi    r24, 0x59    ; 89
        1dba:    94 e0           ldi    r25, 0x04    ; 4
        1dbc:    0e 94 b1 01     call    0x362    ; 0x362 <uputs0_>
          i2cerr      = 0b00000010;           // i2c-write nicht möglich
        1dc0:    30 92 3f 0f     sts    0x0F3F, r3
        1dc4:    20 e0           ldi    r18, 0x00    ; 0
          for(i=0; i<2; i++)  {               // Fehlermeldung: LED i-fach blinken
            SetBit(PORTC, 2);                 // LED EIN, HELL
        1dc6:    42 9a           sbi    0x08, 2    ; 8
        1dc8:    c6 01           movw    r24, r12
        1dca:    01 97           sbiw    r24, 0x01    ; 1
        1dcc:    f1 f7           brne    .-4          ; 0x1dca <I2CTST01+0x11e>
        1dce:    c6 01           movw    r24, r12
        1dd0:    01 97           sbiw    r24, 0x01    ; 1
        1dd2:    f1 f7           brne    .-4          ; 0x1dd0 <I2CTST01+0x124>
        1dd4:    c6 01           movw    r24, r12
        1dd6:    01 97           sbiw    r24, 0x01    ; 1
        1dd8:    f1 f7           brne    .-4          ; 0x1dd6 <I2CTST01+0x12a>
            waitms(3);                        // 
            ClrBit(PORTC, 2);                 // LED AUS, Dunkel
        1dda:    42 98           cbi    0x08, 2    ; 8
        1ddc:    8f e2           ldi    r24, 0x2F    ; 47
        1dde:    90 e0           ldi    r25, 0x00    ; 0
        1de0:    f6 01           movw    r30, r12
        1de2:    31 97           sbiw    r30, 0x01    ; 1
        1de4:    f1 f7           brne    .-4          ; 0x1de2 <I2CTST01+0x136>
    // ============================================================================= =
    // ============================================================================= =
    //### Programm pausieren lassen  !! Der Pausenwert ist nur experimentell !
      void waitms(uint16_t ms)      //
      {                             //
        for(; ms>0; ms--) 
        1de6:    01 97           sbiw    r24, 0x01    ; 1
        1de8:    d9 f7           brne    .-10         ; 0x1de0 <I2CTST01+0x134>
        }                                   //
        else                                  // Melde jetzt: Kein Byte geschrieben
        {                                     //   und Fehlerblinken
          uputs0("\r\n\tKein I2C-Schreiben möglich.\r\n");     //
          i2cerr      = 0b00000010;           // i2c-write nicht möglich
          for(i=0; i<2; i++)  {               // Fehlermeldung: LED i-fach blinken
        1dea:    2f 5f           subi    r18, 0xFF    ; 255
        1dec:    22 30           cpi    r18, 0x02    ; 2
        1dee:    59 f7           brne    .-42         ; 0x1dc6 <I2CTST01+0x11a>
        }                   // Ende if(!(i2c_start(SLAVE_MoCo+I2C_WRITE)))
    //      Schreiben an Slave ist erledigt oder nicht - dann Fehlermeldung
    Geändert von oberallgeier (02.09.2014 um 15:22 Uhr) Grund: Nachtrag zur Fehlerbehandlung
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. Drehbegwegung feststellen ???
    Von opus84 im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 12
    Letzter Beitrag: 02.04.2013, 20:06
  2. Pinchange und Pegel feststellen gleichzeitig...
    Von Willa im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 25.01.2010, 21:03
  3. Drehrichtung feststellen
    Von Static im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 08.04.2006, 16:09
  4. Höhe feststellen
    Von BlackBroom im Forum Sensoren / Sensorik
    Antworten: 9
    Letzter Beitrag: 14.03.2006, 21:06
  5. Windrichtung feststellen
    Von BlackBroom im Forum Sensoren / Sensorik
    Antworten: 30
    Letzter Beitrag: 06.03.2004, 15:56

Berechtigungen

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

LiFePO4 Speicher Test