Arduino pinlerinde kare dalga üretmek

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,796
Arduino'nun pinlerinin birinde kare dalga üretiyorum ve frekansını ölçüyorum. Burada kullandığım kart Arduino UNO ve varsayılan çalışma frekansı 16 MHz. ilk testte, pinin durumunu digitalWrite fonksiyonu ile değiştiriyorum. Elde edebildiğim frekans değeri 127 kHz gibi.

C++:
#define THEPIN 6

void setup()
{
  pinMode(THEPIN, OUTPUT);
}

void loop()
{
  while (1)
  {
    digitalWrite(THEPIN, 1);
    digitalWrite(THEPIN, 0);
  }
}

a.png
 
Şimdi aynı testi, işlemci portlarına doğrudan erişerek yapalım. Burada 6 numaralı pini kullandım. Şemaya bakınca bunun PORTD ye bağlı olduğunu ve 6'ıncı bit olduğunu görüyorum. Bu porta doğrudan erişerek kare dalga ürettiğimde 4 MHz'e kadar çıkabiliyorum.

1651767621905.png



C++:
#define THEPIN 6

void setup()
{
  pinMode(THEPIN, OUTPUT);
}

void loop()
{
  while (1)
  {
    PORTD = 0x40;
    PORTD = 0x00;
  }
}

a.png
 
Arada neden bu kadar fark olduğunu anlamak için her iki programın da assembly listing dosyasını incelememiz lazım. Önce digitalWrite kullanan programın çıktısına bakalım. Çıktıda programın ana döngüsü 282 - 286 satırları arasında. Döngü içerisinde digitalWrite fonksiyonu çağrılıyor. digitalWrite fonksiyonuna baktığımız zaman ise (84. satırdan itibaren), değişik durumlara göre bir sürü iş yapıldığını görüyoruz. İşte üretebileceğimiz kare dalga frekansını kısıtlayan budur.

Kod:
pintest.ino.elf:     file format elf32-avr


Disassembly of section .text:

00000000 <__vectors>:
   0:    0c 94 5c 00     jmp    0xb8    ; 0xb8 <__ctors_end>
   4:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
   8:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
   c:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  10:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  14:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  18:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  1c:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  20:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  24:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  28:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  2c:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  30:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  34:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  38:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  3c:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  40:    0c 94 b8 00     jmp    0x170    ; 0x170 <__vector_16>
  44:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  48:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  4c:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  50:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  54:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  58:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  5c:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  60:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>
  64:    0c 94 6e 00     jmp    0xdc    ; 0xdc <__bad_interrupt>

00000068 <__trampolines_end>:
  68:    00 00           nop
  6a:    00 00           nop
  6c:    24 00           .word    0x0024    ; ????
  6e:    27 00           .word    0x0027    ; ????
  70:    2a 00           .word    0x002a    ; ????

00000072 <port_to_output_PGM>:
  72:    00 00 00 00 25 00 28 00 2b 00                       ....%.(.+.

0000007c <digital_pin_to_port_PGM>:
  7c:    04 04 04 04 04 04 04 04 02 02 02 02 02 02 03 03     ................
  8c:    03 03 03 03                                         ....

00000090 <digital_pin_to_bit_mask_PGM>:
  90:    01 02 04 08 10 20 40 80 01 02 04 08 10 20 01 02     ..... @...... ..
  a0:    04 08 10 20                                         ...

000000a4 <digital_pin_to_timer_PGM>:
  a4:    00 00 00 08 00 02 01 00 00 03 04 07 00 00 00 00     ................
  b4:    00 00 00 00                                         ....

000000b8 <__ctors_end>:
  b8:    11 24           eor    r1, r1
  ba:    1f be           out    0x3f, r1    ; 63
  bc:    cf ef           ldi    r28, 0xFF    ; 255
  be:    d8 e0           ldi    r29, 0x08    ; 8
  c0:    de bf           out    0x3e, r29    ; 62
  c2:    cd bf           out    0x3d, r28    ; 61

000000c4 <__do_clear_bss>:
  c4:    21 e0           ldi    r18, 0x01    ; 1
  c6:    a0 e0           ldi    r26, 0x00    ; 0
  c8:    b1 e0           ldi    r27, 0x01    ; 1
  ca:    01 c0           rjmp    .+2          ; 0xce <.do_clear_bss_start>

000000cc <.do_clear_bss_loop>:
  cc:    1d 92           st    X+, r1

000000ce <.do_clear_bss_start>:
  ce:    a9 30           cpi    r26, 0x09    ; 9
  d0:    b2 07           cpc    r27, r18
  d2:    e1 f7           brne    .-8          ; 0xcc <.do_clear_bss_loop>
  d4:    0e 94 02 01     call    0x204    ; 0x204 <main>
  d8:    0c 94 67 01     jmp    0x2ce    ; 0x2ce <_exit>

000000dc <__bad_interrupt>:
  dc:    0c 94 00 00     jmp    0    ; 0x0 <__vectors>

000000e0 <digitalWrite.constprop.0>:
  e0:    ea ea           ldi    r30, 0xAA    ; 170
  e2:    f0 e0           ldi    r31, 0x00    ; 0
  e4:    24 91           lpm    r18, Z
  e6:    e6 e9           ldi    r30, 0x96    ; 150
  e8:    f0 e0           ldi    r31, 0x00    ; 0
  ea:    94 91           lpm    r25, Z
  ec:    e2 e8           ldi    r30, 0x82    ; 130
  ee:    f0 e0           ldi    r31, 0x00    ; 0
  f0:    e4 91           lpm    r30, Z
  f2:    ee 23           and    r30, r30
  f4:    c9 f0           breq    .+50         ; 0x128 <digitalWrite.constprop.0+0x48>
  f6:    22 23           and    r18, r18
  f8:    39 f0           breq    .+14         ; 0x108 <digitalWrite.constprop.0+0x28>
  fa:    23 30           cpi    r18, 0x03    ; 3
  fc:    01 f1           breq    .+64         ; 0x13e <digitalWrite.constprop.0+0x5e>
  fe:    a8 f4           brcc    .+42         ; 0x12a <digitalWrite.constprop.0+0x4a>
 100:    21 30           cpi    r18, 0x01    ; 1
 102:    19 f1           breq    .+70         ; 0x14a <digitalWrite.constprop.0+0x6a>
 104:    22 30           cpi    r18, 0x02    ; 2
 106:    29 f1           breq    .+74         ; 0x152 <digitalWrite.constprop.0+0x72>
 108:    f0 e0           ldi    r31, 0x00    ; 0
 10a:    ee 0f           add    r30, r30
 10c:    ff 1f           adc    r31, r31
 10e:    ee 58           subi    r30, 0x8E    ; 142
 110:    ff 4f           sbci    r31, 0xFF    ; 255
 112:    a5 91           lpm    r26, Z+
 114:    b4 91           lpm    r27, Z
 116:    2f b7           in    r18, 0x3f    ; 63
 118:    f8 94           cli
 11a:    ec 91           ld    r30, X
 11c:    81 11           cpse    r24, r1
 11e:    26 c0           rjmp    .+76         ; 0x16c <digitalWrite.constprop.0+0x8c>
 120:    90 95           com    r25
 122:    9e 23           and    r25, r30
 124:    9c 93           st    X, r25
 126:    2f bf           out    0x3f, r18    ; 63
 128:    08 95           ret
 12a:    27 30           cpi    r18, 0x07    ; 7
 12c:    a9 f0           breq    .+42         ; 0x158 <digitalWrite.constprop.0+0x78>
 12e:    28 30           cpi    r18, 0x08    ; 8
 130:    c9 f0           breq    .+50         ; 0x164 <digitalWrite.constprop.0+0x84>
 132:    24 30           cpi    r18, 0x04    ; 4
 134:    49 f7           brne    .-46         ; 0x108 <digitalWrite.constprop.0+0x28>
 136:    20 91 80 00     lds    r18, 0x0080    ; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 13a:    2f 7d           andi    r18, 0xDF    ; 223
 13c:    03 c0           rjmp    .+6          ; 0x144 <digitalWrite.constprop.0+0x64>
 13e:    20 91 80 00     lds    r18, 0x0080    ; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 142:    2f 77           andi    r18, 0x7F    ; 127
 144:    20 93 80 00     sts    0x0080, r18    ; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 148:    df cf           rjmp    .-66         ; 0x108 <digitalWrite.constprop.0+0x28>
 14a:    24 b5           in    r18, 0x24    ; 36
 14c:    2f 77           andi    r18, 0x7F    ; 127
 14e:    24 bd           out    0x24, r18    ; 36
 150:    db cf           rjmp    .-74         ; 0x108 <digitalWrite.constprop.0+0x28>
 152:    24 b5           in    r18, 0x24    ; 36
 154:    2f 7d           andi    r18, 0xDF    ; 223
 156:    fb cf           rjmp    .-10         ; 0x14e <digitalWrite.constprop.0+0x6e>
 158:    20 91 b0 00     lds    r18, 0x00B0    ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 15c:    2f 77           andi    r18, 0x7F    ; 127
 15e:    20 93 b0 00     sts    0x00B0, r18    ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 162:    d2 cf           rjmp    .-92         ; 0x108 <digitalWrite.constprop.0+0x28>
 164:    20 91 b0 00     lds    r18, 0x00B0    ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 168:    2f 7d           andi    r18, 0xDF    ; 223
 16a:    f9 cf           rjmp    .-14         ; 0x15e <digitalWrite.constprop.0+0x7e>
 16c:    9e 2b           or    r25, r30
 16e:    da cf           rjmp    .-76         ; 0x124 <digitalWrite.constprop.0+0x44>

00000170 <__vector_16>:
 170:    1f 92           push    r1
 172:    0f 92           push    r0
 174:    0f b6           in    r0, 0x3f    ; 63
 176:    0f 92           push    r0
 178:    11 24           eor    r1, r1
 17a:    2f 93           push    r18
 17c:    3f 93           push    r19
 17e:    8f 93           push    r24
 180:    9f 93           push    r25
 182:    af 93           push    r26
 184:    bf 93           push    r27
 186:    80 91 05 01     lds    r24, 0x0105    ; 0x800105 <timer0_millis>
 18a:    90 91 06 01     lds    r25, 0x0106    ; 0x800106 <timer0_millis+0x1>
 18e:    a0 91 07 01     lds    r26, 0x0107    ; 0x800107 <timer0_millis+0x2>
 192:    b0 91 08 01     lds    r27, 0x0108    ; 0x800108 <timer0_millis+0x3>
 196:    30 91 04 01     lds    r19, 0x0104    ; 0x800104 <timer0_fract>
 19a:    23 e0           ldi    r18, 0x03    ; 3
 19c:    23 0f           add    r18, r19
 19e:    2d 37           cpi    r18, 0x7D    ; 125
 1a0:    58 f5           brcc    .+86         ; 0x1f8 <__vector_16+0x88>
 1a2:    01 96           adiw    r24, 0x01    ; 1
 1a4:    a1 1d           adc    r26, r1
 1a6:    b1 1d           adc    r27, r1
 1a8:    20 93 04 01     sts    0x0104, r18    ; 0x800104 <timer0_fract>
 1ac:    80 93 05 01     sts    0x0105, r24    ; 0x800105 <timer0_millis>
 1b0:    90 93 06 01     sts    0x0106, r25    ; 0x800106 <timer0_millis+0x1>
 1b4:    a0 93 07 01     sts    0x0107, r26    ; 0x800107 <timer0_millis+0x2>
 1b8:    b0 93 08 01     sts    0x0108, r27    ; 0x800108 <timer0_millis+0x3>
 1bc:    80 91 00 01     lds    r24, 0x0100    ; 0x800100 <_edata>
 1c0:    90 91 01 01     lds    r25, 0x0101    ; 0x800101 <_edata+0x1>
 1c4:    a0 91 02 01     lds    r26, 0x0102    ; 0x800102 <_edata+0x2>
 1c8:    b0 91 03 01     lds    r27, 0x0103    ; 0x800103 <_edata+0x3>
 1cc:    01 96           adiw    r24, 0x01    ; 1
 1ce:    a1 1d           adc    r26, r1
 1d0:    b1 1d           adc    r27, r1
 1d2:    80 93 00 01     sts    0x0100, r24    ; 0x800100 <_edata>
 1d6:    90 93 01 01     sts    0x0101, r25    ; 0x800101 <_edata+0x1>
 1da:    a0 93 02 01     sts    0x0102, r26    ; 0x800102 <_edata+0x2>
 1de:    b0 93 03 01     sts    0x0103, r27    ; 0x800103 <_edata+0x3>
 1e2:    bf 91           pop    r27
 1e4:    af 91           pop    r26
 1e6:    9f 91           pop    r25
 1e8:    8f 91           pop    r24
 1ea:    3f 91           pop    r19
 1ec:    2f 91           pop    r18
 1ee:    0f 90           pop    r0
 1f0:    0f be           out    0x3f, r0    ; 63
 1f2:    0f 90           pop    r0
 1f4:    1f 90           pop    r1
 1f6:    18 95           reti
 1f8:    26 e8           ldi    r18, 0x86    ; 134
 1fa:    23 0f           add    r18, r19
 1fc:    02 96           adiw    r24, 0x02    ; 2
 1fe:    a1 1d           adc    r26, r1
 200:    b1 1d           adc    r27, r1
 202:    d2 cf           rjmp    .-92         ; 0x1a8 <__vector_16+0x38>

00000204 <main>:
 204:    78 94           sei
 206:    84 b5           in    r24, 0x24    ; 36
 208:    82 60           ori    r24, 0x02    ; 2
 20a:    84 bd           out    0x24, r24    ; 36
 20c:    84 b5           in    r24, 0x24    ; 36
 20e:    81 60           ori    r24, 0x01    ; 1
 210:    84 bd           out    0x24, r24    ; 36
 212:    85 b5           in    r24, 0x25    ; 37
 214:    82 60           ori    r24, 0x02    ; 2
 216:    85 bd           out    0x25, r24    ; 37
 218:    85 b5           in    r24, 0x25    ; 37
 21a:    81 60           ori    r24, 0x01    ; 1
 21c:    85 bd           out    0x25, r24    ; 37
 21e:    80 91 6e 00     lds    r24, 0x006E    ; 0x80006e <__DATA_REGION_ORIGIN__+0xe>
 222:    81 60           ori    r24, 0x01    ; 1
 224:    80 93 6e 00     sts    0x006E, r24    ; 0x80006e <__DATA_REGION_ORIGIN__+0xe>
 228:    10 92 81 00     sts    0x0081, r1    ; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 22c:    80 91 81 00     lds    r24, 0x0081    ; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 230:    82 60           ori    r24, 0x02    ; 2
 232:    80 93 81 00     sts    0x0081, r24    ; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 236:    80 91 81 00     lds    r24, 0x0081    ; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 23a:    81 60           ori    r24, 0x01    ; 1
 23c:    80 93 81 00     sts    0x0081, r24    ; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 240:    80 91 80 00     lds    r24, 0x0080    ; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 244:    81 60           ori    r24, 0x01    ; 1
 246:    80 93 80 00     sts    0x0080, r24    ; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 24a:    80 91 b1 00     lds    r24, 0x00B1    ; 0x8000b1 <__DATA_REGION_ORIGIN__+0x51>
 24e:    84 60           ori    r24, 0x04    ; 4
 250:    80 93 b1 00     sts    0x00B1, r24    ; 0x8000b1 <__DATA_REGION_ORIGIN__+0x51>
 254:    80 91 b0 00     lds    r24, 0x00B0    ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 258:    81 60           ori    r24, 0x01    ; 1
 25a:    80 93 b0 00     sts    0x00B0, r24    ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 25e:    80 91 7a 00     lds    r24, 0x007A    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 262:    84 60           ori    r24, 0x04    ; 4
 264:    80 93 7a 00     sts    0x007A, r24    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 268:    80 91 7a 00     lds    r24, 0x007A    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 26c:    82 60           ori    r24, 0x02    ; 2
 26e:    80 93 7a 00     sts    0x007A, r24    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 272:    80 91 7a 00     lds    r24, 0x007A    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 276:    81 60           ori    r24, 0x01    ; 1
 278:    80 93 7a 00     sts    0x007A, r24    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 27c:    80 91 7a 00     lds    r24, 0x007A    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 280:    80 68           ori    r24, 0x80    ; 128
 282:    80 93 7a 00     sts    0x007A, r24    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 286:    10 92 c1 00     sts    0x00C1, r1    ; 0x8000c1 <__DATA_REGION_ORIGIN__+0x61>
 28a:    e6 e9           ldi    r30, 0x96    ; 150
 28c:    f0 e0           ldi    r31, 0x00    ; 0
 28e:    24 91           lpm    r18, Z
 290:    e2 e8           ldi    r30, 0x82    ; 130
 292:    f0 e0           ldi    r31, 0x00    ; 0
 294:    84 91           lpm    r24, Z
 296:    88 23           and    r24, r24
 298:    99 f0           breq    .+38         ; 0x2c0 <main+0xbc>
 29a:    90 e0           ldi    r25, 0x00    ; 0
 29c:    88 0f           add    r24, r24
 29e:    99 1f           adc    r25, r25
 2a0:    fc 01           movw    r30, r24
 2a2:    e8 59           subi    r30, 0x98    ; 152
 2a4:    ff 4f           sbci    r31, 0xFF    ; 255
 2a6:    a5 91           lpm    r26, Z+
 2a8:    b4 91           lpm    r27, Z
 2aa:    fc 01           movw    r30, r24
 2ac:    ee 58           subi    r30, 0x8E    ; 142
 2ae:    ff 4f           sbci    r31, 0xFF    ; 255
 2b0:    85 91           lpm    r24, Z+
 2b2:    94 91           lpm    r25, Z
 2b4:    8f b7           in    r24, 0x3f    ; 63
 2b6:    f8 94           cli
 2b8:    ec 91           ld    r30, X
 2ba:    e2 2b           or    r30, r18
 2bc:    ec 93           st    X, r30
 2be:    8f bf           out    0x3f, r24    ; 63
 2c0:    81 e0           ldi    r24, 0x01    ; 1
 2c2:    0e 94 70 00     call    0xe0    ; 0xe0 <digitalWrite.constprop.0>
 2c6:    80 e0           ldi    r24, 0x00    ; 0
 2c8:    0e 94 70 00     call    0xe0    ; 0xe0 <digitalWrite.constprop.0>
 2cc:    f9 cf           rjmp    .-14         ; 0x2c0 <main+0xbc>

000002ce <_exit>:
 2ce:    f8 94           cli

000002d0 <__stop_program>:
 2d0:    ff cf           rjmp    .-2          ; 0x2d0 <__stop_program>
 
Şimdi aynı programın, portlara doğrudan erişen versiyonunun assemly listing dosyasına bakalım. Burada ana döngü sadece 3 assembly komutundan oluşuyor. Portlara ilgili verileri yazan OUT komutu, ve döngüyü sağlayan RJMP komutu. OUT komutu tek saat döngüsünde tamamlanıyor, RJMP komutu ise iki saat döngüsünde tamamlanıyor. Döngünün tamamı ise toplam 4 saat döngüsünde tamamlanıyor. Saat frekansı da 16 MHz olduğuna göre 4 MHz lik kare dalga elde edebiliyoruz.

Doğrudan assembly dilinde yazmış olsak bile programı, bundan daha iyi bir sonuç elde edemeyiz, çünkü GNU avr-g++ derleyicisi bizim yazdığımız C++ programını olabilecek en optimum assembly programına dönüştürmüş zaten.

Kod:
pintest.ino.elf:     file format elf32-avr


Disassembly of section .text:

00000000 <__vectors>:
   0:    0c 94 52 00     jmp    0xa4    ; 0xa4 <__ctors_end>
   4:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
   8:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
   c:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  10:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  14:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  18:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  1c:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  20:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  24:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  28:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  2c:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  30:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  34:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  38:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  3c:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  40:    0c 94 66 00     jmp    0xcc    ; 0xcc <__vector_16>
  44:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  48:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  4c:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  50:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  54:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  58:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  5c:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  60:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>
  64:    0c 94 64 00     jmp    0xc8    ; 0xc8 <__bad_interrupt>

00000068 <__trampolines_end>:
  68:    00 00           nop
  6a:    00 00           nop
  6c:    25 00           .word    0x0025    ; ????
  6e:    28 00           .word    0x0028    ; ????
  70:    2b 00           .word    0x002b    ; ????

00000072 <port_to_mode_PGM>:
  72:    00 00 00 00 24 00 27 00 2a 00                       ....$.'.*.

0000007c <digital_pin_to_port_PGM>:
  7c:    04 04 04 04 04 04 04 04 02 02 02 02 02 02 03 03     ................
  8c:    03 03 03 03                                         ....

00000090 <digital_pin_to_bit_mask_PGM>:
  90:    01 02 04 08 10 20 40 80 01 02 04 08 10 20 01 02     ..... @...... ..
  a0:    04 08 10 20                                         ...

000000a4 <__ctors_end>:
  a4:    11 24           eor    r1, r1
  a6:    1f be           out    0x3f, r1    ; 63
  a8:    cf ef           ldi    r28, 0xFF    ; 255
  aa:    d8 e0           ldi    r29, 0x08    ; 8
  ac:    de bf           out    0x3e, r29    ; 62
  ae:    cd bf           out    0x3d, r28    ; 61

000000b0 <__do_clear_bss>:
  b0:    21 e0           ldi    r18, 0x01    ; 1
  b2:    a0 e0           ldi    r26, 0x00    ; 0
  b4:    b1 e0           ldi    r27, 0x01    ; 1
  b6:    01 c0           rjmp    .+2          ; 0xba <.do_clear_bss_start>

000000b8 <.do_clear_bss_loop>:
  b8:    1d 92           st    X+, r1

000000ba <.do_clear_bss_start>:
  ba:    a9 30           cpi    r26, 0x09    ; 9
  bc:    b2 07           cpc    r27, r18
  be:    e1 f7           brne    .-8          ; 0xb8 <.do_clear_bss_loop>
  c0:    0e 94 b0 00     call    0x160    ; 0x160 <main>
  c4:    0c 94 12 01     jmp    0x224    ; 0x224 <_exit>

000000c8 <__bad_interrupt>:
  c8:    0c 94 00 00     jmp    0    ; 0x0 <__vectors>

000000cc <__vector_16>:
  cc:    1f 92           push    r1
  ce:    0f 92           push    r0
  d0:    0f b6           in    r0, 0x3f    ; 63
  d2:    0f 92           push    r0
  d4:    11 24           eor    r1, r1
  d6:    2f 93           push    r18
  d8:    3f 93           push    r19
  da:    8f 93           push    r24
  dc:    9f 93           push    r25
  de:    af 93           push    r26
  e0:    bf 93           push    r27
  e2:    80 91 05 01     lds    r24, 0x0105    ; 0x800105 <timer0_millis>
  e6:    90 91 06 01     lds    r25, 0x0106    ; 0x800106 <timer0_millis+0x1>
  ea:    a0 91 07 01     lds    r26, 0x0107    ; 0x800107 <timer0_millis+0x2>
  ee:    b0 91 08 01     lds    r27, 0x0108    ; 0x800108 <timer0_millis+0x3>
  f2:    30 91 04 01     lds    r19, 0x0104    ; 0x800104 <timer0_fract>
  f6:    23 e0           ldi    r18, 0x03    ; 3
  f8:    23 0f           add    r18, r19
  fa:    2d 37           cpi    r18, 0x7D    ; 125
  fc:    58 f5           brcc    .+86         ; 0x154 <__vector_16+0x88>
  fe:    01 96           adiw    r24, 0x01    ; 1
 100:    a1 1d           adc    r26, r1
 102:    b1 1d           adc    r27, r1
 104:    20 93 04 01     sts    0x0104, r18    ; 0x800104 <timer0_fract>
 108:    80 93 05 01     sts    0x0105, r24    ; 0x800105 <timer0_millis>
 10c:    90 93 06 01     sts    0x0106, r25    ; 0x800106 <timer0_millis+0x1>
 110:    a0 93 07 01     sts    0x0107, r26    ; 0x800107 <timer0_millis+0x2>
 114:    b0 93 08 01     sts    0x0108, r27    ; 0x800108 <timer0_millis+0x3>
 118:    80 91 00 01     lds    r24, 0x0100    ; 0x800100 <_edata>
 11c:    90 91 01 01     lds    r25, 0x0101    ; 0x800101 <_edata+0x1>
 120:    a0 91 02 01     lds    r26, 0x0102    ; 0x800102 <_edata+0x2>
 124:    b0 91 03 01     lds    r27, 0x0103    ; 0x800103 <_edata+0x3>
 128:    01 96           adiw    r24, 0x01    ; 1
 12a:    a1 1d           adc    r26, r1
 12c:    b1 1d           adc    r27, r1
 12e:    80 93 00 01     sts    0x0100, r24    ; 0x800100 <_edata>
 132:    90 93 01 01     sts    0x0101, r25    ; 0x800101 <_edata+0x1>
 136:    a0 93 02 01     sts    0x0102, r26    ; 0x800102 <_edata+0x2>
 13a:    b0 93 03 01     sts    0x0103, r27    ; 0x800103 <_edata+0x3>
 13e:    bf 91           pop    r27
 140:    af 91           pop    r26
 142:    9f 91           pop    r25
 144:    8f 91           pop    r24
 146:    3f 91           pop    r19
 148:    2f 91           pop    r18
 14a:    0f 90           pop    r0
 14c:    0f be           out    0x3f, r0    ; 63
 14e:    0f 90           pop    r0
 150:    1f 90           pop    r1
 152:    18 95           reti
 154:    26 e8           ldi    r18, 0x86    ; 134
 156:    23 0f           add    r18, r19
 158:    02 96           adiw    r24, 0x02    ; 2
 15a:    a1 1d           adc    r26, r1
 15c:    b1 1d           adc    r27, r1
 15e:    d2 cf           rjmp    .-92         ; 0x104 <__vector_16+0x38>

00000160 <main>:
 160:    78 94           sei
 162:    84 b5           in    r24, 0x24    ; 36
 164:    82 60           ori    r24, 0x02    ; 2
 166:    84 bd           out    0x24, r24    ; 36
 168:    84 b5           in    r24, 0x24    ; 36
 16a:    81 60           ori    r24, 0x01    ; 1
 16c:    84 bd           out    0x24, r24    ; 36
 16e:    85 b5           in    r24, 0x25    ; 37
 170:    82 60           ori    r24, 0x02    ; 2
 172:    85 bd           out    0x25, r24    ; 37
 174:    85 b5           in    r24, 0x25    ; 37
 176:    81 60           ori    r24, 0x01    ; 1
 178:    85 bd           out    0x25, r24    ; 37
 17a:    80 91 6e 00     lds    r24, 0x006E    ; 0x80006e <__DATA_REGION_ORIGIN__+0xe>
 17e:    81 60           ori    r24, 0x01    ; 1
 180:    80 93 6e 00     sts    0x006E, r24    ; 0x80006e <__DATA_REGION_ORIGIN__+0xe>
 184:    10 92 81 00     sts    0x0081, r1    ; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 188:    80 91 81 00     lds    r24, 0x0081    ; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 18c:    82 60           ori    r24, 0x02    ; 2
 18e:    80 93 81 00     sts    0x0081, r24    ; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 192:    80 91 81 00     lds    r24, 0x0081    ; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 196:    81 60           ori    r24, 0x01    ; 1
 198:    80 93 81 00     sts    0x0081, r24    ; 0x800081 <__DATA_REGION_ORIGIN__+0x21>
 19c:    80 91 80 00     lds    r24, 0x0080    ; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 1a0:    81 60           ori    r24, 0x01    ; 1
 1a2:    80 93 80 00     sts    0x0080, r24    ; 0x800080 <__DATA_REGION_ORIGIN__+0x20>
 1a6:    80 91 b1 00     lds    r24, 0x00B1    ; 0x8000b1 <__DATA_REGION_ORIGIN__+0x51>
 1aa:    84 60           ori    r24, 0x04    ; 4
 1ac:    80 93 b1 00     sts    0x00B1, r24    ; 0x8000b1 <__DATA_REGION_ORIGIN__+0x51>
 1b0:    80 91 b0 00     lds    r24, 0x00B0    ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 1b4:    81 60           ori    r24, 0x01    ; 1
 1b6:    80 93 b0 00     sts    0x00B0, r24    ; 0x8000b0 <__DATA_REGION_ORIGIN__+0x50>
 1ba:    80 91 7a 00     lds    r24, 0x007A    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 1be:    84 60           ori    r24, 0x04    ; 4
 1c0:    80 93 7a 00     sts    0x007A, r24    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 1c4:    80 91 7a 00     lds    r24, 0x007A    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 1c8:    82 60           ori    r24, 0x02    ; 2
 1ca:    80 93 7a 00     sts    0x007A, r24    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 1ce:    80 91 7a 00     lds    r24, 0x007A    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 1d2:    81 60           ori    r24, 0x01    ; 1
 1d4:    80 93 7a 00     sts    0x007A, r24    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 1d8:    80 91 7a 00     lds    r24, 0x007A    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 1dc:    80 68           ori    r24, 0x80    ; 128
 1de:    80 93 7a 00     sts    0x007A, r24    ; 0x80007a <__DATA_REGION_ORIGIN__+0x1a>
 1e2:    10 92 c1 00     sts    0x00C1, r1    ; 0x8000c1 <__DATA_REGION_ORIGIN__+0x61>
 1e6:    e6 e9           ldi    r30, 0x96    ; 150
 1e8:    f0 e0           ldi    r31, 0x00    ; 0
 1ea:    24 91           lpm    r18, Z
 1ec:    e2 e8           ldi    r30, 0x82    ; 130
 1ee:    f0 e0           ldi    r31, 0x00    ; 0
 1f0:    84 91           lpm    r24, Z
 1f2:    88 23           and    r24, r24
 1f4:    99 f0           breq    .+38         ; 0x21c <main+0xbc>
 1f6:    90 e0           ldi    r25, 0x00    ; 0
 1f8:    88 0f           add    r24, r24
 1fa:    99 1f           adc    r25, r25
 1fc:    fc 01           movw    r30, r24
 1fe:    ee 58           subi    r30, 0x8E    ; 142
 200:    ff 4f           sbci    r31, 0xFF    ; 255
 202:    a5 91           lpm    r26, Z+
 204:    b4 91           lpm    r27, Z
 206:    fc 01           movw    r30, r24
 208:    e8 59           subi    r30, 0x98    ; 152
 20a:    ff 4f           sbci    r31, 0xFF    ; 255
 20c:    85 91           lpm    r24, Z+
 20e:    94 91           lpm    r25, Z
 210:    8f b7           in    r24, 0x3f    ; 63
 212:    f8 94           cli
 214:    ec 91           ld    r30, X
 216:    e2 2b           or    r30, r18
 218:    ec 93           st    X, r30
 21a:    8f bf           out    0x3f, r24    ; 63
 21c:    80 e4           ldi    r24, 0x40    ; 64
 21e:    8b b9           out    0x0b, r24    ; 11
 220:    1b b8           out    0x0b, r1    ; 11
 222:    fd cf           rjmp    .-6          ; 0x21e <main+0xbe>

00000224 <_exit>:
 224:    f8 94           cli

00000226 <__stop_program>:
 226:    ff cf           rjmp    .-2          ; 0x226 <__stop_program>
 
Elinize sağlık üstat. Arduino saat hızına göre iyi iş çıkartmış.

Geçen hafta aynı testi ESP8266 ve ESP32 için yapmıştım. Ben de bir iki bulgu paylaşayım:

  • ES8266 (160 MHz) ile pine doğrudan yazınca yaklaşık 5.7, ESP32 (240MHz) ile 10 MHz dalga üretebildi.
  • ESP32 ile PWM sürücüsünü kullanınca da 20 MHZ üretebildim. Dalga formunda ringing daha fazlaydı ama onda problama yöntemimin de etkisi fazla diye düşünüyorum. Rise time 2.5 ns civarındaydı diye hatırlıyorum. 330 Ohm (3.3V/10ma max besleme akımı) ile sonlandırmayı da denedim bir işe yaramadı. Bir ara empedans hesaplamak ile ilgili anlattığınız yöntem ile çıkış empedansını hesaplayıp tekrar deneyeceğim.
  • ESP8266'yı hatırlayamadım ama digitalWrite() kullanınca ESP32 1.25 MHz civarında bir sonuç üretmişti.

Bu arada loop etkisini de belirtmekte fayda var. Aşağıdaki iki kod arasında mantık olarak fark yok diye düşünebilirsiniz. Ama "while" olmadan interpretter stack'de bir üst katmana çıktığından dalgalar arasında uzun bir boşluk oluyor.

Kod:
void loop()
{
  while (1)
  {
    PORTD = 0x40;
    PORTD = 0x00;
  }
}
çıktı:
__-__-

Kod:
void loop()
{
    PORTD = 0x40;
    PORTD = 0x00;
  }
}
Çıktı:
____-____-


a-png.17233


Burada low süresinin high süresine göre uzun olması da ( loop olayına bezer şekilde )kabaca while döngüsünün başına dönmesindeki stack işleminin vakit kaybından. Bu büyük kadar olmasa da bende de oluştu. Ancak kodu şuna benzer bir şekilde yazınca ilginç bir şekilde tamamen ortadan kalktı. Üçüncü low süresinin yine uzun olmasını bekliyordum ama %50 duty ile bozulmadan devam eden bir sinyal oluştu. Emin olmak için referans trace alıp bir periyot kaydırarak kontrol bile ettim. Bire bir örtüştü sinyalin devamı. Sanırım derleyici optimizasyonu ile ilgili bir durum var.

Kod:
void loop()
{
  while (1)
  {
    PORTD = 0x40;
    PORTD = 0x00;
    PORTD = 0x40;
    PORTD = 0x00;
    PORTD = 0x40;
    PORTD = 0x00;
  }
}

Arduino ile de bir deneyebilir misiniz işe yarayacak mı acaba?
 
Arduino'da kare dalgadaki boşluğun sebebi RJMP komutu. Bu komut iki saat döngüsü sürüyor ve bu zaman zarfında da çıkış 0 da kalıyor.

Arduino ile de bir deneyebilir misiniz işe yarayacak mı acaba?

Bu kodu Arduino ile deneyince, beklendiği üzere üç palsten sonra bir boşluk oluşuyor.

a.png
 
ESP32 de böyle bir boşluk olmamasını sebebi çok büyük ihtimalle işlemcinin "pipeline prefetch" yapabilmesi. Yani kodda bir "jump" gerçekleştiğini daha oraya gelmeden anlıyor ve hedef adresten komutları önceden yüklüyor. Dolayısıyla jump komutu efektif olarak sıfır saat döngüsünde gerçekleşiyor.
 
Hakılsınız galiba. Tekrarı iki tur uzatarak biz de ona zaman sağlamış oluyoruz.
 
Hakılsınız galiba. Tekrarı iki tur uzatarak biz de ona zaman sağlamış oluyoruz.

Aslında loop içindeki komut sayısını arttırarak pipeline'ın kritik eşiğe gelmesini sağlıyorsun ve o eşikten sonra da prefetch yapabiliyor.
 
Dalga formunda ringing daha fazlaydı ama onda problama yöntemimin de etkisi fazla diye düşünüyorum.

Ringing büyük ölçüde ground bağlantısının uzun olmasından kaynaklanıyor. Mesela ben şimdi ground teli yerine yaylı ground klipsini kullandım, ringing önemli ölçüde azaldı. Tabi trace uzunluğunun endüktif ve kapasitif etkisi her zaman olacak, o yüzden ringing olayını tam olarak ortadan kaldırmak mümkün değil.

a.png
 
Onu da denedim. Wrover modüllü bir geliştirme kartında 14 numaralı pini kullanmıştım. Hemen bir kaç pin uzağında ground pini vardı. ground kablosunu çıkartıp yaylı klips ile ölçtüm ama çok fark olmadı. Rise time ne ölçüyorsunuz üstat?
 
SDS2504X Plus_PNG_67.png

Geliştirme kartının kendi pin çıkışından yaylı klipsi kullanarak ölçünce yukarıdaki gibi oluyordu.


SDS2504X Plus_PNG_71.png

Haklısınız. Pini ayırmama bile gerek kalmadı. Modülün kendi üzerindeki pinlerden yine yaylı klips ile ölçünce bayağı iyileşti.
 

Forum istatistikleri

Konular
5,838
Mesajlar
99,554
Üyeler
2,479
Son üye
yiyehuoxing32

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top