Привет всем хвостатым!!)) Читаю я тут книжку и переписал из нее программу. Программа обычный счетчик нажатий кнопки. Переписал ее для изучения внутренних процессов мк. Так вот при компиляции вываливается ошибка, с которой я ранее не сталкивался, есть идеи?
INT0: clr temp out GIMSK, temp ldi temp, $FF out GIFR, temp sbrs Flag, 0 rjmp Push_pin cbr Flag, 1 inc Counter out PORTB, Counter ldi Count_time, 50 rjmp ent_int
Push_pin: sbr Flag, 1 ldi Count_time, 128
ent_int: ldi temp, 0b00000011 out TCCR0, temp reti
TIM0_OVF: dec Count_time breq end_timer reti
end_timer: clr temp out TCCR0, temp sbrc Flag, 0 rjmp Push_tim ldi temp, (1<<ISC01) out MCUCR, temp rjmp end_tim
Push_tim: ldi temp, (1<<ISC01|1<<ISC11) out MCUCR, temp
end_tim: ldi temp, (1<<INT0) out GIMSK, temp reti
RESET: ldi temp, low(RAMEND) out SPL, temp ldi temp, 0b00000100 out PORTD, temp ldi temp, 0b11111111 out DDRB, temp clr Counter clr Flag ldi temp, (1<<TOIE0) out TIMSK, temp ldi temp, (1<<ISC01) out MCUCR, temp ldi temp, (1<<INT0) out GIMSK, temp sei
Gcykle: rjmp Gcykle
а вот вывод avr studio 4
asm v1 error : Duplicate label error : Internal - label changed between passes - conditoonal on forward reference?
asm v2 error: Illegal attempt to re-use 'INT0' as label C:\Program Files (x86)\Atmel\AVR Tools\AvrAssembler2\Appnotes\2313def.inc(197): info: previous definition of 'INT0'
забегу вперед, данная прога работает на atmega16 как то через жопу некорректно: счет идет после второго нажатия, а иногда бывает и одно нажатие считает, в чем траблы??
любопытно!!!! Прерывания взяты из datasheeta, и если данную метку переименовать то внешнее прерывание перестает работать (((
Цитата:
Как это вяжется с Attiny2313?
программу тестирую на железе, просто под рукой была именно 16 мега, переделал код под нее, результат не айс, ковырялся не получилось, перенес обратно на тиньку и вот результат...
slyberkut, таблица прерываний у вас оформлена ... не очень. Ознакомьтесь с вот этой темой viewtopic.php?f=57&t=72364
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Вы там видели? Нет там такого. Кстати, откройте "2313def.inc" и поймете почему:
Цитата:
INT0 не может быть меткой
Вы сначала запустите свою программу на Attiny2313, а потом уже мегу, не все сразу Программа, то рабочая, по нажатию на кнопку - прерывание и индикация на светодиодах чего там насчитали, только исправьте пару ошибок. Совершенно верно и хорошо Вам посоветовали:
Kavka писал(а):
Ознакомьтесь с вот этой темой viewtopic.php?f=57&t=72364
Заголовок сообщения: Re: attiny2313 ошибка при компиляции
Добавлено: Чт мар 24, 2016 00:01:04
Родился
Зарегистрирован: Ср мар 23, 2016 13:33:47 Сообщений: 5
Рейтинг сообщения:0
_INT0 заменяем в листинге, и все работает. Листинг из книжки Ревича, сам только начал осваивать МК, и тоже с таким глюком столкнулся. Без прерываний все работает, как нужно. С прерываниями - полный глюк, то один клик, то два вместо одного. С задержками и генератором пробовал разные варианты, мало помогло. Интересно, глюки - это так задумано?) Или просто недоработки?
.org OC2addr ; Timer/Counter2 Compare Match reti // rjmp Proc_Int_BAM // reti
.org OVF2addr ; Timer/Counter2 Overflow reti
.org ICP1addr ; Timer/Counter1 Capture Event reti
.org OC1Aaddr ; Timer/Counter1 Compare Match A reti
.org OC1Baddr ; Timer/Counter1 Compare Match B reti
.org OVF1addr ; Timer/Counter1 Overflow reti
.org OVF0addr ; Timer/Counter0 Overflow reti
.org SPIaddr ; SPI Serial Transfer Complete reti ; rjmp SPI_Transfer_Int
.org URXCaddr ; USART, RX Complete reti
.org UDREaddr ; USART Data Register Empty reti
.org UTXCaddr ; USART, TX Complete reti
.org ADCCaddr ; ADC Conversion Complete reti // rjmp ADC_Complete
.org ERDYaddr ; EEPROM Ready reti
.org ACIaddr ; Analog Comparator reti
.org TWIaddr ; Two-wire Serial Interface reti
.org INT2addr ; External Interrupt Request 2 reti
.org OC0addr ; TimerCounter0 Compare Match rjmp Sys_Timer_Comp
.org SPMRaddr ; Store Program Memory Read reti ;---------- .org INT_VECTORS_SIZE ; size in words ;===================
talich писал(а):
_INT0 заменяем в листинге, и все работает. Листинг из книжки Ревича, сам только начал осваивать МК, и тоже с таким глюком столкнулся. Без прерываний все работает, как нужно. С прерываниями - полный глюк, то один клик, то два вместо одного. С задержками и генератором пробовал разные варианты, мало помогло. Интересно, глюки - это так задумано?) Или просто недоработки?
В обработчике прерывания нужно сохранять регистр SREG и используемые в прерывании регистры. Пример обработчика прерывания. Спойлер
Код:
EXT_INT0: in RSREG,SREG push r16 push r17 push YL push YH ldy PROC_WELD_FLAGS ld r16,Y sbrc r16,n_WELD_YES rjmp EXT_INT0_A ; EXT_INT0 out GICR,RCLR ; Запрет прерывания EXT_INT0. ; TIMER0 in r16,TIMSK cbr r16,1<<OCIE0 out TIMSK,r16 ; Запрет прерывания по совпадению.
rjmp EXT_INT0_END
EXT_INT0_A: ldd r16,Y+DISP_CNT_IMP_CURR ldd r17,Y+DISP_CURR_VALUE_BUF inc r16 cpi r16,11 brlo EXT_INT0_B clr r16 EXT_INT0_B: std Y+DISP_CNT_IMP_CURR,r16 inc r17 cp r16,r17 brsh EXT_INT0_END ; EXT_INT0 out GICR,RCLR ; Запрет прерывания EXT_INT0. ; TIMER0 in r16,TIFR andi r16,1<<OCF0 out TIFR,r16 ; Очистка флага прерывания по совпадению.
in r16,OCR0 subi r16,-(XTAL/64/1000) out OCR0,r16 ; Загрузка в регистр сравнения нужного значения.
in r16,TIMSK sbr r16,1<<OCIE0 out TIMSK,r16 ; Разрешение прерывания по совпадению. ; WELD_IMP_PIN_OUT=1 WELD_IMP_OUT_1
EXT_INT0_END: pop YH pop YL pop r17 pop r16 out SREG,RSREG reti
TIMER0_COMP: in RSREG,SREG push r16 ; WELD_IMP_PIN_OUT=0 WELD_IMP_OUT_0 ; TIMER0 in r16,TIMSK cbr r16,1<<OCIE0 out TIMSK,r16 ; Запрет прерывания по совпадению. ; EXT_INT0 ldi r16,1<<INTF0 out GIFR,r16 ; Сброс флага внешнего прерывания.
ldi r16,1<<INT0 out GICR,r16 ; Разрешение внешнего прерывания.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения