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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

:))) понятно)
насчет UserGuide: надо бы сразу туда глядеть))) лучше поздно, чем никогда))))
Ставим плюсы: )
katu6ka
Родился
Сообщения: 9
Зарегистрирован: Чт июн 16, 2011 10:48:32

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

Сообщение 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 ',' "

Может посоветуете, где можно почитать про частые ошибки в Авр-студии или что-то в этом духе..=)
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение 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 в вашем сообщении.
Docendo discimus
katu6ka
Родился
Сообщения: 9
Зарегистрирован: Чт июн 16, 2011 10:48:32

Сообщение katu6ka »

Спасибо за помощь))
Поняла ошибку настройки АЦП, не подумала , что установка одного бита таким образом сбрасывает установленные ранее. Записала вместо тех трех строк вот так :

ldi R16, 0b11100000
out ADCSRA, R16

Насчет невпихуемого - стек был не настроен , уже все отомпилировалось))
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re:

Сообщение IfoR »

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

Команда ldi не использует стек. :dont_know:
Вам правильно сказали. Число 0x45F занимает 2 байта, а регистры однобайтовые.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
katu6ka
Родился
Сообщения: 9
Зарегистрирован: Чт июн 16, 2011 10:48:32

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

Сообщение 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
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

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

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Из даташита на мегу8:
OCF2 is cleared by writing a logic one to the flag.

Все правильно.
Docendo discimus
katu6ka
Родился
Сообщения: 9
Зарегистрирован: Чт июн 16, 2011 10:48:32

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

Сообщение 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)" ?
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

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

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

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


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

sei
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
katu6ka
Родился
Сообщения: 9
Зарегистрирован: Чт июн 16, 2011 10:48:32

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

Сообщение katu6ka »

понятно,спасибо.
katu6ka
Родился
Сообщения: 9
Зарегистрирован: Чт июн 16, 2011 10:48:32

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

Сообщение katu6ka »

Скажите,а таймер-счетчик надо как-то включать отдельно?? в описании в даташите и в примерах прог не видела,чтоб его как-то отдельно включали,как АЦП.

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

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

А еще почему-то по команде
ldi R16, 0b11111111 ; ПОЛОЖИТЬ В OCR 0*FF ; на выходе будет лог. 1
out OCR2, R16
с OCRом ничего не происходит.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Ммм... Точно не считает? Счёт в счетчике должен идти через каждые 64 цикла.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
katu6ka
Родился
Сообщения: 9
Зарегистрирован: Чт июн 16, 2011 10:48:32

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

Сообщение katu6ka »

Уже считает =))

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

И в обработчик прерывания никак стрелка-шагатель не встает..
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Тогда можно выложить весь код?
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
katu6ka
Родился
Сообщения: 9
Зарегистрирован: Чт июн 16, 2011 10:48:32

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

Сообщение 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 ;выход из обработчика прер-я АЦП
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение 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 раза и ее будет проще читать .
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение 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. :)
Да, кстати, прерывание у меня тоже отрабатывает. Причём и в студии. Если у вас нет, то возможно тоже глюк. Решение: обновить.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

.ORG   INT_VECTORS_SIZE

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

Мой уютный бложик... заходите!
kyraxinoff
Родился
Сообщения: 13
Зарегистрирован: Пн апр 19, 2010 09:58:37

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

Сообщение 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;
}
Последний раз редактировалось kyraxinoff Пт июн 17, 2011 13:21:25, всего редактировалось 1 раз.
Ответить

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