Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
плохо...xkp писал(а):опять же повторюсь, по книжкам я даже в школе не умел учиться...
при любой реализации будет некоторая аппаратная погрешность...Alexeyslav писал(а):У этого метода есть недостаток... пока мы входим в прерывание и до фиксации значения ... таймер все еще считает. внося неконтролируемую погрешность.
Так как ТС по книжкам даже в школе не умел учиться, пришлось даташит открывать мне. Там у таймеров нет модуля захвата. Работа с компаратором будет аналогична работе по внешнему прерыванию.можно еще по компаратору работать, он тоже во всех моделях есть.
само-собойploop писал(а): Работа с компаратором будет аналогична работе по внешнему прерыванию.
Подтверждаю!ploop писал(а):пришлось даташит открывать мне. Там у таймеров нет модуля захвата.
1. Ценность библиотеки не измеряется ее суммарным объемом.xkp писал(а):я не говорил что не читал! я читал и читаю, книжек у меня 8гб. но по книжкам не могу я понять. там как то не так все написано. надо либо более подробно, либо очень кратко.
еще когда начинал изучать программирование 3 месяца искал команды на асме. в книжках они все расписаны на сотни страниц. и пока я не нашел вот это я не мог написать самой простой программы для мигания светодиодика.
Код: Выделить всё
.INCLUDE "tn13DEF.INC"
.list
.def tmp=r16
.def tmp0=r17
.def cnt=r19
.DSEG
clok: .byte 1
.cseg
.org $0a
RESET:
ldi tmp,low(RAMEND)
out spl,tmp
.macro OUTI
LDI R16,@1
OUT @0,R16
.endm
.macro OUTF
LDs R16,@1
OUT @0,R16
.endm
.macro INF
ldi R16,@1
sts @0,R16
.endm
OUTI tccr0a,(0<<com0a1)|(1<<COM0A0)|(0<<com0b1)|(0<<COM0b0)|(1<<wgm01)|(0<<wgm00);НАСТРОЙКА ШИМ
ldi tmp,low(RAMEND)
out spl,tmp
ldi tmp,$01 ;преддилитель 64
out tccr0b,tmp
ldi tmp,0b00000001
out ddrb,tmp
ldi tmp,0
out portb,tmp
sei
main:
/* процедура задания значений частоты*/
inf clok,$04 ;для проверки
;вывод трех импульсов
outi tccr0b,$01
lds tmp0,clok
cpi tmp0,$80
brlo metka
outi tccr0b,$02
subi tmp0,$80
metka:
out ocr0a,tmp0
ldi tmp,2
metka2:
sbis pinb,0
rjmp metka2
metka3:
sbic pinb,0
rjmp metka3
subi tmp,1
brcc metka2
; ТУТ НАДО ОТКЛЮЧИТЬ ГЕНЕРАЦИЮ И СБРОСИТЬ PINB PORTB
main_2:
rjmp main_2
; Address Labels Code Comments
.org $00
rjmp RESET ; Reset Handler
reti ;rjmp EXT_INT0 ; IRQ0 Handler
reti ;rjmp PCINT0 ; PCINT0 Handler
reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
reti ;rjmp EE_RDY ; EEPROM Ready Handler
reti ;rjmp ANA_COMP ; Analog Comparator Handler
reti ;rjmp TIM0_COMPA ; Timer0 CompareA Handler
reti ;rjmp TIM0_COMPB ; Timer0 CompareB Handler
reti ;rjmp WATCHDOG ; Watchdog Interrupt Handler
reti ;rjmp ADC_inc ; ADC Conversion Handler
.exit
Пробовали, и что?А вы попробуйте сами, остановив генерацию сбросить пин!
Код: Выделить всё
RESET:
ldi Temp,RamEnd ;инициализация стека
out SPL,Temp
ldi Temp,0b11111111 ; Настройка порта B на вывод
out DDRB,Temp
ldi Temp,0b10000000 ; Разрешение внешних прерывний
out SREG,Temp
ldi Temp,0b11000000 ; Разрешить прерывания через INT1 и INT0
out GIMSK,Temp
ldi Temp,0b00001010 ; прерывания INT1 и INT0 по спаду
out MCUCR,Temp
sei ;глобальное разрешение прерываний
ldi Temp,0b00000001
out PortB,Temp
;------ Основной цикл программы -------
MAIN:
nop
rjmp MAIN
;---------------------------
;******* Обработчик внешних прерываний *******
EXT_INT0:
cpi Temp,0b10000000 ;сравнить Temp с крайним значением
breq Right ;если равно - включаем крайний правый светодиод
lsl Temp ;иначе - сдвиг влево
out PortB,Temp ;вывод на ндикацию
reti ;возвращение в бесконечный цикл
Right: ldi Temp,0b00000001 ;включаем крайний правый светодиод
out PortB,Temp
rjmp MAIN
EXT_INT1:
cpi Temp,0b00000001 ;сравнить Temp с крайним значением
breq Left ;если равно - включаем крайний левый светодиод
lsr Temp ;иначе - сдвиг вправо
out PortB,Temp ;вывод на ндикацию
reti ;возвращение в бесконечный цикл
Left: ldi Temp,0b10000000 ;включаем крайний левый светодиод
out PortB,Temp
rjmp MAIN