;Основная программа ;Определение таблицы переходов .ORG $0 ;Начало таблицы переходов reset: rjmp Start ;Переход на метку Start основной программы .ORG $6 ;Вектор прерывания при переполнении таймера T0 rjmp IntT0 .ORG $7 ;Начальный адрес основной пpогpаммы
Start: ldi temp,$DF ;Определение стека out SP,temp rcall Scan ;Вызвать процедуру работы с клавиатурой Frec: out TCNT0,frec ;Установить заданную частоту сигнала ldi temp,$3 ;Запустить таймер T0, fck/64 out TCCR0,temp out OCR1L,dlit ;Установить заданную длительность сигнала ldi temp,$81 ;Настроить таймер 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
;П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 ;Выйти из процедуры
; Following lines are optional; if not included ; exactly these values are taken by default ; ------------------------------------------------------------ .POWER VDD=5 VSS=0 ; Power nodes .CLOCK 4meg ; Micro clock .STORE 250m ; Trace (micro+signals) storage time
; Micro nodes: RESET, AREF, PB0-PB5, PC0-PC5, PD0-PD7, ACO, TIM1OVF ; Define here the hardware around the micro ; ------------------------------------------------------------ K0 PD0 n1 ;Подсоединить клавишу "0" между выводом PD0 и точкой n1 K1 PD0 n2 ;Подсоединить клавишу "1" между выводом PD0 и точкой n2 K2 PD0 n3 ;Подсоединить клавишу "2" между выводом PD0 и точкой n3 K4 PD1 n1 ;Подсоединить клавишу "4" между выводом PD1 и точкой n1 K5 PD1 n2 ;Подсоединить клавишу "5" между выводом PD1 и точкой n2 K6 PD1 n3 ;Подсоединить клавишу "6" между выводом PD1 и точкой n3 K8 PD2 n1 ;Подсоединить клавишу "8" между выводом PD2 и точкой n1 K9 PD2 n2 ;Подсоединить клавишу "9" между выводом PD2 и точкой n2 KA PD2 n3 ;Подсоединить клавишу "A" между выводом PD2 и точкой n3
KC RESET GND ;Подсоединить клавишу "C" между выводом RESET и GND KD PD3 n2 ;Подсоединить клавишу "D" между выводом PD3 и ;точкой n2 KE PD3 n3 ;Подсоединить клавишу "E" между выводом PD3 и ;точкой n3 R1 PD4 n1 0.001k ;Замкнуть вывод PD4 и точку n1 R2 PD5 n2 0.001k ;Замкнуть вывод PD5 и точку n2 R3 PD6 n3 0.001k ;Замкнуть вывод PD6 и точку n3
R4 n1 VDD 5k ;Соединить резистор R4 между точкой n1 и VDD R5 n2 VDD 5k ;Соединить резистор R5 между точкой n2 и VDD R6 n3 VDD 5k ;Соединить резистор R6 между точкой n3 и VDD .PLOT v(PB0) v(PB1)
Программа ждет задания с кнопки (1-С), дальше ожидает ввода кнопкой E ну и выводится ШИМ. Заранее благодарен.
Странно. У вас есть код старинного контролёра. Просите помочь портировать его на новый контролёр. И все. Подразумевается, что найдется некто, который сделает за вас и для вас эту работу, вы ему напишете "спасибо, все получилось" и дело с концом. Он потеряет время, ему лично эта программа не нужна, вы не научитесь чему-то новому. Все в проигрыше. Я не против помогать, но помогать не значит делать все за другого. Я вижу это так: ребята, помогите, неделю мучаюсь, не получается вот этот кусок, гляньте код, что не так. Вот это будет помощь, поскольку вы тоже участвуете в процессе.
Могу посоветовать проверить вектора прерываний, настройку стека, портов, короче контролёры отличаются внутренней перефирией, вот там порыться. И не ленитесь симулировать - кучу ошибок исправите на этом этапе.
;Основная программа ;Определение таблицы переходов .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
;П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 писал(а):Я вижу это так: ребята, помогите, неделю мучаюсь, не получается вот этот кусок, гляньте код, что не так. Вот это будет помощь, поскольку вы тоже участвуете в процессе.
Дак вот я немогу найти этот кусок ошибка на пустом месте пишет и где эта ошибка я непойму единственное я думаю что-то с тайммером.
К сожалению, я все проги писал в студии, но асемблер-то один и тот же. С шимом проблем не было. Чтоб пошел шим, надо: - настроить таймер в режим шима - загрузить в регистр сравнения число - запустить таймер Теперь нюансы. Шимов есть как минимум два типа - быстрый и фазокорректный. Что конкретно нужно сделать: - читаем даташит в той части, где описаны биты управляющих регистров таймера - определяем, какие биты нам надо установить, а какие сбросить - определяем, какие числа надо записать в регистры таймера - записываем их - прогоняем на симуляторе. Еще раз напишу - я всегда писал и отлаживал программы в студии. Она проверяет только на ошибки синтаксиса, что в общем то хорошо. Студия бесплатна, так что рекомендую. Симулятор в ней очень хороший. Есть еще протеус, но я с ним не работал, поэтому ничего не скажу.
Добавлено спустя 2 минуты 6 секунд: НИКОГДА не давайте имена меткам такие же, как и имена переменных (я про Frec и frec)
Если можно напишите полное название желательно на англ этой студии (это возможно она GSS Visual Assembler) числа в регистры записываются таймер идет когда переходит после таймера на .ORG $20 на work появляется ошибка "[PC = $0034, Time = 81.24 ms]: TIMER is in PWM mode: some OC pin not defined as output" она возникает я так понимаю когда идет прерывание а вот почему она там появляется я не пойму Если можно напишите полное название желательно на англ этой студии (это возможно она GSS Visual Assembler) числа в регистры записываются таймер идет когда переходит после таймера на .ORG $20 на work появляется ошибка "[PC = $0034, Time = 81.24 ms]: TIMER is in PWM mode: some OC pin not defined as output" она возникает я так понимаю когда идет прерывание а вот почему она там появляется я не пойму
А да при компиляции ошибок нет только при запуске и кнопки нормально все работают потом значение в таймер записывается, таймер нормально доходит до 0 и потом прерывание идет и ошибка.
AVRStudio Берется с www.atmel.com www.atmel.ru Я пользуюсь версией 4.12 Есть и посвежее, но сами понимаете, когда выходит новая версия садишься на нее и собираешь кучу глюков, а к 4.12 у меня претензий нет (правда она не симулирует один из таймеров в ATTiny25/45/85).
Если студия не понимает символьных имен, значит эти имена не были заранее определены. Чудес не бывает. Для этого проверяйте дефайны и инклуды. Если не знает срег, значит ей никто не сказал, что срег = $3f
с этим разобрался а куда записывается листинг проектного файла там где я задаю кнопки и сам плот и контрольная панель (там где я жму эти кнопки) ну и конечно же скоп
Очевидно в папку, в которой находится проект. А если их там нет, то либо: - вы не задали студии команду это сделать - студия физически не может это делать. Когда я работаю со студией, она создает следующие виды файлов: - файл проекта - асемблерный файл - файл для отладчика obj - файл для прошивки hex Мне лично ничего больше не надо. Можно сделать таблицу данных в еепром, будет файл с eep расширением. Вообще студия при компиляции пишет, какие файлы она создает, в нижнем окошке.
Повторяю - у меня есть только студия. По вмлаб ничего подсказать не могу. Во вложении находится проект из первого поста, подрихтованный под мегу 128. Я не утверждаю, что он рабочий, поскольку алгоритма я не понял (по программе это сложно сделать). Проект компилится без ошибок, с ним уже можно работать. Что я подрихтовал: - стек у меги двухбайтный - таблица векторов прерываний в разы больше, рихтовал орги - метка фрег совпадала с переменной фрег (нафиг она нужна вообще, на нее никто не ссылается) - переменная длит не была инициализирована
Будут вопросы - смогу консультировать только если проект в студии вопросы желательно в таком виде: мне надо тото тото, для этого я сделал вот это, а в место этого у меня получилось вот то. И еще: чтение даташита снимает 95% проблем. Проблема с английским - читайте в переводе тут: http://www.gaw.ru/html.cgi/txt/doc/micr ... /index.htm
Я нашел ошибку и она в том что компаратор не пашет то есть листинг проектного файла в частности подключение клавиатуры к МК неверен ток вот схему подключения клавиатуры для 128 я найти нему(( там счетчик на сравнение а сигнал он сохраняет при совпадении с компоратора который почемуто не задается и прерывание от него тоже