Страница 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 не использует стек.

Вам правильно сказали. Число 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, отключены и по этому какое либо другое прерывание оно не может быть вызвано, пока вы явно не включите его.
В соответствии с написанным выше, т.к. код нужно располагать после таблицы, то его нужно выравнять с помощью этого:
По поводу этого:
Код: Выделить всё
ldi R16, (1<<DDB3) ; вывод ОС2 ( порт В, 3 бит) на выход
out PORTB, R16
Есть такие команды: SBI и CBI - они устанавливают\сбрасывают любой бит в любом регистре ввода\вывода (впрочем и до других регистров тоже дотягиваются). Т.е. эти строчки можно заменить этим:
+ Этот регистр не контролирует переключение входа на вход или выход. Он выставляет состояние выхода (ноль или один). Это делает 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
можно записать так
Как я уже говорил, конструкция
Код: Выделить всё
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, отключены и по этому какое либо другое прерывание оно не может быть вызвано, пока вы явно не включите его.
В соответствии с написанным выше, т.к. код нужно располагать после таблицы, то его нужно выравнять с помощью этого:
это не самый удачный совет. писать код можно сразу после определения последнего задействованного вектора (если они определяются в правильном порядке), а то вы напрасно потеряете приличный кусок памяти впустую. с другой стороны, если ваш код "грязный", т.е. есть вероятность, что вы разрешите прерывание, для котрого не определен вектор, оба совета не хороши - в таком разе надо определять
ВСЕ векторы, устанавливая на месте неиспользуемых хотя бы
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;
}