Привет всем хвостатым!!)) Читаю я тут книжку и переписал из нее программу. Программа обычный счетчик нажатий кнопки. Переписал ее для изучения внутренних процессов мк. Так вот при компиляции вываливается ошибка, с которой я ранее не сталкивался, есть идеи?
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 ; Разрешение внешнего прерывания.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения