Ну тогда вот то что я пытался сделать незнаю насколько это правильно я сам не очень разбираюсь
Код:
.def scancode=r16
.def schscan=r17
.def schopr=r18
.def code=r19
.def keycode=r20
.def temp=r21
.def frec=r22
.def dlit=r23
.def zader=r24
.def zader1=r25
;Основная программа
;Определение таблицы переходов
.ORG $0 ;Начало таблицы переходов
reset:
rjmp Start ;Переход на метку Start основной программы
.ORG $20 ;Вектор прерывания при переполнении таймера T0
rjmp IntT0
.ORG $22 ;Начальный адрес основной пpогpаммы
Start: ldi temp,high(RAMEND) ;Определение стека
out SPH,temp
ldi temp,low(RAMEND) ;Определение стека
out SPL,temp
rcall Scan ;Вызвать процедуру работы с клавиатурой
Frec: out TCNT0,frec ;Установить заданную частоту сигнала
ldi temp,$4 ;Запустить таймер T0, fck/64
out TCCR0,temp
out OCR1AL,dlit ;Установить заданную длительность сигнала
ldi temp,$91 ;Настроить таймер T1, PWM 8 бит
out TCCR1A,temp
ldi temp,$1 ;Запустить таймеp T1, fck/1
out TCCR1B,temp
ldi temp,$2 ;Разрешить прерывания от таймера Т0
out TIMSK,temp
ldi temp,$3 ;Конфигурирование линий PB0 и PB1 на ;вывод
out DDRB,temp
sei ;Разрешить все пpеpывания
Work: rjmp Work ;Рабочий цикл пpогpаммы, ничего не делаем
;Процедура cканирования клавиатуры
Scan: clr scancode ;Сброс scancode
ldi temp,$0F ;Конфигурирование 4-х выводов порта D на вывод
out ddrd,temp ;и 4-х выводов на ввод
Stklav: sec ;Установить флаг переноса
ldi temp,$1 ;Назначить кл. S1 число 1
ldi schscan,$4 ;Загрузка счетчика сканирования
ldi code,$FE ;Загрузка исходного байта сканирования
Schs: out portd,code ;Вывод байта сканирования в порт D
rol code ;Сдвиг байта сканирования
in keycode,pind ;Ввод байта сканирования
swap keycode ;Поменять местами 4-е разряда байта возврата
ldi schopr,$3 ;Загрузка счетчика опросов
Scho: ror keycode ;Сдвиг байта возврата
brcc Oprkl ;Выход из прочедуры при обнаружении нажатой ;клав.
If0: inc temp ;Инкремент scancode
dec schopr ;Уменьшить счетчик опросов
brne Scho ;Если schopr=0, то перейти на метку Sсho
dec schscan ;Уменьшить счетчик сканирований
brne Schs ;Если schscan=0, то перейти на метку Sсhs
rjmp Stklav ;иначе перейти на метку Klav
Oprkl: cpi temp,$C ;При обнаружении нажатой кл. "Ввод"
breq Delay ;перейти на процедуру устранения дребезга контактов
mov scancode,temp ;иначе сохранить значение нажатой кл.в ;scancode
rjmp If0 ;и продолжить сканирование клавиатуры
;Процедура устранения дребезга контактов клавиш
;Задержка около 10 мс
Delay: clr zader
ldi zader1,$96
Delay1: dec zader
brne Delay1
dec zader1
brne Delay1
;Процедура задания сигналам частоты и длительности
Setkl: cpi scancode,$0 ;Если нажата только кл. "Ввод", то
breq If0 ;снова сканировать клавиатуру
cpi scancode,$1
ldi frec,$D9 ;Задать частоту сигнала 800 Гц
ldi dlit,$18 ;и длительность импульса ШИМ-сигнала 12 мкс
breq Endkl
cpi scancode,$2
ldi frec,$ED ;Задать частоту сигнала 1600 Гц
ldi dlit,$30 ;и длительность импульса ШИМ-сигнала 24 мкс
breq Endkl
cpi scancode,$3
ldi frec,$F3 ;Задать частоту сигнала 2400 Гц
ldi dlit,$48 ;и длительность импульса ШИМ-сигнала 36 мкс
breq Endkl
cpi scancode,$4
ldi frec,$F7 ;Задать частоту сигнала 3200 Гц
ldi dlit,$60 ;и длительность импульса ШИМ-сигнала 48 мкс
breq Endkl
cpi scancode,$5
ldi frec,$F9 ;Задать частоту сигнала 4000 Гц
ldi dlit,$78 ;и длительность импульса ШИМ-сигнала 60 мкс
breq Endkl
cpi scancode,$6
ldi frec,$FA ;Задать частоту сигнала 4800 Гц
ldi dlit,$90 ;и длительность импульса ШИМ-сигнала 72 мкс
breq Endkl
cpi scancode,$7
ldi frec,$FB ;Задать частоту сигнала 5600 Гц
ldi dlit,$A8 ;и длительность импульса ШИМ-сигнала 84 мкс
breq Endkl
cpi scancode,$8
ldi frec,$FC ;Задать частоту сигнала 6400 Гц
ldi dlit,$C0 ;и длительность импульса ШИМ-сигнала 96 мкс
breq Endkl
cpi scancode,$9
ldi frec,$FD ;Задать частоту сигнала 7200 Гц
ldi dlit,$D8 ;и длительность импульса ШИМ-сигнала 108 мкс
breq Endkl
ldi frec,$FE ;Задать частоту сигнала 8000 Гц
ldi dlit,$F0 ;и длительность импульса ШИМ-сигнала 120 мкс
Endkl: ret
;Пpоцедуpа пpеpывания по пеpеполнению таймеpа T0
IntT0: push temp ;Сохранить temp в стеке
out TCNT0,frec ;Пеpезагpузить таймер Т0
in temp,SREG ;Сохранить SREG
sbis pinb,0 ;Если на PB0 был "0", то установить "1"
rjmp Ust1 ;и наоборот
cbi portb,0
rjmp EndT0
Ust1: sbi portb,0
EndT0: out SREG,temp ;Восстановление SREG
pop temp ;Выгрузить данные из стека
reti ;Выйти из процедуры
Листинг проектного тот же
Код:
Тут ошибка появляется но не сразу я думаю что после таймера не проходит какое то прерывание
Work: rjmp Work ;Рабочий цикл пpогpаммы, ничего не делаем
Добавлено спустя 52 минуты 17 секунд:Radist писал(а):
Я вижу это так: ребята, помогите, неделю мучаюсь, не получается вот этот кусок, гляньте код, что не так. Вот это будет помощь, поскольку вы тоже участвуете в процессе.
Дак вот я немогу найти этот кусок ошибка на пустом месте пишет и где эта ошибка я непойму
единственное я думаю что-то с тайммером.
Добавлено спустя 42 минуты 28 секунд:Frec: out TCNT0,frec ;Установить заданную частоту сигнала
ldi temp,$4 ;Запустить таймер T0, fck/64
out TCCR0,temp ;
в peripherals в timer 0 пишет mode:
no pwm(шип).
в 128 наверное нужно задать подругому если кто знает подскажите