Страница 34 из 160

Re: AVR studio 4 в вопросах и ответах

Добавлено: Ср июн 15, 2011 16:19:21
ibiza11
:))) понятно)
насчет UserGuide: надо бы сразу туда глядеть))) лучше поздно, чем никогда))))

вопросы впервые работащего (работаюЩЕЙ) в Авр студио

Добавлено: Чт июн 16, 2011 11:05:07
katu6ka
Из-за чего возникает ошибка " error: Operand(s) out of range in 'ldi r16,0x45f' " ??

И еще , можно же вот так писать ?

ldi R16, (1<<ADEN)
out ADCSRA, R16 ; Включение АЦП (разрешение его работы)

ldi R16, (1<<ADFR) ; автоматическое преобр-е -- ГДЕ ПРОПИСЫВАТЬ??
out ADСSRA, R16

ldi R16, (1<<ADSC) ; первое преобразование
out ADСSRA, R16

на эту запись компилятор говорит : "error: SRA: Unknown instruction or macro syntax error, unexpected ',' "

Может посоветуете, где можно почитать про частые ошибки в Авр-студии или что-то в этом духе..=)

Re: вопросы впервые работащего (работаюЩЕЙ) в Авр студио

Добавлено: Чт июн 16, 2011 11:34:45
pyzhman
katu6ka писал(а):error: Operand(s) out of range in 'ldi r16,0x45f'
разрядность операнда выше разрядности регистра. Вы пытаетесь впихнуть невпихуемое.
katu6ka писал(а):можно же вот так писать ?
Написать можно все, что угодно. Другое дело, будет ли работать. Смотрите: устанавливаем ADEN, хорошо, включили АЦП. Следующей командой устанавливаем ADFR, но одновременно сбрасываем ADEN. В итоге получается фигня. Ну это так, к слову.
katu6ka писал(а):error: SRA: Unknown instruction or macro syntax error, unexpected ','
Посмотрите в файле подключаемой библиотеки используемого мк как определен регистр состояния АЦП - компилятор не понимает аббревиатуры ADCSRA в вашем сообщении.

Добавлено: Чт июн 16, 2011 11:51:37
katu6ka
Спасибо за помощь))
Поняла ошибку настройки АЦП, не подумала , что установка одного бита таким образом сбрасывает установленные ранее. Записала вместо тех трех строк вот так :

ldi R16, 0b11100000
out ADCSRA, R16

Насчет невпихуемого - стек был не настроен , уже все отомпилировалось))

Re:

Добавлено: Чт июн 16, 2011 12:11:27
IfoR
katu6ka писал(а):Насчет невпихуемого - стек был не настроен , уже все отомпилировалось))
Команда ldi не использует стек. :dont_know:
Вам правильно сказали. Число 0x45F занимает 2 байта, а регистры однобайтовые.

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 12:18:57
katu6ka
ага,не использует. Но ведь настройка ацп была просто корявая + настройки стека не было. настроила стек и все запустилось.

новая проблема - как такое может быть,что в нескольких регистрах (TCCR2, TIMSK, SREG) биты нормально выставляются, а в некоторых не хотят (TIFR)? пошагово проверяю программу, в тифре не устанавливается бит.

ldi Temp, 0b01101100 ; настройка режима работы Т/С2, в т.ч. CLK/64, быстрый ШИМ и При совпадении ноль
out TCCR2, Temp


ldi Temp, 0b01000000 ; Bit 7 – TOIE2 установлен, разрешает прерывание по переполнению
out TIMSK, Temp

ldi Temp, 0b10000000 ; OCF2 установить -- НО ПОЧЕМУ -ТО НЕ ХОЧЕТ УСТАНАВЛИВАТЬСЯ
out TIFR, Temp

ldi Temp, 0b10000000 ; 1<< I bit в регистре статуса SREG ( Global Interrupts Enable )
out SREG, Temp

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 12:33:20
IfoR
В регистре TIFR хранятся флаги действия прерываний. Если вы попытаетесь записать 1 в OCF2 и при этом разрешены глобальные и текущее прерывание, то выработается прерывание (если не ошибаюсь) по OCF2 (совпадение значения счётчика с установленным в таймере 2). Как только прерывание заканчивается, данный флаг сбрасывается. Но т.к. у вас, по вмей видимости, в данный момент запрещены глобальные прерывания, то прерывание не срабатывает и флаг сразу сбрасывается. Вообще, этот регистр лучше не трогать, если нет необходимости - он ничего не настраивает.
А глобальные прерывания лучше разрешать командой SEI и запрещать CLI. Так же следует учитывать, что регистр TIMSK, как и TIFR, является единым для всех таймеров, и по этому, если вы будете настраивать TIMSK таким образом (настраивая нужные биты, а во все остальные писать нули), вы настроите разрешения прерываний для одного таймера, но сбросите остальные. Но это, естественно, не важно, если вы используете только один таймер.

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 12:43:03
pyzhman
Из даташита на мегу8:
OCF2 is cleared by writing a logic one to the flag.
Все правильно.

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 12:49:56
katu6ka
Я настраиваю Timsk , Sreg и Tifr п.ч. :

The OCF2 bit is set (one) when a Compare Match occurs between the Timer/Counter2
and the data in OCR2 – Output Compare Register2. OCF2 is cleared by hardware when
executing the corresponding interrupt Handling Vector.
Alternatively, OCF2 is cleared
by writing a logic one to the flag.
When the I-bit in SREG, OCIE2 (Timer/Counter2 Compare
Match Interrupt Enable), and OCF2 are set (one), the Timer/Counter2 Compare
Match Interrupt is executed.

возможно я заблуждаюсь,но я так поняла, что нужно установить I-bit in SREG, OCIE2 в TIMSK и OCF2 в TIFR .

но просто запись единички в OCF2 отображается очищенным битом?
раз "OCF2 is cleared by writing a logic one to the flag" , но тем не менее нужно "OCF2 are set (one)" ?

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 12:59:07
IfoR
Ну так сказано же, что OCF2 ставится сам при срабатывании прерывания. Он же сам и очищается. Зачем вам нужно писать туда единицу?
Для вашего кода достаточно выполнить это:

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

ldi Temp, 0b01101100 ; настройка режима работы Т/С2, в т.ч. CLK/64, быстрый ШИМ и При совпадении ноль
out TCCR2, Temp


ldi Temp, 0b01000000 ; Bit 7 – TOIE2 установлен, разрешает прерывание по переполнению
out TIMSK, Temp

sei

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 13:04:51
katu6ka
понятно,спасибо.

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 13:41:43
katu6ka
Скажите,а таймер-счетчик надо как-то включать отдельно?? в описании в даташите и в примерах прог не видела,чтоб его как-то отдельно включали,как АЦП.

Прогоняю пошагово программу, но , похоже, что таймер-счетчик не считает. А должен наверно =)

В моей программе действие совершается (ну а на деле пока что НЕ совершается) по переполнению таймера-счетчика,но он не считает.
Если засунуть вручную FF, то оно отображается, в OCR2 все биты черненькие становятся.

А еще почему-то по команде
ldi R16, 0b11111111 ; ПОЛОЖИТЬ В OCR 0*FF ; на выходе будет лог. 1
out OCR2, R16
с OCRом ничего не происходит.

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 14:16:23
IfoR
Ммм... Точно не считает? Счёт в счетчике должен идти через каждые 64 цикла.

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 14:30:25
katu6ka
Уже считает =))

Но вот в ОСR2 по вышуказанной программе ничего не ложит.

И в обработчик прерывания никак стрелка-шагатель не встает..

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 14:48:56
IfoR
Тогда можно выложить весь код?

Не судите строго, первая программа.

Добавлено: Чт июн 16, 2011 18:13:08
katu6ka
.include "m8def.inc"
.def Temp=R16
.cseg
.ORG $000 rjmp RESET ; Reset Handler
.ORG $002 ;rjmp EXT_INT0 ; IRQ0 Handler
reti
.ORG $004 ;rjmp EXT_INT1 ; IRQ1 Handler
reti
.ORG $006 ; rjmp TIM2_COMP ; Timer2 Compare Handler
reti
.ORG $008 rjmp TIM2_OVF ; Timer2 Overflow Handler
.ORG $00A ; rjmp TIM1_CAPT ; Timer1 Capture Handler
reti
.ORG $00C ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti
.ORG $00E ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti
.ORG $010 ;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti
.ORG $012 ;rjmp TIM0_OVF ; Timer0 Overflow Handler
reti
.ORG $014 ;rjmp SPI_STC ; SPI Transfer Complete Handler
reti
.ORG $016 ;rjmp USART_RXC ; USART RX Complete Handler
reti
.ORG $018 ;rjmp USART_UDRE ; UDR Empty Handler
reti
.ORG $01A ;rjmp USART_TXC ; USART TX Complete Handler
reti
.ORG $01C ;rjmp ADC ; ADC Conversion Complete Handler
reti
.ORG $020 ;rjmp EE_RDY ; EEPROM Ready Handler
reti
.ORG $022 ;rjmp ANA_COMP ; Analog Comparator Handler
reti
.ORG $024 ;rjmp TWSI ; Two-wire Serial Interface Handler
reti
.ORG $026 ;rjmp SPM_RDY ; Store Program Memory Ready Handler
reti
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;**************************************************
Reset: ldi R16, (1<<DDB3) ; вывод ОС2 ( порт В, 3 бит) на выход
out PORTB, R16

ldi Temp, 0b01101100 ; настройка режима работы Т/С2, в т.ч. CLK/64, быстрый ШИМ и При совпадении ноль
out TCCR2, Temp

ldi Temp, 0b01000000 ; Bit 6 – TOIE2 установлен, разрешает прерывание по переполнению
out TIMSK, Temp

;ldi Temp, 0b10000000 ; OCF2 установлен - но не хочет – говорят не надо прописывать!
;out TIFR, Temp ;

ldi Temp, 0b10000000 ; 1<< I bit в регистре статуса SREG ( Global Interrupts Enable )
; и все же прописываем мы или тоже не надо, как и OCF2 ??
out SREG, Temp

LDI R16,Low(RAMEND) ; Инициализация стека
OUT SPL,R16 ;
LDI R16,High(RAMEND)
OUT SPH,R16

;настройка АЦП
ldi R16, (1<<ADLAR) ; выравнивание слева (результат в старших разрядах)
out ADMUX, R16
sei ;разрешить прерывания
;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
begin:
ldi R16, 0b11100000
out ADCSRA, R16
ldi R16, 0b11111111 ; ПОЛОЖИТЬ В OCR 0*FF ; на выходе будет лог. 1
out OCR2, R16 ; А НИЧЕГО НЕ ПРОИСХОДИТ ...
Inf: rjmp Inf ;бесконечный цикл -- ждем прерывания
;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ таймера (как переполнился, так можно класть новое значение OCR)
;*************************************************
TIM2_OVF: in R17, ADCH ; тут говорят надо в стеке сохранять R17
out OCR2, R17;
reti ;выход из обработчика прер-я АЦП

Re: AVR studio 4 в вопросах и ответах

Добавлено: Чт июн 16, 2011 18:54:27
ChipKiller
katu6ka писал(а):

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

.ORG $000 rjmp RESET ; Reset Handler
.ORG $002 ;rjmp EXT_INT0 ; IRQ0 Handler
.. ну во-первых раз это mega8, то следущий вектор идет не через раз.... правильно будет

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

.ORG $000 
rjmp RESET
reti  ; rjmp EXT_INT0
reti  ;
.... и т.д.
2. напишите макрос

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

.macro  outi
		ldi	R16,@1
		out @0,R16
.endm

; .... и вместо 2-х строк

ldi R16, (1<<DDB3) ; вывод ОС2 ( порт В, 3 бит) на выход
out PORTB, R16

; можно писать одну

outi PORTB,(1<<DDB3) ; вывод ОС2 ( порт В, 3 бит) на выход

.. ваша программа станет короче почти в 2 раза и ее будет проще читать .

Re: AVR studio 4 в вопросах и ответах

Добавлено: Пт июн 17, 2011 12:01:51
IfoR
В таблице векторов можно не прописывать каждый вектор. Достаточно описать только нужные. По умолчанию все прерывания, кроме RESET, отключены и по этому какое либо другое прерывание оно не может быть вызвано, пока вы явно не включите его.
В соответствии с написанным выше, т.к. код нужно располагать после таблицы, то его нужно выравнять с помощью этого:

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

.ORG	INT_VECTORS_SIZE
По поводу этого:

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

ldi    R16, (1<<DDB3) ; вывод ОС2 ( порт В, 3 бит) на выход
   out    PORTB, R16
Есть такие команды: SBI и CBI - они устанавливают\сбрасывают любой бит в любом регистре ввода\вывода (впрочем и до других регистров тоже дотягиваются). Т.е. эти строчки можно заменить этим:

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

SBI    PORTB, 3
+ Этот регистр не контролирует переключение входа на вход или выход. Он выставляет состояние выхода (ноль или один). Это делает DDRB:

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

SBI    DDRB, 3 ; вывод ОС2 ( порт В, 3 бит) на выход
Как уже сказали выше, лучше создать макрос outi. Это самый используемый макрос при настройке регистров.

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

.MACRO outi // Отправка константы в регистр в/в		
	ldi 	Temp, @1 			
	out 	@0, Temp 			
.ENDMACRO
Теперь конструкцию

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

ldi 	Temp, 0b01101100 ; настройка режима работы Т/С2, в т.ч. CLK/64, быстрый ШИМ и При совпадении ноль
	out 	TCCR2, Temp
можно записать так

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

outi	TCCR2, 0b01101100
Как я уже говорил, конструкция

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

ldi 	Temp, 0b10000000 ; 1<< I bit в регистре статуса SREG ( Global Interrupts Enable )
	; и все же прописываем мы или тоже не надо, как и OCF2 ??
	out 	SREG, Temp
Это почти тоже самое, что просто Отличие только в том, что ваша конструкция устанавливает флаг I, но сбрасывает все остальные. А SEI только устанавливает флаг I.
Следовательно, этот код здесь вообще не нужен, т.к. неуместен. SEI уже у вас стоит в нужном месте.
Шестнадцатеричные числа можно писать в виде: 0xFF .

Теперь тот же самый код, но переписанный с использование вышенаписанных поправок, будет выглядеть так:

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

.include "m8def.inc"
.def Temp=R16

.MACRO outi // Отправка константы в регистр в/в		
	ldi 	Temp, @1 			
	out 	@0, Temp 			
.ENDMACRO

.cseg
.ORG $000 
	rjmp RESET ; Reset Handler
.ORG $008 
	rjmp TIM2_OVF ; Timer2 Overflow Handler

;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;**************************************************
.ORG	INT_VECTORS_SIZE

Reset: 
	SBI    DDRB, 3 ; вывод ОС2 ( порт В, 3 бит) на выход

 	outi 	TCCR2, 0b01101100 ; настройка режима работы Т/С2, в т.ч. CLK/64, быстрый ШИМ и При совпадении ноль
	outi	TIMSK, 0b01000000 ; Bit 6 – TOIE2 установлен, разрешает прерывание по переполнению

	outi	SPL, low(RAMEND)   ; Инициализация стека
	outi	SPH, high(RAMEND)

	;настройка АЦП
	outi	ADMUX, (1<<ADLAR) ; выравнивание слева (результат в старших разрядах)

	sei ;разрешить прерывания

;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
begin:
	outi	ADCSRA, 0b11100000
	outi	OCR2, 0xFF ; ПОЛОЖИТЬ В OCR 0xFF ; на выходе будет лог. 1
	; А НИЧЕГО НЕ ПРОИСХОДИТ ...

Inf: 
	rjmp 	Inf ;бесконечный цикл -- ждем прерывания

;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ таймера (как переполнился, так можно класть новое значение OCR)
;*************************************************
TIM2_OVF: 
	in 	R17, ADCH ; тут говорят надо в стеке сохранять R17
	out 	OCR2, R17;
	reti 	;выход из обработчика прер-я АЦП
По поводу сохранения регистра R17 в стек. В общем случае, да, его нужно сохранять в стек. Но если вы уверены, что внезапное изменение значения этого регистра в любой момент времени (вызов прерывания) никак не повлияет на ход вашей программы (как в вашем коде - R17 больше нигде не используется), то его можно и не сохранять.

А вот теперь по поводу неизменности значения OCR2. Ну, что тут сказать: похоже, очередной глюк АВР студии. Я уже заметил, что симулятор там как-то странно обращается с таймерами. Если прогнать это программку в PROTEUS-е, то там все работает и у меня нет причин ему не верить! Ну, что же, это же фирменная среда разработки от AVR. :)
Да, кстати, прерывание у меня тоже отрабатывает. Причём и в студии. Если у вас нет, то возможно тоже глюк. Решение: обновить.

Re: AVR studio 4 в вопросах и ответах

Добавлено: Пт июн 17, 2011 12:10:56
ARV
IfoR писал(а):В таблице векторов можно не прописывать каждый вектор. Достаточно описать только нужные. По умолчанию все прерывания, кроме RESET, отключены и по этому какое либо другое прерывание оно не может быть вызвано, пока вы явно не включите его.
В соответствии с написанным выше, т.к. код нужно располагать после таблицы, то его нужно выравнять с помощью этого:

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

.ORG	INT_VECTORS_SIZE
это не самый удачный совет. писать код можно сразу после определения последнего задействованного вектора (если они определяются в правильном порядке), а то вы напрасно потеряете приличный кусок памяти впустую. с другой стороны, если ваш код "грязный", т.е. есть вероятность, что вы разрешите прерывание, для котрого не определен вектор, оба совета не хороши - в таком разе надо определять ВСЕ векторы, устанавливая на месте неиспользуемых хотя бы reti - всяко безопаснее (хотя поиск ошибок отнюдь не облегчает)...

Re: AVR studio 4 в вопросах и ответах

Добавлено: Пт июн 17, 2011 13:17:40
kyraxinoff
Помогите пожалуйста, разобраться почему не работает прерывание, пишу на Си в AVRStudio 4.18. WinAVR версии 20100110.
Так вот собственно проблема надо что бы в результате прерывания LED(глобальная переменная) присваивалась 1, пытаюсь соорудить задержку, на 16-разрядном таймере 1 с использованием переполнения таймера, 0,2 сек при кварце 7372800 получается значение 0x03E8.

Вот необходимые куски проги:

unsigned int LED ;

void TIMERC1_init (void)
{
TCCR1A=0x00;
TCCR1B=(1<<CS12)|(0<<CS11)|(1<<CS10);
TIMSK=(1 << TOIE1);

TCNT1H=0x03;
TCNT1L=0xE8;

sei();
}

ISR (SIG_OVF1_vect)
{
LED=1;
}