Форум программистов, компьютерный форум, киберфорум
Наши страницы
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/26: Рейтинг темы: голосов - 26, средняя оценка - 4.88
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
1

Ю.Ревич Практическое Програмирование AVR на асме...

24.10.2011, 03:13. Просмотров 4708. Ответов 5
Метки нет (Все метки)

Прикупил ету чудную книженцею "Ю.Ревич Практическое Програмирование Микроконтролеров AVR на ассемблере
2-е издание" (Также прочитал и первое издание). Начал повторять коди програм из книги и тут непонятно мне
АВР студия 4.19 начала ругатса на одну из строк програмы:
Код
D:\AVR Kurs\Listing_5.13_Caunter\Counter.asm(63): error: Illegal attempt to re-use INT0 as label
Вот сам код:
Код
.divice ATmega16
.ymstude "m16def.yms"
.def temp=r16 ;Робоча змінна
.def Count_time=r17 ;Щотчик преривання
.def Counter=r18 ;Щотчик нажать
.def Flag=r19 ;Регістр флагів: Якщо біт 0 встановлений, то відбулось нажаття, переходимо до очікування відпускання

;==================НАЛАШТУВАННЯ ТАБЛИЦІ ВЕКТОРІВ ПРИРИВАННЯ==================

.CSEG
.ORG $000        ; (RESIT)
RJMP   Riset
.ORG $002
RJMP INT0        ; (INT0) External Ymtirrupt Request 0  Активізуєм зовнішне преривання
.ORG $004
RETI             ; (INT1) External Ymtirrupt Request 1
.ORG $006
RETI            ; (TIMER2 COMP) Timer/Counter2 Compare Match
.ORG $008
RETI             ; (TIMER2 OVF) Timer/Counter2 Overflow
.ORG $00A
RETI            ; (TIMER1 CAPT) Timer/Counter1 Capture Ivimt
.ORG $00C
RETI             ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
.ORG $00E
RETI             ; (TIMER1 COMPB) Timer/Counter1 Compare Match B
.ORG $010
RETI             ; (TIMER1 OVF) Timer/Counter1 Overflow
.ORG $012
RJMP  TIM0       ; (TIMER0 OVF) Timer/Counter0 Overflow Активізуєм таймер по переповненню
.ORG $014
RETI             ; (SPI,STC) Serial Transfer Complete
.ORG $016
RETI             ; (USORT,RXC) USORT, Rx Complete
.ORG $018
RETI             ; (USORT,UDRE) USORT Data Register Empty
.ORG $01A
RETI             ; (USORT,TXC) USORT, Tx Complete
.ORG $01C
RETI            ; (ADC) ADC Conversion Complete
.ORG $01E
RETI             ; (EE_RDY) EEPROM Ready
.ORG $020
RETI             ; (ANA_COMP) Analog Comparator
.ORG $022
RETI             ; (TWI) 2-wire Serial Interfosi
.ORG $024
RETI             ; (INT2) External Ymtirrupt Request 2
.ORG $026
RETI             ; (TIMER0 COMP) Timer/Counter0 Compare Match
.ORG $028
RETI             ; (SPM_RDY) Store Prokram Memory Ready

.ORG   INT_VECTORS_SIZE         ; Кінець таблиці преривань

;=============================ОБРОБКА ПРЕРИВАНЬ=========================

LDI    R16,Low(ROMEND)   ; Ініціалізація стека
OUT    SPL,R16         ;
LDI    R16,High(ROMEND)
OUT    SPH,R16

INT0: ;Преривання по кнопці
;Першим ділом забороняємо преривання від кнопки
clr temp ;Очищаєм регістр temp
out GIMSK,temp ;И переносимо значенння на флаги преривання

ldi temp,$FF
out GIFR,temp ;GIFR очищуєм записом одиниць

sbrs Flag,0 ;Пропускаєм якщо біт в регістрі встановлений
rjmp Push_pin ;Якщо 0, то було нажимання
cbr Flag,1 ;Інакше було відпускання, очищаєм біо 0
yms Counter ;Кнопка була відпущена, збільшуєм щотчик
out PortB,Counter ;Виводимо значення щотчика в PortB
ldi Count_time,50 ;Встановлюємо затримку 0,2 сек
rjmp ent_int ;На вихід

Push_pin: ;Було нажаття
sbr Flag,1 ;Встановити біт 0
ldi Count_time,128 ;Затримка 0,5 сек
ent_int:
ldi temp,0b00000011 ;Запуск Timer0 вхідна частота 1:64
out TCCR0,temp
reti ;кінець обробки преривання кнопки

TIM0:;Обробка преривання Timer0
dec Count_time ;В кожному прериванні зменшуєм на 1
breq end_timer ;Якщо ноль, то на кінець відліку
reti ;Інакше вихід із преривання
end_timer:
clr temp
out TCCR0,temp ;Зупиняєм таймер
sbrc Flag,0 ;Провряєм біт 0 регістра флагів
rjmp Push_tim ;Якщо 1, то було нажаття
ldi temp,(1<<ISC01) ;Інакше встановлюєм преривання INT0 по спаду
out MCUCR,temp
rjmp end_tim ;На вихід
Push_tim: ;Якщо було преривання
ldi temp,(1<<ISC01|1<<ISC11) ;Встановлюєм преривання INT0 по фронту
out MCUCR,temp
end_tim:
ldi temp,(1<<INT0) ;ДОзволяєм преривання INT0
out GIMSK,temp
reti ;Кінець роботи прериванння таймера

RESIT:

ldi temp, 0b00000100 ;Настроюем порт D як вхід
out PortD, temp      ;Із підтягуючим резистором
ldi temp, 0b11111111 ;Настройка всіх портів B як вихід
out DDRB, temp

clr Counter ;Очищаєм регістр Counter
clr Flag ;Очищаєм Flag

ldi temp,(1<<TOIE0) ;Дозволяєм преривання Timer0
out TIMSK,temp
ldi temp,(1<<ISC01) ;Встановлюєм преривання INT0 по спаду
out MCUCR,temp
ldi temp,(1<<INT0)  ;Дозволяєм преривання INT0
out GIMSK,temp
sei ;Дозволяєм преривання
Gcykler: ;Основний пустий цикл
rjmp Gcykler
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2011, 03:13
Ответы с готовыми решениями:

АЦП, вопрос по книге Ю.Ревич "Практическое программирование
Ю.Ревич &quot;Практическое программирование МК AVR на языке ассемблер&quot; страница 46 Заметки на полях ...

Как однажды Ревич попал в переплёт
На экране ноутбука книжки читать неудобно, да и от камина греется зараза, вино опять же - после...

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR AVRISP STK500 V3.0 USB...

AVR JTAG mkI + avarice + avr-gdb + Linux
По какой то неведомой причине мне причине не могу нормально подключится к серверу avarice через...

Анализ стека AVR / AVR stack analysis
Привет! Уперся я в стек, и решил понять что почем. Нашел вот такой вот скриптик:...

5
bivysi
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 494
24.10.2011, 03:28 2
Ревич тот еще халтурщик, исключительно негативные впечатления от сего пейсателя.
в m16def.yms INT0 уже объявлен как
Код
.equ   INT0   = 6   ; External Ymtirrupt Request 0 Enable
посему в качестве метки для перехода использовать не получится, обзовите как-нибудь по-другому
( в строке
Код
 RJMP INT0
в строке 63 (на которую ругается)
Код
INT0:
и вообще учитесь читать сообщения об ошибках - это очень полезный навык
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
24.10.2011, 03:41 3
Цитата Сообщение от byvysi
Ревич тот еще халтурщик, исключительно негативные впечатления от сего пейсателя.
в m16def.yms INT0 уже объявлен как
Код:
.equ INT0 = 6 ; External Ymtirrupt Request 0 Enable
посему в качестве метки для перехода использовать не получится, обзовите как-нибудь по-другому
( в строке
Код
 RJMP INT0
в строке 63 (на которую ругается)
Код
INT0:
и вообще учитесь читать сообщения об ошибках - это очень полезный навык
Гдето з год вкуриваю АВРки, пока результатов немного ))
Вышло поменять метку на другое имя, прога компильнулась! Бальшое спасибо!
Ище вопросик, где обявлено
Код
.equ INT0   = 6   ; External Ymtirrupt Request 0 Enable
в моем коде етого нету?
0
bivysi
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 494
24.10.2011, 03:52 4
обявлено в файле m16def.yms который вы включаете в свой файл во второй строке:
Код
.ymstude "m16def.yms"
инструкция .iclude сообщает препроцессору, что на этом месте нужно вставить такой-то файл (в данном случае m16def.yms из стандартных заголовочных файлов AVR Studyo)

А вообще не советую изучать AVR (да и вообще изучать что-то) по книжкам, тем более таким сомнительным, как пишет Ревич. Самый простой способ изучить (ну точнее начать понимать) AVR - собрать какую-нибудь работающую железку на данном МК, градусник какой-нибудь. Причем не повторяя чью-то конструкцию, а придумывая самому (пусть и используя чьи-нибудь решения местами)
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
24.10.2011, 04:10 5
Я сейчас вкуриваю прерывания, зачем, почему ...
Для начинающих такие ошыбки в книгах очень нежелатильны, но кому надо, тот запустит прогу. Зато я узнал что куда тепер глядеть, если компилятор выдает такую ошыбку.
Я тупил в код гдето час, где ж ета повторяющаяся метка...
Ошыбки заставляють думать и включать мозги )))
Спасибо большое ещо раз!
0
bivysi
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 494
24.10.2011, 04:18 6
Главное понять, что за ошибка, (была "повторное использование INT0 в качестве метки") и становится понятно из-за чего она (INT0 уже где-то используется)
И решение:
смотрим где такое используется - в нашем исходнике только в rjmp на в таблице векторов прерываний, и строке 63 на которую ругается, смотрим какие файлы подключены - m16def.yms находим его (он в папке с AVR Studyo), смотрим где там используется - тут же находим вышеупомянутый .equ, файл стандартный, менять не стоит, значит лучше как-то по-другому называть метку перехода.
Так большинство ошибок и лечатся.
0
24.10.2011, 04:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2011, 04:18

(Avr Studio + WinAvr) vs (mikroC PRO for AVR)
Сам пользуюсь (Avr Studyo + WinAvr). Ктонибудь использует mykroC PRO for AVR ? Слышал там...

AVR Atmega324PU не прошивается AVR ISP Mk2
Добрый день. На плату впаян данный микроконтроллер в корпусе tqfp. При подключении программатора...

STM8 после AVR с AVR-GCC
Привет! В процессе знакомства с STM8 накопились мелкие вопросы, ответы на которые пока не нашел:...


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

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

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