attiny2313 ошибка при компиляции

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Аватара пользователя
Сообщения: 403
Зарегистрирован: Пн фев 11, 2008 20:14:38
Откуда: Москва

Сообщение slyberkut »

Привет всем хвостатым!!)) Читаю я тут книжку и переписал из нее программу. Программа обычный счетчик нажатий кнопки. Переписал ее для изучения внутренних процессов мк. Так вот при компиляции вываливается ошибка, с которой я ранее не сталкивался, есть идеи?

Вот сам собственно код:
Спойлер

Код: Выделить всё

.device Attiny2313
.include "2313def.inc"

.def temp = r16
.def Count_time = r17
.def Counter = r18
.def Flag = r19

rjmp RESET ; Reset Handler
rjmp INT0 ; External Interrupt0 Handler
;rjmp INT1 ; External errupt1 Handler
;rjmp TIM1_CAPT ; Timer1 Capture Handler
;rjmp TIM1_COMPA ; Timer1 CompareA Handler
;rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
;rjmp USART0_RXC ; USART0 RX Complete Handler
;rjmp USART0_DRE ; USART0,UDR Empty Handler
;rjmp USART0_TXC ; USART0 TX Complete Handler
;rjmp ANA_COMP ; Analog Comparator Handler
;rjmp PCINT ; Pin Change Interrupt
;rjmp TIMER1_COMPB ; Timer1 Compare B Handler
;rjmp TIMER0_COMPA ; Timer0 Compare A Handler
;rjmp TIMER0_COMPB ; Timer0 Compare B Handler
;rjmp USI_START ; USI Start Handler
;rjmp USI_OVERFLOW ; USI Overflow Handler
;rjmp EE_READY ; EEPROM Ready Handler
;rjmp WDT_OVERFLOW ; Watchdog Overflow Handler

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 как то через жопу некорректно: счет идет после второго нажатия, а иногда бывает и одно нажатие считает, в чем траблы??
Плюс - минус = заряд, фаза - ноль = ???
Контактная информация:
Реклама
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Сообщение Rtmip »

Здравствуйте.
Ругается вот на это:

Код: Выделить всё

...
INT0:
   clr temp
   out GIMSK, temp
....
INT0 не может быть меткой :)
Вообщем надо как то так(пример из сети):

Код: Выделить всё

; Oбработкa прерывания INT0.
;настройка адреса вектора прерывания int0
.org INT0addr
rjmp _INT0
;___________
....
_INT0:
....
reti
Пожалуй и

Код: Выделить всё

.device Attiny2313
лишнее, раз уж есть:

Код: Выделить всё

.include "2313def.inc"
...данная прога работает на atmega16 некорректно...
Как это вяжется с Attiny2313? :shock:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 403
Зарегистрирован: Пн фев 11, 2008 20:14:38
Откуда: Москва

Сообщение slyberkut »

INT0 не может быть меткой
любопытно!!!! Прерывания взяты из datasheeta, и если данную метку переименовать то внешнее прерывание перестает работать (((
Как это вяжется с Attiny2313?
программу тестирую на железе, просто под рукой была именно 16 мега, переделал код под нее, результат не айс, ковырялся не получилось, перенес обратно на тиньку и вот результат...
Плюс - минус = заряд, фаза - ноль = ???
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

slyberkut, таблица прерываний у вас оформлена ... не очень.
Ознакомьтесь с вот этой темой
http://radiokot.ru/forum/viewtopic.php?f=57&t=72364
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Сообщение Rtmip »

slyberkut писал(а):любопытно!!!! Прерывания взяты из datasheeta...
.device Attiny2313
.include "2313def.inc"
Вы там видели? Нет там такого. Кстати, откройте "2313def.inc" и поймете почему:
INT0 не может быть меткой
Вы сначала запустите свою программу на Attiny2313, а потом уже мегу, не все сразу :)
Программа, то рабочая, по нажатию на кнопку - прерывание и индикация на светодиодах чего там насчитали, только исправьте пару ошибок.
Совершенно верно и хорошо Вам посоветовали:
Kavka писал(а):Ознакомьтесь с вот этой темой
viewtopic.php?f=57&t=72364
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 403
Зарегистрирован: Пн фев 11, 2008 20:14:38
Откуда: Москва

Сообщение slyberkut »

А хотел бы поинтересоваться: .cseg и .org 0x0000 крайне желательно указывать? не смотря на то что программка такая простая.
Плюс - минус = заряд, фаза - ноль = ???
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Полезно сразу привыкать к правильнописанию программ, даже простых :-)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 403
Зарегистрирован: Пн фев 11, 2008 20:14:38
Откуда: Москва

Сообщение slyberkut »

Хм странно почему в книге об этом не пишут
Плюс - минус = заряд, фаза - ноль = ???
Контактная информация:
Родился
Сообщения: 5
Зарегистрирован: Ср мар 23, 2016 13:33:47

Сообщение talich »

_INT0 заменяем в листинге, и все работает. Листинг из книжки Ревича, сам только начал осваивать МК, и тоже с таким глюком столкнулся. Без прерываний все работает, как нужно. С прерываниями - полный глюк, то один клик, то два вместо одного. С задержками и генератором пробовал разные варианты, мало помогло. Интересно, глюки - это так задумано?) Или просто недоработки?
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Пусть целевай МК, ищем файл m8535def.inc в папке установки компилятора. В конце этого файла будет таблица векторов. Переделываем ее по примеру.

Оформление таблицы векторов:
Спойлер

Код: Выделить всё

.cseg

.org	0x0000
		rjmp	Reset

;====== INTERRUPT VECTORS ============
.org	INT0addr				; External Interrupt 0
		reti

.org	INT1addr				; External Interrupt 1
		reti

.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 ; Разрешение внешнего прерывания.

	pop		r16
	out		SREG,RSREG
	reti
Контактная информация:
Ответить

Вернуться в «AVR»