Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
Милаше
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 76
#1

Делитель частоты (Си, ATmega8A)

07.06.2015, 15:32. Просмотров 2214. Ответов 16
Метки нет (Все метки)

Здравствуйте.
Совсем недавно стал изучать микроконтроллеры семейства AVR.
Мне дали задание - написать программу для программирования счётчика, получить на выходе последовательность импульсов путём деления тактовой частоты.
Не могли бы Вы объяснить, что собственно говоря требуется сделать?
И если возможно, написать какие-нибудь примеры команд для программы.
Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2015, 15:32
Ответы с готовыми решениями:

Счётчик импульсов, полученных делением тактовой частоты (ATmega8A, ASM)
Здравствуйте. Помогите пожалуйста с написанием программы на ассемблере....

Делитель частоты 2:3
Необходимо обработать сигнал (генерируемый таймером 2 на одной из ног МК), и...

Atmega8a ISP 5V
Здравствуйте Можно ли прошивать Atmega8a у которого питание 3.3v,...

БПФ на Atmega8A
Здравствуйте, подскажите пожалуйста, вот в голову пришло сделать гитарный...

Atmega8A-AU + ESP8266
Уважаемые воротилы AVR, у меня к Вам вопрос. Заварганил я значит платку на...

16
raxp
10180 / 6563 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
07.06.2015, 16:06 #2
0
pyzhman
758 / 454 / 63
Регистрация: 15.05.2012
Сообщений: 2,545
08.06.2015, 07:42 #3
Деление тактовой частоты по сути сводится к программным задержкам. Например, так:
C
1
2
3
4
5
while()
{
PORTA.0 = 1;
PORTA.0= 0;
}
0
Voland_
1645 / 992 / 95
Регистрация: 04.01.2010
Сообщений: 3,281
08.06.2015, 09:07 #4
Цитата Сообщение от Милаше Посмотреть сообщение
написать программу для программирования счётчика, получить на выходе последовательность импульсов путём деления тактовой частоты.
какое-то расплывчатое задание. Наверняка, имелся определенный контекст к заданию, который вы упустили. Например, изучаемая тема.

ЗЫ: могу предположить, что "последовательность" импульсов должна быть реализована в виде FSK-модуляции сигнала, который действительно можно реализовать с помощью "деления тактовой частоты". Если я таки буду прав, то ваш руководитель - редкий извращенец ).

ЗЫ2: уточните тип контроллера, характеристики "последовательности импульсов", и программирования "какого именно счетчика" предполагается использовать эту программу.
1
Милаше
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 76
08.06.2015, 21:16  [ТС] #5
Контекст задания был поизучать язык Си для микроконтроллеров

Насколько я понял задание, необходимо с помощью 16-разрядного счётчика просто посчитать количество этих импульсов
0
Valery__
233 / 223 / 146
Регистрация: 19.03.2012
Сообщений: 369
10.06.2015, 15:46 #6
Пример с 8 разрядными счетчиками
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*Пример программы по обработке прераваний от Т0 и Т2 по переполнению*/
#include <mega8.h>
#include <io.h>
 
#define xtal=1000000
#define led1 PORTD.5                 /*светодиод*/
#define led2 PORTD.6                 /*светодиод*/
 
int Svet0=0,Svet1=0;                         /*счетчик*/
 
/*-= Функции =-*/
/*Обработка прерывания от таймера TC0 N 10 по переполнению*/
interrupt [TIM0_OVF] void overflow_timer0(void)
{
    Svet0++;
}
 
/*Обработка прерывания от таймера TC2 N 12*/
interrupt [TIM2_OVF] void overflow_timer2(void)
{
    Svet1++;
}
 
/*-= Oсновная программа =-*/
void main(void)
{
    DDRB = 0xff; /*выходы*/
    DDRC = 0xff; /*выходы*/
    DDRD = 0xff; /*выходы*/
    PORTB = 0xff;
    PORTC = 0x00;
    PORTD = 0x00;  
    /* НАСТРОЙКА РЕГИСТРОВ ДЛЯ РАБОТЫ C TC0 */
    /* Включаем предделитель. Три первых бита регистра управления таймером T0 (TCCR0 - Timer-Counter Control Register 0) 
    устанавливают, на сколько будут делиться импульсы, идущие от тактового генератора к таймеру. */
    TCCR0 |= 0b00000101;  /* 00000101 - 1/1024 ;  00000100 - 1/256 ;  00000011 - 1/64 ;  00000010 - 1/8 ;
                             00000001 - 1/1 (чистые импульсы) ;  00000000 - выключить таймер.*/    
    TCCR2 |= 0b00000101;  /* 00000101 - 1/1024 */                       
    SREG |= 0b10000000;  /* Записываем единичку в 7 бит регистра состояния (SREG - Status Regster) и разрешаем общие прерывания.*/
                             
    TIMSK |= 0b01000001;  /* Записываем единичку в нулевой бит регистра маскирования прерываний от таймеров 
                            (TIMSK - Timer Interrupt Mask Register), и разрешаем прерывания по переполнению таймера T0 и Т2.*/                         
    
    SFIOR = 0b00000001;  /* Записываем единичку в первый бит регистра особых условий ввода-вывода 
                            (SFIOR - Special Function Input-Output Register) и сбрасываем предделитель (не обязательно).*/
    
    TCNT0 = 0;  /* Обнуляем счётный регистр таймера T0 (TCNT0 - Timer-Counter 0) перед началом цикла опроса программных 
                   счётчиков (на всякий случай).*/
    TCNT2 = 0;  /* Обнуляем счётный регистр таймера T2*/
    
    /*Настройка сторожевого таймера*/
    WDTCR = 0b00001000;
 
    while (1)      /*бесконечный цикл*/
    { 
       #asm("wdr");     /*сброс сторожевого таймера*/
       if(Svet0==1)
       {
          if(led1 == 1)
            led1=0;
          else
            led1=1;
          Svet0=0;    
       }
       if(Svet1==20)
       {
          if(led2 == 1)
            led2=0;
          else
            led2=1;
          Svet1=0;    
       }
    };
 
}
1
Миниатюры
Делитель частоты (Си, ATmega8A)  
Вложения
Тип файла: rar Timer.rar (57.6 Кб, 4 просмотров)
Милаше
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 76
10.06.2015, 23:03  [ТС] #7
А различные переменные, типа TIM0_OVF или overflow_timer2, а также имена регистров TCCR0, SFIOR и т.д. - они все берутся из какой-то стандартной библиотеки? или ещё откуда?
Проясните, пожалуйста
0
Valery__
233 / 223 / 146
Регистрация: 19.03.2012
Сообщений: 369
11.06.2015, 10:43 #8
Рекомендую две книги
1.Микроконтроллеры AVR семейства Mega. Руководство пользователя (А.В. Евстифеев, 2007)
2.CodeVisionAVR Пособие для начинающих. (Лебедев М.Б., 2008)
Там много интересного и на доступном языке.
1
Милаше
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 76
13.06.2015, 23:19  [ТС] #9
У меня на AtmelStudio выдаётся ошибка в строчке: #include <mega8.h> при компиляции. Пишет - no such file or directory.
Посоветуйте, что можно сделать.
Я так понимаю, что нужно где-то взять этот файл mega8.h, да? Если так, то не подскажете где, и как его вшить в AtmelStudio?
0
pyzhman
758 / 454 / 63
Регистрация: 15.05.2012
Сообщений: 2,545
14.06.2015, 08:23 #10
Нет, файл mega8.h в студии не поможет. Посмотрите в примерах как задается микроконтроллер и какие используются библиотеки в студии.
0
Милаше
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 76
14.06.2015, 17:15  [ТС] #11
Я дописал в начало
C
1
2
3
#define F_CPU 16000000UL
#include <stdlib.h>
#include <avr/io.h>
Но всё равно выдаются ошибки((

Объясните, пожалуйста, что тут не так.
И как освоиться в AtmelStudio?

Добавлено через 1 час 26 минут
Ну вот, ошибку, о которой писал, устранил.
Не понятно остаётся, как переписать работу со светодиодами в AtmelStudio - может объяснит кто?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/
#include <avr/io.h>
#include <avr/interrupt.h>
#define xtal=1000000
 
#define led1 PORTD5                 /*светодиод*/
#define led2 PORTD6                 /*светодиод*/
int Svet0=0,Svet1=0; 
    
    ISR (TIMER0_OVF_vect)
    {
        Svet0++;
    }
    
//ISR (TIMER2_OVF_vect)
//{
//    Svet1++;
//}
 
/*-= Oсновная программа =-*/
void main(void)
{
    DDRB = 0xff; /*выходы*/
    DDRC = 0xff; /*выходы*/
    DDRD = 0xff; /*выходы*/
    PORTB = 0xff;
    PORTC = 0x00;
    PORTD = 0x00;  
    /* НАСТРОЙКА РЕГИСТРОВ ДЛЯ РАБОТЫ C TC0 */
    /* Включаем предделитель. Три первых бита регистра управления таймером T0 (TCCR0 - Timer-Counter Control Register 0) 
    устанавливают, на сколько будут делиться импульсы, идущие от тактового генератора к таймеру. */
    TCCR0 |= 0b00000101;  /* 00000101 - 1/1024 ;  00000100 - 1/256 ;  00000011 - 1/64 ;  00000010 - 1/8 ;
                             00000001 - 1/1 (чистые импульсы) ;  00000000 - выключить таймер.*/    
    TCCR2 |= 0b00000101;  /* 00000101 - 1/1024 */                       
    SREG |= 0b10000000;  /* Записываем единичку в 7 бит регистра состояния (SREG - Status Regster) и разрешаем общие прерывания.*/
                             
    TIMSK |= 0b01000001;  /* Записываем единичку в нулевой бит регистра маскирования прерываний от таймеров 
                            (TIMSK - Timer Interrupt Mask Register), и разрешаем прерывания по переполнению таймера T0 и Т2.*/                         
    
    SFIOR = 0b00000001;  /* Записываем единичку в первый бит регистра особых условий ввода-вывода 
                            (SFIOR - Special Function Input-Output Register) и сбрасываем предделитель (не обязательно).*/
    
    TCNT0 = 0;  /* Обнуляем счётный регистр таймера T0 (TCNT0 - Timer-Counter 0) перед началом цикла опроса программных 
                   счётчиков (на всякий случай).*/
    TCNT2 = 0;  /* Обнуляем счётный регистр таймера T2*/
    
    /*Настройка сторожевого таймера*/
    WDTCR = 0b00001000;
 
    while (1)      /*бесконечный цикл*/
    { 
       asm("WRD");     /*сброс сторожевого таймера*/
       if(Svet0==1)
       {
          if(led1 == 1)
            led1=0;
          else
            led1=1;
          Svet0=0;    
       }
       if(Svet1==20)
       {
          if(led2 == 1)
            led2=0;
          else
            led2=1;
          Svet1=0;    
       }
    };
 
}
0
Милаше
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 76
04.07.2015, 23:01  [ТС] #12
Valery__, а можно Вас попросить привести пример этой же программы, но написанной на Ассемблере?
0
Valery__
233 / 223 / 146
Регистрация: 19.03.2012
Сообщений: 369
07.07.2015, 18:38 #13
Цитата Сообщение от Милаше Посмотреть сообщение
Valery__, а можно Вас попросить привести пример этой же программы, но написанной на Ассемблере?
К сожалению я не пишу на ассемблере.
0
pyzhman
758 / 454 / 63
Регистрация: 15.05.2012
Сообщений: 2,545
07.07.2015, 22:24 #14
Поройтесь в папке проекта, там есть ассемблерный файл. Правда, редактировать его придётся.
0
Витальич
1260 / 1171 / 173
Регистрация: 02.12.2013
Сообщений: 4,861
07.07.2015, 23:08 #15
Препод сразу просечет, что сишный компилятор листинг создавал
0
Милаше
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 76
08.07.2015, 21:34  [ТС] #16
А Вы не поможете подразобраться, что здесь к чему?
И если не трудно, укажите, пожалуйста, место, где требуется редактирование
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
    #pragma AVRPART ADMIN PART_NAME ATmega8
    #pragma AVRPART MEMORY PROG_FLASH 8192
    #pragma AVRPART MEMORY EEPROM 512
    #pragma AVRPART MEMORY INT_SRAM SIZE 1119
    #pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60
 
    .LISTMAC
    .EQU UDRE=0x5
    .EQU RXC=0x7
    .EQU USR=0xB
    .EQU UDR=0xC
    .EQU SPSR=0xE
    .EQU SPDR=0xF
    .EQU EERE=0x0
    .EQU EEWE=0x1
    .EQU EEMWE=0x2
    .EQU EECR=0x1C
    .EQU EEDR=0x1D
    .EQU EEARL=0x1E
    .EQU EEARH=0x1F
    .EQU WDTCR=0x21
    .EQU MCUCR=0x35
    .EQU GICR=0x3B
    .EQU SPL=0x3D
    .EQU SPH=0x3E
    .EQU SREG=0x3F
 
    .DEF R0X0=R0
    .DEF R0X1=R1
    .DEF R0X2=R2
    .DEF R0X3=R3
    .DEF R0X4=R4
    .DEF R0X5=R5
    .DEF R0X6=R6
    .DEF R0X7=R7
    .DEF R0X8=R8
    .DEF R0X9=R9
    .DEF R0XA=R10
    .DEF R0XB=R11
    .DEF R0XC=R12
    .DEF R0XD=R13
    .DEF R0XE=R14
    .DEF R0XF=R15
    .DEF R0X10=R16
    .DEF R0X11=R17
    .DEF R0X12=R18
    .DEF R0X13=R19
    .DEF R0X14=R20
    .DEF R0X15=R21
    .DEF R0X16=R22
    .DEF R0X17=R23
    .DEF R0X18=R24
    .DEF R0X19=R25
    .DEF R0X1A=R26
    .DEF R0X1B=R27
    .DEF R0X1C=R28
    .DEF R0X1D=R29
    .DEF R0X1E=R30
    .DEF R0X1F=R31
 
    .EQU __SRAM_START=0x0060
    .EQU __SRAM_END=0x045F
    .EQU __DSTACK_SIZE=0x0100
    .EQU __HEAP_SIZE=0x0000
    .EQU __CLEAR_SRAM_SIZE=__SRAM_END-__SRAM_START+1
 
    .MACRO __CPD1N
    CPI  R30,LOW(@0)
    LDI  R26,HIGH(@0)
    CPC  R31,R26
    LDI  R26,BYTE3(@0)
    CPC  R22,R26
    LDI  R26,BYTE4(@0)
    CPC  R23,R26
    .ENDM
 
    .MACRO __CPD2N
    CPI  R26,LOW(@0)
    LDI  R30,HIGH(@0)
    CPC  R27,R30
    LDI  R30,BYTE3(@0)
    CPC  R24,R30
    LDI  R30,BYTE4(@0)
    CPC  R25,R30
    .ENDM
 
    .MACRO __CPWRR
    CP   R@0,R@2
    CPC  R@1,R@3
    .ENDM
 
    .MACRO __CPWRN
    CPI  R@0,LOW(@2)
    LDI  R30,HIGH(@2)
    CPC  R@1,R30
    .ENDM
 
    .MACRO __ADDB1MN
    SUBI R30,LOW(-@0-(@1))
    .ENDM
 
    .MACRO __ADDB2MN
    SUBI R26,LOW(-@0-(@1))
    .ENDM
 
    .MACRO __ADDW1MN
    SUBI R30,LOW(-@0-(@1))
    SBCI R31,HIGH(-@0-(@1))
    .ENDM
 
    .MACRO __ADDW2MN
    SUBI R26,LOW(-@0-(@1))
    SBCI R27,HIGH(-@0-(@1))
    .ENDM
 
    .MACRO __ADDW1FN
    SUBI R30,LOW(-2*@0-(@1))
    SBCI R31,HIGH(-2*@0-(@1))
    .ENDM
 
    .MACRO __ADDD1FN
    SUBI R30,LOW(-2*@0-(@1))
    SBCI R31,HIGH(-2*@0-(@1))
    SBCI R22,BYTE3(-2*@0-(@1))
    .ENDM
 
    .MACRO __ADDD1N
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    SBCI R22,BYTE3(-@0)
    SBCI R23,BYTE4(-@0)
    .ENDM
 
    .MACRO __ADDD2N
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    SBCI R24,BYTE3(-@0)
    SBCI R25,BYTE4(-@0)
    .ENDM
 
    .MACRO __SUBD1N
    SUBI R30,LOW(@0)
    SBCI R31,HIGH(@0)
    SBCI R22,BYTE3(@0)
    SBCI R23,BYTE4(@0)
    .ENDM
 
    .MACRO __SUBD2N
    SUBI R26,LOW(@0)
    SBCI R27,HIGH(@0)
    SBCI R24,BYTE3(@0)
    SBCI R25,BYTE4(@0)
    .ENDM
 
    .MACRO __ANDBMNN
    LDS  R30,@0+(@1)
    ANDI R30,LOW(@2)
    STS  @0+(@1),R30
    .ENDM
 
    .MACRO __ANDWMNN
    LDS  R30,@0+(@1)
    ANDI R30,LOW(@2)
    STS  @0+(@1),R30
    LDS  R30,@0+(@1)+1
    ANDI R30,HIGH(@2)
    STS  @0+(@1)+1,R30
    .ENDM
 
    .MACRO __ANDD1N
    ANDI R30,LOW(@0)
    ANDI R31,HIGH(@0)
    ANDI R22,BYTE3(@0)
    ANDI R23,BYTE4(@0)
    .ENDM
 
    .MACRO __ANDD2N
    ANDI R26,LOW(@0)
    ANDI R27,HIGH(@0)
    ANDI R24,BYTE3(@0)
    ANDI R25,BYTE4(@0)
    .ENDM
 
    .MACRO __ORBMNN
    LDS  R30,@0+(@1)
    ORI  R30,LOW(@2)
    STS  @0+(@1),R30
    .ENDM
 
    .MACRO __ORWMNN
    LDS  R30,@0+(@1)
    ORI  R30,LOW(@2)
    STS  @0+(@1),R30
    LDS  R30,@0+(@1)+1
    ORI  R30,HIGH(@2)
    STS  @0+(@1)+1,R30
    .ENDM
 
    .MACRO __ORD1N
    ORI  R30,LOW(@0)
    ORI  R31,HIGH(@0)
    ORI  R22,BYTE3(@0)
    ORI  R23,BYTE4(@0)
    .ENDM
 
    .MACRO __ORD2N
    ORI  R26,LOW(@0)
    ORI  R27,HIGH(@0)
    ORI  R24,BYTE3(@0)
    ORI  R25,BYTE4(@0)
    .ENDM
 
    .MACRO __DELAY_USB
    LDI  R24,LOW(@0)
__DELAY_USB_LOOP:
    DEC  R24
    BRNE __DELAY_USB_LOOP
    .ENDM
 
    .MACRO __DELAY_USW
    LDI  R24,LOW(@0)
    LDI  R25,HIGH(@0)
__DELAY_USW_LOOP:
    SBIW R24,1
    BRNE __DELAY_USW_LOOP
    .ENDM
 
    .MACRO __GETD1S
    LDD  R30,Y+@0
    LDD  R31,Y+@0+1
    LDD  R22,Y+@0+2
    LDD  R23,Y+@0+3
    .ENDM
 
    .MACRO __GETD2S
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    LDD  R24,Y+@0+2
    LDD  R25,Y+@0+3
    .ENDM
 
    .MACRO __PUTD1S
    STD  Y+@0,R30
    STD  Y+@0+1,R31
    STD  Y+@0+2,R22
    STD  Y+@0+3,R23
    .ENDM
 
    .MACRO __PUTD2S
    STD  Y+@0,R26
    STD  Y+@0+1,R27
    STD  Y+@0+2,R24
    STD  Y+@0+3,R25
    .ENDM
 
    .MACRO __PUTDZ2
    STD  Z+@0,R26
    STD  Z+@0+1,R27
    STD  Z+@0+2,R24
    STD  Z+@0+3,R25
    .ENDM
 
    .MACRO __CLRD1S
    STD  Y+@0,R30
    STD  Y+@0+1,R30
    STD  Y+@0+2,R30
    STD  Y+@0+3,R30
    .ENDM
 
    .MACRO __POINTB1MN
    LDI  R30,LOW(@0+(@1))
    .ENDM
 
    .MACRO __POINTW1MN
    LDI  R30,LOW(@0+(@1))
    LDI  R31,HIGH(@0+(@1))
    .ENDM
 
    .MACRO __POINTD1M
    LDI  R30,LOW(@0)
    LDI  R31,HIGH(@0)
    LDI  R22,BYTE3(@0)
    LDI  R23,BYTE4(@0)
    .ENDM
 
    .MACRO __POINTW1FN
    LDI  R30,LOW(2*@0+(@1))
    LDI  R31,HIGH(2*@0+(@1))
    .ENDM
 
    .MACRO __POINTD1FN
    LDI  R30,LOW(2*@0+(@1))
    LDI  R31,HIGH(2*@0+(@1))
    LDI  R22,BYTE3(2*@0+(@1))
    LDI  R23,BYTE4(2*@0+(@1))
    .ENDM
 
    .MACRO __POINTB2MN
    LDI  R26,LOW(@0+(@1))
    .ENDM
 
    .MACRO __POINTW2MN
    LDI  R26,LOW(@0+(@1))
    LDI  R27,HIGH(@0+(@1))
    .ENDM
 
    .MACRO __POINTW2FN
    LDI  R26,LOW(2*@0+(@1))
    LDI  R27,HIGH(2*@0+(@1))
    .ENDM
 
    .MACRO __POINTD2FN
    LDI  R26,LOW(2*@0+(@1))
    LDI  R27,HIGH(2*@0+(@1))
    LDI  R24,BYTE3(2*@0+(@1))
    LDI  R25,BYTE4(2*@0+(@1))
    .ENDM
 
    .MACRO __POINTBRM
    LDI  R@0,LOW(@1)
    .ENDM
 
    .MACRO __POINTWRM
    LDI  R@0,LOW(@2)
    LDI  R@1,HIGH(@2)
    .ENDM
 
    .MACRO __POINTBRMN
    LDI  R@0,LOW(@1+(@2))
    .ENDM
 
    .MACRO __POINTWRMN
    LDI  R@0,LOW(@2+(@3))
    LDI  R@1,HIGH(@2+(@3))
    .ENDM
 
    .MACRO __POINTWRFN
    LDI  R@0,LOW(@2*2+(@3))
    LDI  R@1,HIGH(@2*2+(@3))
    .ENDM
 
    .MACRO __GETD1N
    LDI  R30,LOW(@0)
    LDI  R31,HIGH(@0)
    LDI  R22,BYTE3(@0)
    LDI  R23,BYTE4(@0)
    .ENDM
 
    .MACRO __GETD2N
    LDI  R26,LOW(@0)
    LDI  R27,HIGH(@0)
    LDI  R24,BYTE3(@0)
    LDI  R25,BYTE4(@0)
    .ENDM
 
    .MACRO __GETB1MN
    LDS  R30,@0+(@1)
    .ENDM
 
    .MACRO __GETB1HMN
    LDS  R31,@0+(@1)
    .ENDM
 
    .MACRO __GETW1MN
    LDS  R30,@0+(@1)
    LDS  R31,@0+(@1)+1
    .ENDM
 
    .MACRO __GETD1MN
    LDS  R30,@0+(@1)
    LDS  R31,@0+(@1)+1
    LDS  R22,@0+(@1)+2
    LDS  R23,@0+(@1)+3
    .ENDM
 
    .MACRO __GETBRMN
    LDS  R@0,@1+(@2)
    .ENDM
 
    .MACRO __GETWRMN
    LDS  R@0,@2+(@3)
    LDS  R@1,@2+(@3)+1
    .ENDM
 
    .MACRO __GETWRZ
    LDD  R@0,Z+@2
    LDD  R@1,Z+@2+1
    .ENDM
 
    .MACRO __GETD2Z
    LDD  R26,Z+@0
    LDD  R27,Z+@0+1
    LDD  R24,Z+@0+2
    LDD  R25,Z+@0+3
    .ENDM
 
    .MACRO __GETB2MN
    LDS  R26,@0+(@1)
    .ENDM
 
    .MACRO __GETW2MN
    LDS  R26,@0+(@1)
    LDS  R27,@0+(@1)+1
    .ENDM
 
    .MACRO __GETD2MN
    LDS  R26,@0+(@1)
    LDS  R27,@0+(@1)+1
    LDS  R24,@0+(@1)+2
    LDS  R25,@0+(@1)+3
    .ENDM
 
    .MACRO __PUTB1MN
    STS  @0+(@1),R30
    .ENDM
 
    .MACRO __PUTW1MN
    STS  @0+(@1),R30
    STS  @0+(@1)+1,R31
    .ENDM
 
    .MACRO __PUTD1MN
    STS  @0+(@1),R30
    STS  @0+(@1)+1,R31
    STS  @0+(@1)+2,R22
    STS  @0+(@1)+3,R23
    .ENDM
 
    .MACRO __PUTB1EN
    LDI  R26,LOW(@0+(@1))
    LDI  R27,HIGH(@0+(@1))
    RCALL __EEPROMWRB
    .ENDM
 
    .MACRO __PUTW1EN
    LDI  R26,LOW(@0+(@1))
    LDI  R27,HIGH(@0+(@1))
    RCALL __EEPROMWRW
    .ENDM
 
    .MACRO __PUTD1EN
    LDI  R26,LOW(@0+(@1))
    LDI  R27,HIGH(@0+(@1))
    RCALL __EEPROMWRD
    .ENDM
 
    .MACRO __PUTBR0MN
    STS  @0+(@1),R0
    .ENDM
 
    .MACRO __PUTBMRN
    STS  @0+(@1),R@2
    .ENDM
 
    .MACRO __PUTWMRN
    STS  @0+(@1),R@2
    STS  @0+(@1)+1,R@3
    .ENDM
 
    .MACRO __PUTBZR
    STD  Z+@1,R@0
    .ENDM
 
    .MACRO __PUTWZR
    STD  Z+@2,R@0
    STD  Z+@2+1,R@1
    .ENDM
 
    .MACRO __GETW1R
    MOV  R30,R@0
    MOV  R31,R@1
    .ENDM
 
    .MACRO __GETW2R
    MOV  R26,R@0
    MOV  R27,R@1
    .ENDM
 
    .MACRO __GETWRN
    LDI  R@0,LOW(@2)
    LDI  R@1,HIGH(@2)
    .ENDM
 
    .MACRO __PUTW1R
    MOV  R@0,R30
    MOV  R@1,R31
    .ENDM
 
    .MACRO __PUTW2R
    MOV  R@0,R26
    MOV  R@1,R27
    .ENDM
 
    .MACRO __ADDWRN
    SUBI R@0,LOW(-@2)
    SBCI R@1,HIGH(-@2)
    .ENDM
 
    .MACRO __ADDWRR
    ADD  R@0,R@2
    ADC  R@1,R@3
    .ENDM
 
    .MACRO __SUBWRN
    SUBI R@0,LOW(@2)
    SBCI R@1,HIGH(@2)
    .ENDM
 
    .MACRO __SUBWRR
    SUB  R@0,R@2
    SBC  R@1,R@3
    .ENDM
 
    .MACRO __ANDWRN
    ANDI R@0,LOW(@2)
    ANDI R@1,HIGH(@2)
    .ENDM
 
    .MACRO __ANDWRR
    AND  R@0,R@2
    AND  R@1,R@3
    .ENDM
 
    .MACRO __ORWRN
    ORI  R@0,LOW(@2)
    ORI  R@1,HIGH(@2)
    .ENDM
 
    .MACRO __ORWRR
    OR   R@0,R@2
    OR   R@1,R@3
    .ENDM
 
    .MACRO __EORWRR
    EOR  R@0,R@2
    EOR  R@1,R@3
    .ENDM
 
    .MACRO __GETWRS
    LDD  R@0,Y+@2
    LDD  R@1,Y+@2+1
    .ENDM
 
    .MACRO __PUTBSR
    STD  Y+@1,R@0
    .ENDM
 
    .MACRO __PUTWSR
    STD  Y+@2,R@0
    STD  Y+@2+1,R@1
    .ENDM
 
    .MACRO __MOVEWRR
    MOV  R@0,R@2
    MOV  R@1,R@3
    .ENDM
 
    .MACRO __INWR
    IN   R@0,@2
    IN   R@1,@2+1
    .ENDM
 
    .MACRO __OUTWR
    OUT  @2+1,R@1
    OUT  @2,R@0
    .ENDM
 
    .MACRO __CALL1MN
    LDS  R30,@0+(@1)
    LDS  R31,@0+(@1)+1
    ICALL
    .ENDM
 
    .MACRO __CALL1FN
    LDI  R30,LOW(2*@0+(@1))
    LDI  R31,HIGH(2*@0+(@1))
    RCALL __GETW1PF
    ICALL
    .ENDM
 
    .MACRO __CALL2EN
    LDI  R26,LOW(@0+(@1))
    LDI  R27,HIGH(@0+(@1))
    RCALL __EEPROMRDW
    ICALL
    .ENDM
 
    .MACRO __GETW1STACK
    IN   R26,SPL
    IN   R27,SPH
    ADIW R26,@0+1
    LD   R30,X+
    LD   R31,X
    .ENDM
 
    .MACRO __GETD1STACK
    IN   R26,SPL
    IN   R27,SPH
    ADIW R26,@0+1
    LD   R30,X+
    LD   R31,X+
    LD   R22,X
    .ENDM
 
    .MACRO __NBST
    BST  R@0,@1
    IN   R30,SREG
    LDI  R31,0x40
    EOR  R30,R31
    OUT  SREG,R30
    .ENDM
 
 
    .MACRO __PUTB1SN
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X,R30
    .ENDM
 
    .MACRO __PUTW1SN
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X+,R30
    ST   X,R31
    .ENDM
 
    .MACRO __PUTD1SN
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    RCALL __PUTDP1
    .ENDM
 
    .MACRO __PUTB1SNS
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    ADIW R26,@1
    ST   X,R30
    .ENDM
 
    .MACRO __PUTW1SNS
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    ADIW R26,@1
    ST   X+,R30
    ST   X,R31
    .ENDM
 
    .MACRO __PUTD1SNS
    LDD  R26,Y+@0
    LDD  R27,Y+@0+1
    ADIW R26,@1
    RCALL __PUTDP1
    .ENDM
 
    .MACRO __PUTB1PMN
    LDS  R26,@0
    LDS  R27,@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X,R30
    .ENDM
 
    .MACRO __PUTW1PMN
    LDS  R26,@0
    LDS  R27,@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X+,R30
    ST   X,R31
    .ENDM
 
    .MACRO __PUTD1PMN
    LDS  R26,@0
    LDS  R27,@0+1
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    RCALL __PUTDP1
    .ENDM
 
    .MACRO __PUTB1PMNS
    LDS  R26,@0
    LDS  R27,@0+1
    ADIW R26,@1
    ST   X,R30
    .ENDM
 
    .MACRO __PUTW1PMNS
    LDS  R26,@0
    LDS  R27,@0+1
    ADIW R26,@1
    ST   X+,R30
    ST   X,R31
    .ENDM
 
    .MACRO __PUTD1PMNS
    LDS  R26,@0
    LDS  R27,@0+1
    ADIW R26,@1
    RCALL __PUTDP1
    .ENDM
 
    .MACRO __PUTB1RN
    MOVW R26,R@0
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X,R30
    .ENDM
 
    .MACRO __PUTW1RN
    MOVW R26,R@0
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X+,R30
    ST   X,R31
    .ENDM
 
    .MACRO __PUTD1RN
    MOVW R26,R@0
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    RCALL __PUTDP1
    .ENDM
 
    .MACRO __PUTB1RNS
    MOVW R26,R@0
    ADIW R26,@1
    ST   X,R30
    .ENDM
 
    .MACRO __PUTW1RNS
    MOVW R26,R@0
    ADIW R26,@1
    ST   X+,R30
    ST   X,R31
    .ENDM
 
    .MACRO __PUTD1RNS
    MOVW R26,R@0
    ADIW R26,@1
    RCALL __PUTDP1
    .ENDM
 
    .MACRO __PUTB1RON
    MOV  R26,R@0
    MOV  R27,R@1
    SUBI R26,LOW(-@2)
    SBCI R27,HIGH(-@2)
    ST   X,R30
    .ENDM
 
    .MACRO __PUTW1RON
    MOV  R26,R@0
    MOV  R27,R@1
    SUBI R26,LOW(-@2)
    SBCI R27,HIGH(-@2)
    ST   X+,R30
    ST   X,R31
    .ENDM
 
    .MACRO __PUTD1RON
    MOV  R26,R@0
    MOV  R27,R@1
    SUBI R26,LOW(-@2)
    SBCI R27,HIGH(-@2)
    RCALL __PUTDP1
    .ENDM
 
    .MACRO __PUTB1RONS
    MOV  R26,R@0
    MOV  R27,R@1
    ADIW R26,@2
    ST   X,R30
    .ENDM
 
    .MACRO __PUTW1RONS
    MOV  R26,R@0
    MOV  R27,R@1
    ADIW R26,@2
    ST   X+,R30
    ST   X,R31
    .ENDM
 
    .MACRO __PUTD1RONS
    MOV  R26,R@0
    MOV  R27,R@1
    ADIW R26,@2
    RCALL __PUTDP1
    .ENDM
 
 
    .MACRO __GETB1SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    LD   R30,Z
    .ENDM
 
    .MACRO __GETB1HSX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    LD   R31,Z
    .ENDM
 
    .MACRO __GETW1SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    LD   R0,Z+
    LD   R31,Z
    MOV  R30,R0
    .ENDM
 
    .MACRO __GETD1SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    LD   R0,Z+
    LD   R1,Z+
    LD   R22,Z+
    LD   R23,Z
    MOVW R30,R0
    .ENDM
 
    .MACRO __GETB2SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R26,X
    .ENDM
 
    .MACRO __GETW2SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R0,X+
    LD   R27,X
    MOV  R26,R0
    .ENDM
 
    .MACRO __GETD2SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R0,X+
    LD   R1,X+
    LD   R24,X+
    LD   R25,X
    MOVW R26,R0
    .ENDM
 
    .MACRO __GETBRSX
    MOVW R30,R28
    SUBI R30,LOW(-@1)
    SBCI R31,HIGH(-@1)
    LD   R@0,Z
    .ENDM
 
    .MACRO __GETWRSX
    MOVW R30,R28
    SUBI R30,LOW(-@2)
    SBCI R31,HIGH(-@2)
    LD   R@0,Z+
    LD   R@1,Z
    .ENDM
 
    .MACRO __GETBRSX2
    MOVW R26,R28
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    LD   R@0,X
    .ENDM
 
    .MACRO __GETWRSX2
    MOVW R26,R28
    SUBI R26,LOW(-@2)
    SBCI R27,HIGH(-@2)
    LD   R@0,X+
    LD   R@1,X
    .ENDM
 
    .MACRO __LSLW8SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    LD   R31,Z
    CLR  R30
    .ENDM
 
    .MACRO __PUTB1SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    ST   X,R30
    .ENDM
 
    .MACRO __PUTW1SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    ST   X+,R30
    ST   X,R31
    .ENDM
 
    .MACRO __PUTD1SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    ST   X+,R30
    ST   X+,R31
    ST   X+,R22
    ST   X,R23
    .ENDM
 
    .MACRO __CLRW1SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    ST   X+,R30
    ST   X,R30
    .ENDM
 
    .MACRO __CLRD1SX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    ST   X+,R30
    ST   X+,R30
    ST   X+,R30
    ST   X,R30
    .ENDM
 
    .MACRO __PUTB2SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    ST   Z,R26
    .ENDM
 
    .MACRO __PUTW2SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    ST   Z+,R26
    ST   Z,R27
    .ENDM
 
    .MACRO __PUTD2SX
    MOVW R30,R28
    SUBI R30,LOW(-@0)
    SBCI R31,HIGH(-@0)
    ST   Z+,R26
    ST   Z+,R27
    ST   Z+,R24
    ST   Z,R25
    .ENDM
 
    .MACRO __PUTBSRX
    MOVW R30,R28
    SUBI R30,LOW(-@1)
    SBCI R31,HIGH(-@1)
    ST   Z,R@0
    .ENDM
 
    .MACRO __PUTWSRX
    MOVW R30,R28
    SUBI R30,LOW(-@2)
    SBCI R31,HIGH(-@2)
    ST   Z+,R@0
    ST   Z,R@1
    .ENDM
 
    .MACRO __PUTB1SNX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R0,X+
    LD   R27,X
    MOV  R26,R0
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X,R30
    .ENDM
 
    .MACRO __PUTW1SNX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R0,X+
    LD   R27,X
    MOV  R26,R0
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X+,R30
    ST   X,R31
    .ENDM
 
    .MACRO __PUTD1SNX
    MOVW R26,R28
    SUBI R26,LOW(-@0)
    SBCI R27,HIGH(-@0)
    LD   R0,X+
    LD   R27,X
    MOV  R26,R0
    SUBI R26,LOW(-@1)
    SBCI R27,HIGH(-@1)
    ST   X+,R30
    ST   X+,R31
    ST   X+,R22
    ST   X,R23
    .ENDM
 
    .MACRO __MULBRR
    MULS R@0,R@1
    MOVW R30,R0
    .ENDM
0
Милаше
0 / 0 / 0
Регистрация: 13.04.2012
Сообщений: 76
08.07.2015, 21:35  [ТС] #17
продолжение кода:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
.MACRO __MULBRRU
    MUL  R@0,R@1
    MOVW R30,R0
    .ENDM
 
    .MACRO __MULBRR0
    MULS R@0,R@1
    .ENDM
 
    .MACRO __MULBRRU0
    MUL  R@0,R@1
    .ENDM
 
    .MACRO __MULBNWRU
    LDI  R26,@2
    MUL  R26,R@0
    MOVW R30,R0
    MUL  R26,R@1
    ADD  R31,R0
    .ENDM
 
;NAME DEFINITIONS FOR GLOBAL VARIABLES ALLOCATED TO REGISTERS
    .DEF _Svet0=R3
    .DEF _Svet1=R5
 
    .CSEG
    .ORG 0x00
 
;START OF CODE MARKER
__START_OF_CODE:
 
;INTERRUPT VECTORS
    RJMP __RESET
    RJMP 0x00
    RJMP 0x00
    RJMP 0x00
    RJMP _overflow_timer2
    RJMP 0x00
    RJMP 0x00
    RJMP 0x00
    RJMP 0x00
    RJMP _overflow_timer0
    RJMP 0x00
    RJMP 0x00
    RJMP 0x00
    RJMP 0x00
    RJMP 0x00
    RJMP 0x00
    RJMP 0x00
    RJMP 0x00
    RJMP 0x00
 
_0x15:
    .DB  0x0,0x0,0x0,0x0
 
__GLOBAL_INI_TBL:
    .DW  0x04
    .DW  0x03
    .DW  _0x15*2
 
_0xFFFFFFFF:
    .DW  0
 
__RESET:
    CLI
    CLR  R30
    OUT  EECR,R30
 
;INTERRUPT VECTORS ARE PLACED
;AT THE START OF FLASH
    LDI  R31,1
    OUT  GICR,R31
    OUT  GICR,R30
    OUT  MCUCR,R30
 
;DISABLE WATCHDOG
    LDI  R31,0x18
    OUT  WDTCR,R31
    OUT  WDTCR,R30
 
;CLEAR R2-R14
    LDI  R24,(14-2)+1
    LDI  R26,2
    CLR  R27
__CLEAR_REG:
    ST   X+,R30
    DEC  R24
    BRNE __CLEAR_REG
 
;CLEAR SRAM
    LDI  R24,LOW(__CLEAR_SRAM_SIZE)
    LDI  R25,HIGH(__CLEAR_SRAM_SIZE)
    LDI  R26,__SRAM_START
__CLEAR_SRAM:
    ST   X+,R30
    SBIW R24,1
    BRNE __CLEAR_SRAM
 
;GLOBAL VARIABLES INITIALIZATION
    LDI  R30,LOW(__GLOBAL_INI_TBL*2)
    LDI  R31,HIGH(__GLOBAL_INI_TBL*2)
__GLOBAL_INI_NEXT:
    LPM  R24,Z+
    LPM  R25,Z+
    SBIW R24,0
    BREQ __GLOBAL_INI_END
    LPM  R26,Z+
    LPM  R27,Z+
    LPM  R0,Z+
    LPM  R1,Z+
    MOVW R22,R30
    MOVW R30,R0
__GLOBAL_INI_LOOP:
    LPM  R0,Z+
    ST   X+,R0
    SBIW R24,1
    BRNE __GLOBAL_INI_LOOP
    MOVW R30,R22
    RJMP __GLOBAL_INI_NEXT
__GLOBAL_INI_END:
 
;HARDWARE STACK POINTER INITIALIZATION
    LDI  R30,LOW(__SRAM_END-__HEAP_SIZE)
    OUT  SPL,R30
    LDI  R30,HIGH(__SRAM_END-__HEAP_SIZE)
    OUT  SPH,R30
 
;DATA STACK POINTER INITIALIZATION
    LDI  R28,LOW(__SRAM_START+__DSTACK_SIZE)
    LDI  R29,HIGH(__SRAM_START+__DSTACK_SIZE)
 
    RJMP _main
 
    .ESEG
    .ORG 0
 
    .DSEG
    .ORG 0x160
 
    .CSEG
;/*Пример программы по обработке прераваний от Т0 и Т2 по переполнению*/
;#include <mega8.h>
    #ifndef __SLEEP_DEFINED__
    #define __SLEEP_DEFINED__
    .EQU __se_bit=0x80
    .EQU __sm_mask=0x70
    .EQU __sm_powerdown=0x20
    .EQU __sm_powersave=0x30
    .EQU __sm_standby=0x60
    .EQU __sm_ext_standby=0x70
    .EQU __sm_adc_noise_red=0x10
    .SET power_ctrl_reg=mcucr
    #endif
;#include <io.h>
;
;#define xtal=1000000
;#define led1 PORTD.5                 /*светодиод*/
;#define led2 PORTD.6                 /*светодиод*/
;
;int Svet0=0,Svet1=0;                         /*счетчик*/
;
;/*-= Функции =-*/
;/*Обработка прерывания от таймера TC0 N 10 по переполнению*/
;interrupt [TIM0_OVF] void overflow_timer0(void)
; 0000 000E {
 
    .CSEG
_overflow_timer0:
    ST   -Y,R30
    ST   -Y,R31
    IN   R30,SREG
    ST   -Y,R30
; 0000 000F     Svet0++;
    LDI  R30,LOW(1)
    LDI  R31,HIGH(1)
    __ADDWRR 3,4,30,31
; 0000 0010 }
    LD   R30,Y+
    OUT  SREG,R30
    LD   R31,Y+
    LD   R30,Y+
    RETI
;
;/*Обработка прерывания от таймера TC2 N 12*/
;interrupt [TIM2_OVF] void overflow_timer2(void)
; 0000 0014 {
_overflow_timer2:
    ST   -Y,R30
    ST   -Y,R31
    IN   R30,SREG
    ST   -Y,R30
; 0000 0015     Svet1++;
    LDI  R30,LOW(1)
    LDI  R31,HIGH(1)
    __ADDWRR 5,6,30,31
; 0000 0016 }
    LD   R30,Y+
    OUT  SREG,R30
    LD   R31,Y+
    LD   R30,Y+
    RETI
;
;/*-= Oсновная программа =-*/
;void main(void)
; 0000 001A {
_main:
; 0000 001B     DDRB = 0xff; /*выходы*/
    LDI  R30,LOW(255)
    OUT  0x17,R30
; 0000 001C     DDRC = 0xff; /*выходы*/
    OUT  0x14,R30
; 0000 001D     DDRD = 0xff; /*выходы*/
    OUT  0x11,R30
; 0000 001E     PORTB = 0xff;
    OUT  0x18,R30
; 0000 001F     PORTC = 0x00;
    LDI  R30,LOW(0)
    OUT  0x15,R30
; 0000 0020     PORTD = 0x00;
    OUT  0x12,R30
; 0000 0021     /* НАСТРОЙКА РЕГИСТРОВ ДЛЯ РАБОТЫ C TC0 */
; 0000 0022     /* Включаем предделитель. Три первых бита регистра управления таймером T0 (TCCR0 - Timer-Counter Control Register 0)
; 0000 0023     устанавливают, на сколько будут делиться импульсы, идущие от тактового генератора к таймеру. */
; 0000 0024     TCCR0 |= 0b00000101;  /* 00000101 - 1/1024 ;  00000100 - 1/256 ;  00000011 - 1/64 ;  00000010 - 1/8 ;
; 0000 0025                              00000001 - 1/1 (чистые импульсы) ;  00000000 - выключить таймер.*/
    IN   R30,0x33
    ORI  R30,LOW(0x5)
    OUT  0x33,R30
; 0000 0026     TCCR2 |= 0b00000101;  /* 00000101 - 1/1024 */
    IN   R30,0x25
    ORI  R30,LOW(0x5)
    OUT  0x25,R30
; 0000 0027     SREG |= 0b10000000;  /* Записываем единичку в 7 бит регистра состояния (SREG - Status Regster) и разрешаем общие прерывания.*/
    BSET 7
; 0000 0028 
; 0000 0029     TIMSK |= 0b01000001;  /* Записываем единичку в нулевой бит регистра маскирования прерываний от таймеров
; 0000 002A                             (TIMSK - Timer Interrupt Mask Register), и разрешаем прерывания по переполнению таймера T0 и Т2.*/
    IN   R30,0x39
    ORI  R30,LOW(0x41)
    OUT  0x39,R30
; 0000 002B 
; 0000 002C     SFIOR = 0b00000001;  /* Записываем единичку в первый бит регистра особых условий ввода-вывода
; 0000 002D                             (SFIOR - Special Function Input-Output Register) и сбрасываем предделитель (не обязательно).*/
    LDI  R30,LOW(1)
    OUT  0x30,R30
; 0000 002E 
; 0000 002F     TCNT0 = 0;  /* Обнуляем счётный регистр таймера T0 (TCNT0 - Timer-Counter 0) перед началом цикла опроса программных
; 0000 0030                    счётчиков (на всякий случай).*/
    LDI  R30,LOW(0)
    OUT  0x32,R30
; 0000 0031     TCNT2 = 0;  /* Обнуляем счётный регистр таймера T2*/
    OUT  0x24,R30
; 0000 0032 
; 0000 0033     /*Настройка сторожевого таймера*/
; 0000 0034     WDTCR = 0b00001000;
    LDI  R30,LOW(8)
    OUT  0x21,R30
; 0000 0035 
; 0000 0036     while (1)      /*бесконечный цикл*/
_0x3:
; 0000 0037     {
; 0000 0038        #asm("wdr");     /*сброс сторожевого таймера*/
    wdr
; 0000 0039        if(Svet0==1)
    LDI  R30,LOW(1)
    LDI  R31,HIGH(1)
    CP   R30,R3
    CPC  R31,R4
    BRNE _0x6
; 0000 003A        {
; 0000 003B           if(led1 == 1)
    SBIS 0x12,5
    RJMP _0x7
; 0000 003C             led1=0;
    CBI  0x12,5
; 0000 003D           else
    RJMP _0xA
_0x7:
; 0000 003E             led1=1;
    SBI  0x12,5
; 0000 003F           Svet0=0;
_0xA:
    CLR  R3
    CLR  R4
; 0000 0040        }
; 0000 0041        if(Svet1==20)
_0x6:
    LDI  R30,LOW(20)
    LDI  R31,HIGH(20)
    CP   R30,R5
    CPC  R31,R6
    BRNE _0xD
; 0000 0042        {
; 0000 0043           if(led2 == 1)
    SBIS 0x12,6
    RJMP _0xE
; 0000 0044             led2=0;
    CBI  0x12,6
; 0000 0045           else
    RJMP _0x11
_0xE:
; 0000 0046             led2=1;
    SBI  0x12,6
; 0000 0047           Svet1=0;
_0x11:
    CLR  R5
    CLR  R6
; 0000 0048        }
; 0000 0049     };
_0xD:
    RJMP _0x3
; 0000 004A 
; 0000 004B }
_0x14:
    RJMP _0x14
 
    .CSEG
 
    .CSEG
;END OF CODE MARKER
__END_OF_CODE:
0
08.07.2015, 21:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2015, 21:35

atmega8a ADC
Читаю доку на atmega8 не могу понять что значит цифровое питание и аналоговое...

Сон в Atmega8a
Решил на днях попробовать спяцие режимы авр. В качестве подопытного использую...

ATmega8a, ATmega32a и т.д.
Доброго времени суток! Компания атмель вместо родных нам мег восьмых,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru