Forum: Mikrocontroller und Digitale Elektronik Hilfe , asm-core, 2 Arduino verbunden , Taktzyklen messen


von deddi1999 (Gast)


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();



}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.