спасибо вам за столь подробное объяснение. ассемблерный код для меня пока сильно сложен. мне надо время для усворения полученной информации а дальше и до ассемблера доберусь.
F_CPU это как в атмел студии написать "#define F_CPU 9600000"? просто эту запись делает ардуина и нам не показывает?
а что если написать #define F_CPU 4800000 а фьюзы выставить на 9,6 мгц?
ISR(TIM0_OVF_vect){
ovrf++; //Increment counter every 256 clock cycles
}
нашел я этот таймер. получается что что- то подобное есть и у 328 меги и можно милиис и микрос заменять?
2. если написать 4800, а фьюзы выставить на 9600, то миллис будут идти в два раза быстрее
3. да, у 328 есть, в том же файле wiring.c, там с миллис совсем просто, а с микрос - сильно сложнее. На ресурсах 328ой лучше пользоваться миллис и микрос.
---------------------
и 4. так сказать "бонусом" - тинька13 это уже совсем ужос-ужос, берите хоть 85-ую. Программирование тиньки13 это уже, скорее, учебная задача, на умение сократить размер кода. Практического смысла ровно НОЛЬ. Так уж прогресс устроен. Мастеров по ремонту карет уже нет, как и по пошиву цилиндров.
Програмист - пусть удобно пишет, а разработчики процессоров и контроллеров сделают камень за меньшие деньги с большими ресурсами.
Вот, как обещал, ассемблер кода.
Чтобы получить его нужно:
1.посмотреть подробный вывод при компиляции (Файл-Настройки-Показать подробный вывод);
2. найти временный коталог, куда складываются промежуточные результаты компиляции;
3. найти там файл с расширением .elf (к примеру lalalalala.elf);
4. применить к нему команду <Полный путь до нее>\avr-objdump -S lalalalala.elf >> 123.txt
где 123.txt ЛЮБОЕ имя, куда вы хотите сохранить вывод. Искать команду avr-objdum следует в <путь к ардуино ИДЕ>\hardware\tools\avr\bin
====================================
Если есть впросы по ассемблеру - не стесняйся - объясню, пока трезвый ;). Порядок некоторых строк программы изменил оптимизатор.
Прерывание начинается с серии push и заканчивается серией pop.
Математики, как можно заметить, нет. Как я и писал. Если вызвать миллис и микрос - можешь сам проверить - в коде добавится математика.
kakaat13.ino.elf: file format elf32-avr Disassembly of section .text: 00000000 <__vectors>: 0: 09 c0 rjmp .+18 ; 0x14 <__ctors_end> 2: 2e c0 rjmp .+92 ; 0x60 <__vector_1> 4: 15 c0 rjmp .+42 ; 0x30 <__bad_interrupt> 6: 2a c1 rjmp .+596 ; 0x25c <__vector_3> 8: 13 c0 rjmp .+38 ; 0x30 <__bad_interrupt> a: 12 c0 rjmp .+36 ; 0x30 <__bad_interrupt> c: 11 c0 rjmp .+34 ; 0x30 <__bad_interrupt> e: 10 c0 rjmp .+32 ; 0x30 <__bad_interrupt> 10: 0f c0 rjmp .+30 ; 0x30 <__bad_interrupt> 12: 0e c0 rjmp .+28 ; 0x30 <__bad_interrupt> 00000014 <__ctors_end>: 14: 11 24 eor r1, r1 16: 1f be out 0x3f, r1 ; 63 18: cf e9 ldi r28, 0x9F ; 159 1a: cd bf out 0x3d, r28 ; 61 0000001c <__do_clear_bss>: 1c: 20 e0 ldi r18, 0x00 ; 0 1e: a0 e6 ldi r26, 0x60 ; 96 20: b0 e0 ldi r27, 0x00 ; 0 22: 01 c0 rjmp .+2 ; 0x26 <.do_clear_bss_start> 00000024 <.do_clear_bss_loop>: 24: 1d 92 st X+, r1 00000026 <.do_clear_bss_start>: 26: a5 37 cpi r26, 0x75 ; 117 28: b2 07 cpc r27, r18 2a: e1 f7 brne .-8 ; 0x24 <.do_clear_bss_loop> 2c: 4c d1 rcall .+664 ; 0x2c6 <main> 2e: 4f c1 rjmp .+670 ; 0x2ce <_exit> 00000030 <__bad_interrupt>: 30: e7 cf rjmp .-50 ; 0x0 <__vectors> 00000032 <_Z10CheckValueii>: extern volatile unsigned long ovrf; unsigned long time = 0; bool CheckValue(int base, int value) { int x = base - value; 32: 9c 01 movw r18, r24 34: 26 1b sub r18, r22 36: 37 0b sbc r19, r23 //return ((value == base) || ((value > base) && ((value - base) < 200)) || ((value < base) && ((base - value) < 200))); return ((x >= 0)?(x < DELTA/tous):(-x < DELTA/tous)); 38: 37 ff sbrs r19, 7 3a: 03 c0 rjmp .+6 ; 0x42 <__SREG__+0x3> 3c: 31 95 neg r19 3e: 21 95 neg r18 40: 31 09 sbc r19, r1 42: 81 e0 ldi r24, 0x01 ; 1 44: 27 30 cpi r18, 0x07 ; 7 46: 31 05 cpc r19, r1 48: 08 f0 brcs .+2 ; 0x4c <__SREG__+0xd> 4a: 80 e0 ldi r24, 0x00 ; 0 } 4c: 08 95 ret 0000004e <setup>: void setup() { cli(); 4e: f8 94 cli DDRB |= (1 << PB0); //шестая ножка- выход 50: b8 9a sbi 0x17, 0 ; 23 MCUCR =0x01; 52: 81 e0 ldi r24, 0x01 ; 1 54: 85 bf out 0x35, r24 ; 53 GIMSK = _BV(INT0); 56: 80 e4 ldi r24, 0x40 ; 64 58: 8b bf out 0x3b, r24 ; 59 sei(); 5a: 78 94 sei 5c: 08 95 ret 0000005e <loop>: } void loop() { 5e: 08 95 ret 00000060 <__vector_1>: } ISR(INT0_vect) { 60: 1f 92 push r1 62: 0f 92 push r0 64: 0f b6 in r0, 0x3f ; 63 66: 0f 92 push r0 68: 11 24 eor r1, r1 6a: 8f 92 push r8 6c: 9f 92 push r9 6e: af 92 push r10 70: bf 92 push r11 72: cf 92 push r12 74: df 92 push r13 76: ef 92 push r14 78: ff 92 push r15 7a: 0f 93 push r16 7c: 1f 93 push r17 7e: 2f 93 push r18 80: 3f 93 push r19 82: 4f 93 push r20 84: 5f 93 push r21 86: 6f 93 push r22 88: 7f 93 push r23 8a: 8f 93 push r24 8c: 9f 93 push r25 8e: af 93 push r26 90: bf 93 push r27 92: cf 93 push r28 94: df 93 push r29 96: ef 93 push r30 98: ff 93 push r31 uint32_t cm = ovrf; 9a: c0 90 71 00 lds r12, 0x0071 ; 0x800071 <ovrf> 9e: d0 90 72 00 lds r13, 0x0072 ; 0x800072 <ovrf+0x1> a2: e0 90 73 00 lds r14, 0x0073 ; 0x800073 <ovrf+0x2> a6: f0 90 74 00 lds r15, 0x0074 ; 0x800074 <ovrf+0x3> aa: 80 91 69 00 lds r24, 0x0069 ; 0x800069 <prevtime> ae: 90 91 6a 00 lds r25, 0x006A ; 0x80006a <prevtime+0x1> uint32_t cml = cm; if (!(PINB&(1<<1))) b2: b1 99 sbic 0x16, 1 ; 22 b4: 31 c0 rjmp .+98 ; 0x118 <__stack+0x79> { hilen = cm - prevtime; b6: e6 01 movw r28, r12 b8: c8 1b sub r28, r24 ba: d9 0b sbc r29, r25 bc: d0 93 66 00 sts 0x0066, r29 ; 0x800066 <hilen+0x1> c0: c0 93 65 00 sts 0x0065, r28 ; 0x800065 <hilen> if (CheckValue(loTime/tous, hilen) && CheckValue(2*loTime/tous, lolen)) c4: be 01 movw r22, r28 c6: 8b e0 ldi r24, 0x0B ; 11 c8: 90 e0 ldi r25, 0x00 ; 0 ca: b3 df rcall .-154 ; 0x32 <_Z10CheckValueii> cc: 00 91 67 00 lds r16, 0x0067 ; 0x800067 <lolen> d0: 10 91 68 00 lds r17, 0x0068 ; 0x800068 <lolen+0x1> d4: 80 90 60 00 lds r8, 0x0060 ; 0x800060 <_edata> d8: 90 90 61 00 lds r9, 0x0061 ; 0x800061 <_edata+0x1> dc: a0 90 62 00 lds r10, 0x0062 ; 0x800062 <_edata+0x2> e0: b0 90 63 00 lds r11, 0x0063 ; 0x800063 <_edata+0x3> e4: 88 23 and r24, r24 e6: 09 f4 brne .+2 ; 0xea <__stack+0x4b> e8: 7b c0 rjmp .+246 ; 0x1e0 <__stack+0x141> ea: b8 01 movw r22, r16 ec: 87 e1 ldi r24, 0x17 ; 23 ee: 90 e0 ldi r25, 0x00 ; 0 f0: a0 df rcall .-192 ; 0x32 <_Z10CheckValueii> f2: 88 23 and r24, r24 f4: 09 f4 brne .+2 ; 0xf8 <__stack+0x59> f6: 74 c0 rjmp .+232 ; 0x1e0 <__stack+0x141> { cameCode = (cameCode << 1) | 1; f8: d5 01 movw r26, r10 fa: c4 01 movw r24, r8 fc: 88 0f add r24, r24 fe: 99 1f adc r25, r25 100: aa 1f adc r26, r26 102: bb 1f adc r27, r27 104: 81 60 ori r24, 0x01 ; 1 106: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <_edata> 10a: 90 93 61 00 sts 0x0061, r25 ; 0x800061 <_edata+0x1> 10e: a0 93 62 00 sts 0x0062, r26 ; 0x800062 <_edata+0x2> 112: b0 93 63 00 sts 0x0063, r27 ; 0x800063 <_edata+0x3> 116: 7c c0 rjmp .+248 ; 0x210 <__stack+0x171> cameCounter++; } else cameCounter = 0; } else lolen = cm - prevtime; 118: 96 01 movw r18, r12 11a: 28 1b sub r18, r24 11c: 39 0b sbc r19, r25 11e: 30 93 68 00 sts 0x0068, r19 ; 0x800068 <lolen+0x1> 122: 20 93 67 00 sts 0x0067, r18 ; 0x800067 <lolen> prevtime = cm; 126: c0 92 69 00 sts 0x0069, r12 ; 0x800069 <prevtime> 12a: d0 92 6a 00 sts 0x006A, r13 ; 0x80006a <prevtime+0x1> 12e: e0 92 6b 00 sts 0x006B, r14 ; 0x80006b <prevtime+0x2> 132: f0 92 6c 00 sts 0x006C, r15 ; 0x80006c <prevtime+0x3> if (lolen > 1000/tous && (cameCounter == 24)) 136: 80 91 67 00 lds r24, 0x0067 ; 0x800067 <lolen> 13a: 90 91 68 00 lds r25, 0x0068 ; 0x800068 <lolen+0x1> 13e: 87 97 sbiw r24, 0x27 ; 39 140: c8 f0 brcs .+50 ; 0x174 <__stack+0xd5> 142: 80 91 64 00 lds r24, 0x0064 ; 0x800064 <cameCounter> 146: 88 31 cpi r24, 0x18 ; 24 148: a9 f4 brne .+42 ; 0x174 <__stack+0xd5> { cameCode = cameCode & 0xfff; 14a: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <_edata> 14e: 90 91 61 00 lds r25, 0x0061 ; 0x800061 <_edata+0x1> 152: a0 91 62 00 lds r26, 0x0062 ; 0x800062 <_edata+0x2> 156: b0 91 63 00 lds r27, 0x0063 ; 0x800063 <_edata+0x3> 15a: 9f 70 andi r25, 0x0F ; 15 15c: aa 27 eor r26, r26 15e: bb 27 eor r27, r27 160: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <_edata> 164: 90 93 61 00 sts 0x0061, r25 ; 0x800061 <_edata+0x1> 168: a0 93 62 00 sts 0x0062, r26 ; 0x800062 <_edata+0x2> 16c: b0 93 63 00 sts 0x0063, r27 ; 0x800063 <_edata+0x3> cameCounter = 0; 170: 10 92 64 00 sts 0x0064, r1 ; 0x800064 <cameCounter> } if (cameCode == 1234) 174: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <_edata> 178: 90 91 61 00 lds r25, 0x0061 ; 0x800061 <_edata+0x1> 17c: a0 91 62 00 lds r26, 0x0062 ; 0x800062 <_edata+0x2> 180: b0 91 63 00 lds r27, 0x0063 ; 0x800063 <_edata+0x3> 184: 82 3d cpi r24, 0xD2 ; 210 186: 94 40 sbci r25, 0x04 ; 4 188: a1 05 cpc r26, r1 18a: b1 05 cpc r27, r1 18c: 09 f0 breq .+2 ; 0x190 <__stack+0xf1> 18e: 49 c0 rjmp .+146 ; 0x222 <__stack+0x183> { if(cml - time>200*toms) PINB = (1<<0); 190: 80 91 6d 00 lds r24, 0x006D ; 0x80006d <time> 194: 90 91 6e 00 lds r25, 0x006E ; 0x80006e <time+0x1> 198: a0 91 6f 00 lds r26, 0x006F ; 0x80006f <time+0x2> 19c: b0 91 70 00 lds r27, 0x0070 ; 0x800070 <time+0x3> 1a0: a7 01 movw r20, r14 1a2: 96 01 movw r18, r12 1a4: 28 1b sub r18, r24 1a6: 39 0b sbc r19, r25 1a8: 4a 0b sbc r20, r26 1aa: 5b 0b sbc r21, r27 1ac: da 01 movw r26, r20 1ae: c9 01 movw r24, r18 1b0: 89 3e cpi r24, 0xE9 ; 233 1b2: 9c 41 sbci r25, 0x1C ; 28 1b4: a1 05 cpc r26, r1 1b6: b1 05 cpc r27, r1 1b8: 10 f0 brcs .+4 ; 0x1be <__stack+0x11f> 1ba: 81 e0 ldi r24, 0x01 ; 1 1bc: 86 bb out 0x16, r24 ; 22 time = cml; 1be: c0 92 6d 00 sts 0x006D, r12 ; 0x80006d <time> 1c2: d0 92 6e 00 sts 0x006E, r13 ; 0x80006e <time+0x1> 1c6: e0 92 6f 00 sts 0x006F, r14 ; 0x80006f <time+0x2> 1ca: f0 92 70 00 sts 0x0070, r15 ; 0x800070 <time+0x3> cameCode = 0; 1ce: 10 92 60 00 sts 0x0060, r1 ; 0x800060 <_edata> 1d2: 10 92 61 00 sts 0x0061, r1 ; 0x800061 <_edata+0x1> 1d6: 10 92 62 00 sts 0x0062, r1 ; 0x800062 <_edata+0x2> 1da: 10 92 63 00 sts 0x0063, r1 ; 0x800063 <_edata+0x3> 1de: 21 c0 rjmp .+66 ; 0x222 <__stack+0x183> if (CheckValue(loTime/tous, hilen) && CheckValue(2*loTime/tous, lolen)) { cameCode = (cameCode << 1) | 1; cameCounter++; } else if (CheckValue(2*loTime/tous, hilen) && CheckValue(loTime/tous, lolen)) 1e0: be 01 movw r22, r28 1e2: 87 e1 ldi r24, 0x17 ; 23 1e4: 90 e0 ldi r25, 0x00 ; 0 1e6: 25 df rcall .-438 ; 0x32 <_Z10CheckValueii> 1e8: 88 23 and r24, r24 1ea: c1 f0 breq .+48 ; 0x21c <__stack+0x17d> 1ec: b8 01 movw r22, r16 1ee: 8b e0 ldi r24, 0x0B ; 11 1f0: 90 e0 ldi r25, 0x00 ; 0 1f2: 1f df rcall .-450 ; 0x32 <_Z10CheckValueii> 1f4: 88 23 and r24, r24 1f6: 91 f0 breq .+36 ; 0x21c <__stack+0x17d> { cameCode = (cameCode << 1) | 0; 1f8: 88 0c add r8, r8 1fa: 99 1c adc r9, r9 1fc: aa 1c adc r10, r10 1fe: bb 1c adc r11, r11 200: 80 92 60 00 sts 0x0060, r8 ; 0x800060 <_edata> 204: 90 92 61 00 sts 0x0061, r9 ; 0x800061 <_edata+0x1> 208: a0 92 62 00 sts 0x0062, r10 ; 0x800062 <_edata+0x2> 20c: b0 92 63 00 sts 0x0063, r11 ; 0x800063 <_edata+0x3> cameCounter++; 210: 80 91 64 00 lds r24, 0x0064 ; 0x800064 <cameCounter> 214: 8f 5f subi r24, 0xFF ; 255 216: 80 93 64 00 sts 0x0064, r24 ; 0x800064 <cameCounter> 21a: 85 cf rjmp .-246 ; 0x126 <__stack+0x87> } else cameCounter = 0; 21c: 10 92 64 00 sts 0x0064, r1 ; 0x800064 <cameCounter> 220: 82 cf rjmp .-252 ; 0x126 <__stack+0x87> { if(cml - time>200*toms) PINB = (1<<0); time = cml; cameCode = 0; } } 222: ff 91 pop r31 224: ef 91 pop r30 226: df 91 pop r29 228: cf 91 pop r28 22a: bf 91 pop r27 22c: af 91 pop r26 22e: 9f 91 pop r25 230: 8f 91 pop r24 232: 7f 91 pop r23 234: 6f 91 pop r22 236: 5f 91 pop r21 238: 4f 91 pop r20 23a: 3f 91 pop r19 23c: 2f 91 pop r18 23e: 1f 91 pop r17 240: 0f 91 pop r16 242: ff 90 pop r15 244: ef 90 pop r14 246: df 90 pop r13 248: cf 90 pop r12 24a: bf 90 pop r11 24c: af 90 pop r10 24e: 9f 90 pop r9 250: 8f 90 pop r8 252: 0f 90 pop r0 254: 0f be out 0x3f, r0 ; 63 256: 0f 90 pop r0 258: 1f 90 pop r1 25a: 18 95 reti 0000025c <__vector_3>: */ #include "wiring_private.h" #include <avr/interrupt.h> volatile unsigned long ovrf=0; ISR(TIM0_OVF_vect){ 25c: 1f 92 push r1 25e: 0f 92 push r0 260: 0f b6 in r0, 0x3f ; 63 262: 0f 92 push r0 264: 11 24 eor r1, r1 266: 8f 93 push r24 268: 9f 93 push r25 26a: af 93 push r26 26c: bf 93 push r27 ovrf++; //Increment counter every 256 clock cycles 26e: 80 91 71 00 lds r24, 0x0071 ; 0x800071 <ovrf> 272: 90 91 72 00 lds r25, 0x0072 ; 0x800072 <ovrf+0x1> 276: a0 91 73 00 lds r26, 0x0073 ; 0x800073 <ovrf+0x2> 27a: b0 91 74 00 lds r27, 0x0074 ; 0x800074 <ovrf+0x3> 27e: 01 96 adiw r24, 0x01 ; 1 280: a1 1d adc r26, r1 282: b1 1d adc r27, r1 284: 80 93 71 00 sts 0x0071, r24 ; 0x800071 <ovrf> 288: 90 93 72 00 sts 0x0072, r25 ; 0x800072 <ovrf+0x1> 28c: a0 93 73 00 sts 0x0073, r26 ; 0x800073 <ovrf+0x2> 290: b0 93 74 00 sts 0x0074, r27 ; 0x800074 <ovrf+0x3> } 294: bf 91 pop r27 296: af 91 pop r26 298: 9f 91 pop r25 29a: 8f 91 pop r24 29c: 0f 90 pop r0 29e: 0f be out 0x3f, r0 ; 63 2a0: 0f 90 pop r0 2a2: 1f 90 pop r1 2a4: 18 95 reti 000002a6 <init>: asm __volatile__("1: sbiw %0,1\n\t" "brne 1b" : "=w" (us) : "0" (us)); } void init(){ //Setup timer interrupt and PWM pins TCCR0B |= _BV(CS00); 2a6: 83 b7 in r24, 0x33 ; 51 2a8: 81 60 ori r24, 0x01 ; 1 2aa: 83 bf out 0x33, r24 ; 51 TCCR0A |= _BV(WGM00)|_BV(WGM01); 2ac: 8f b5 in r24, 0x2f ; 47 2ae: 83 60 ori r24, 0x03 ; 3 2b0: 8f bd out 0x2f, r24 ; 47 TIMSK0 |= 2; 2b2: 89 b7 in r24, 0x39 ; 57 2b4: 82 60 ori r24, 0x02 ; 2 2b6: 89 bf out 0x39, r24 ; 57 TCNT0=0; 2b8: 12 be out 0x32, r1 ; 50 sei(); 2ba: 78 94 sei ADMUX=0; 2bc: 17 b8 out 0x07, r1 ; 7 #elif F_CPU <= 1200000 && F_CPU > 200000 ADCSRA |= _BV(ADEN) | _BV(ADPS1); #elif F_CPU > 1200000 && F_CPU < 6400001 ADCSRA |= _BV(ADEN) | _BV(ADPS2); #else ADCSRA |= _BV(ADEN) | _BV(ADPS1) | _BV(ADPS0) | _BV(ADPS2); 2be: 86 b1 in r24, 0x06 ; 6 2c0: 87 68 ori r24, 0x87 ; 135 2c2: 86 b9 out 0x06, r24 ; 6 2c4: 08 95 ret 000002c6 <main>: // GND 4| |5 PB0 (D X) PWM // +----+ */ #include <WProgram.h> int main(){ init(); //Call init routine 2c6: ef df rcall .-34 ; 0x2a6 <init> setup(); //Call user provided setup() 2c8: c2 de rcall .-636 ; 0x4e <setup> while(1){loop();} //Continuiously call user provided loop() 2ca: c9 de rcall .-622 ; 0x5e <loop> 2cc: fe cf rjmp .-4 ; 0x2ca <main+0x4> 000002ce <_exit>: 2ce: f8 94 cli 000002d0 <__stop_program>: 2d0: ff cf rjmp .-2 ; 0x2d0 <__stop_program>спасибо вам за столь подробное объяснение. ассемблерный код для меня пока сильно сложен. мне надо время для усворения полученной информации а дальше и до ассемблера доберусь.
F_CPU это как в атмел студии написать "#define F_CPU 9600000"? просто эту запись делает ардуина и нам не показывает?
а что если написать #define F_CPU 4800000 а фьюзы выставить на 9,6 мгц?
ISR(TIM0_OVF_vect){ ovrf++; //Increment counter every 256 clock cycles }нашел я этот таймер. получается что что- то подобное есть и у 328 меги и можно милиис и микрос заменять?
1. да это просто как дефайн
2. если написать 4800, а фьюзы выставить на 9600, то миллис будут идти в два раза быстрее
3. да, у 328 есть, в том же файле wiring.c, там с миллис совсем просто, а с микрос - сильно сложнее. На ресурсах 328ой лучше пользоваться миллис и микрос.
---------------------
и 4. так сказать "бонусом" - тинька13 это уже совсем ужос-ужос, берите хоть 85-ую. Программирование тиньки13 это уже, скорее, учебная задача, на умение сократить размер кода. Практического смысла ровно НОЛЬ. Так уж прогресс устроен. Мастеров по ремонту карет уже нет, как и по пошиву цилиндров.
Програмист - пусть удобно пишет, а разработчики процессоров и контроллеров сделают камень за меньшие деньги с большими ресурсами.