Код: Выделить всё
01.; Atmega8, crystal 1MHZ (internal)
02.; Timer Counter 1
03.; Fast PWM & ADC
04.
05..include "m8def.inc"
06.
07..def wreg =R16
08..def duration =R17
09..def wreg2 =R18
10.
11.
12.init:
13.
14.ldi wreg,low(RAMEND)
15.out SPL,wreg
16.
17.ldi wreg,high(RAMEND) ; Stack Pointer = $45F
18.out SPH,wreg
19.
20.cli ; запретить прерывания
21.
22.
23.ldi wreg, 0b10000011 ; Вкл. Ацп, Однокр. преобр., Прерывание запрещено, СК/8 (125 kHz)
24.out ADCSR, wreg
25.
26.ldi wreg, 0b01101110 ; AVcc, Внеш. конд. на Aref, Выравн. по лев. краю, channel 1.23V bg
27.out ADMUX, wreg
28.
29.rcall adc_convert
30.
31.
32.;******************* TIMER1 ***********************
33.
34.ldi wreg,0x00
35.out PORTB,wreg ; Запись 0 в порт
36.
37.ldi wreg,0b00000010 ; PortB.1 (OC1A) - Output
38.out DDRB,wreg
39.
40.
41.ldi wreg, 0b10000001 ; неинв. 8 битный ШИМ
42.out TCCR1A, wreg
43.
44.ldi wreg, 0b00001001 ; CK/1
45.out TCCR1B, wreg
46.
47.ldi wreg, 0b00000000
48.out TIMSK, wreg
49.
50.
51.main:
52.
53.ldi wreg, 250 ; 25mS
54.rcall delay
55.
56.ldi wreg, 0b01100101 ; ADC Channel 5 (PortC.5 ; pin 28)
57.rcall adc_convert
58.
59.ldi wreg2, 0x00
60.out OCR1AH, wreg2
61.
62.out OCR1AL, wreg
63.
64.
65.rjmp main
66.
67.
68.
69.;*********************** DELAYS **************************
70.
71.delay: ; 0.1mS * wreg
72.ldi duration, 24
73.cycle:
74.nop
75.dec duration
76.brne cycle
77.dec wreg
78.brne delay
79.ret
80.
81.
82.;********************** AD CONVERTION *******************
83.
84.adc_convert:
85.
86.out ADMUX, wreg ; wreg contains channel
87.
88.sbi ADCSR, ADSC ; Start Convertion
89.sbic ADCSR , ADSC
90.rjmp PC-1
91.in wreg, ADCL ; просто формальность (первым всегда читается ADCL)
92.
93.in wreg, ADCH ; wreg contains result
94.
95.retс ассемблером особо труда нет,но не пойму алгоритм программы,точно поняты с 69 по 80 строку,немного понятно в TIMER

