Hilfe , asm-core, 2 Arduino verbunden , Taktzyklen messen

Gast #4000367
Lesenswert?
• ▲
▼
hallo,

ich verstehe etwas nicht und bräuchte Hilfe…

Aufbau:
zwei Board Arduino uno, verbunden mit GND, und PIN8 ( bit0 PORTB )
einer sendet eine 0 auf pin 8, der andere empfängt...
nun zähle ich auf beiden Seiten die Schleifendurchläufe ( 2 x 8 bit )
und bekomme extrem unterschiedliche Werte heraus :
Sender äussere Schleife 150, innere 250
Empf.  äussere Schleife 146, innere 145

beide Bords UNO R3 mit 16MHz - selber Hersteller

die Schleifen sind doch identisch programmiert ?  ich verstehe das
gerade nicht mehr, die Unterschiede sind doch recht groß oder nicht ?

hier Sender:

void loop(){

  asm volatile (
    "reset:                              \n\t"
    "       sbis   %[lese],    0         \n\t"
    "       rjmp   reset                 \n\t"
    "       cli                          \n\t"
    "       sbi    %[portdir], 0         \n\t"
    "       cbi    %[port],    0         \n\t"
    "       ldi    r17,        150       \n\t"

    "lp2:   ldi    r16,        250       \n\t"
    "lp1:   sbic   %[lese] ,   0         \n\t"
    "       rjmp   fertig                \n\t"
    "       dec    r16                   \n\t"
    "       brne   lp1                   \n\t"
    "       dec    r17                   \n\t"
    "       brne   lp2                   \n\t"

    "fertig:                             \n\t"
    "       sbi    %[port],    0         \n\t"
    "       cbi    %[portdir], 0         \n\t"
    "       sbi    %[port],    0         \n\t"
    "       sei                          \n\t"
    "end:                                \n\t"

    : [antwort] "+r" (aa)
    : [portdir] "I" (_SFR_IO_ADDR(DDRB)),
      [port]    "I" (_SFR_IO_ADDR(PORTB)),
      [lese]    "I" (_SFR_IO_ADDR(PINB))

    :"r16", "r17", "r18"
 );

  //Serial.println(aa);

  delay(2500);
}


hier Empfänger:

void loop(){

  asm volatile (

    "warte:                              \n\t"
    "       sbic   %[lese],    0         \n\t"
    "       rjmp   warte                 \n\t"
    "       cli                          \n\t"
    "       ldi    r17,        0         \n\t"

    "lp2:   ldi    r16,        0         \n\t"
    "lp1:   sbic   %[lese],    0         \n\t"
    "       rjmp   fertig                \n\t"
    "       inc    r16                   \n\t"
    "       brne   lp1                   \n\t"
    "       inc    r17                   \n\t"
    "       brne   lp2                   \n\t"

   "fertig:                             \n\t"
    "       sei                          \n\t"
    "       mov    %1, r17               \n\t"
    "       mov    %2, r16               \n\t"

    : "+r" (aa), "+r" (bb), "+r" (cc)
    : [portdir] "I" (_SFR_IO_ADDR(DDRB)),
      [port]    "I" (_SFR_IO_ADDR(PORTB)),
      [lese]    "I" (_SFR_IO_ADDR(PINB))
    :
   );


  Serial.println(bb);
  Serial.println(cc);
  Serial.println();



}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.