насчет UserGuide: надо бы сразу туда глядеть))) лучше поздно, чем никогда))))
AVR studio в вопросах и ответах
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: AVR studio 4 в вопросах и ответах
насчет UserGuide: надо бы сразу туда глядеть))) лучше поздно, чем никогда))))
Ставим плюсы: )
вопросы впервые работащего (работаюЩЕЙ) в Авр студио
Из-за чего возникает ошибка " 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 ',' "
Может посоветуете, где можно почитать про частые ошибки в Авр-студии или что-то в этом духе..=)
И еще , можно же вот так писать ?
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: вопросы впервые работащего (работаюЩЕЙ) в Авр студио
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
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re:
katu6ka писал(а):Насчет невпихуемого - стек был не настроен , уже все отомпилировалось))
Команда ldi не использует стек.

Вам правильно сказали. Число 0x45F занимает 2 байта, а регистры однобайтовые.
Re: AVR studio 4 в вопросах и ответах
ага,не использует. Но ведь настройка ацп была просто корявая + настройки стека не было. настроила стек и все запустилось.
новая проблема - как такое может быть,что в нескольких регистрах (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
новая проблема - как такое может быть,что в нескольких регистрах (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 в вопросах и ответах
В регистре TIFR хранятся флаги действия прерываний. Если вы попытаетесь записать 1 в OCF2 и при этом разрешены глобальные и текущее прерывание, то выработается прерывание (если не ошибаюсь) по OCF2 (совпадение значения счётчика с установленным в таймере 2). Как только прерывание заканчивается, данный флаг сбрасывается. Но т.к. у вас, по вмей видимости, в данный момент запрещены глобальные прерывания, то прерывание не срабатывает и флаг сразу сбрасывается. Вообще, этот регистр лучше не трогать, если нет необходимости - он ничего не настраивает.
А глобальные прерывания лучше разрешать командой SEI и запрещать CLI. Так же следует учитывать, что регистр TIMSK, как и TIFR, является единым для всех таймеров, и по этому, если вы будете настраивать TIMSK таким образом (настраивая нужные биты, а во все остальные писать нули), вы настроите разрешения прерываний для одного таймера, но сбросите остальные. Но это, естественно, не важно, если вы используете только один таймер.
А глобальные прерывания лучше разрешать командой SEI и запрещать CLI. Так же следует учитывать, что регистр TIMSK, как и TIFR, является единым для всех таймеров, и по этому, если вы будете настраивать TIMSK таким образом (настраивая нужные биты, а во все остальные писать нули), вы настроите разрешения прерываний для одного таймера, но сбросите остальные. Но это, естественно, не важно, если вы используете только один таймер.
Последний раз редактировалось IfoR Чт июн 16, 2011 13:04:41, всего редактировалось 2 раза.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
Из даташита на мегу8:
Все правильно.
OCF2 is cleared by writing a logic one to the flag.
Все правильно.
Docendo discimus
Re: AVR studio 4 в вопросах и ответах
Я настраиваю 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)" ?
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 в вопросах и ответах
Ну так сказано же, что OCF2 ставится сам при срабатывании прерывания. Он же сам и очищается. Зачем вам нужно писать туда единицу?
Для вашего кода достаточно выполнить это:
Для вашего кода достаточно выполнить это:
Код: Выделить всё
ldi Temp, 0b01101100 ; настройка режима работы Т/С2, в т.ч. CLK/64, быстрый ШИМ и При совпадении ноль
out TCCR2, Temp
ldi Temp, 0b01000000 ; Bit 7 – TOIE2 установлен, разрешает прерывание по переполнению
out TIMSK, Temp
seiRe: AVR studio 4 в вопросах и ответах
понятно,спасибо.
Re: AVR studio 4 в вопросах и ответах
Скажите,а таймер-счетчик надо как-то включать отдельно?? в описании в даташите и в примерах прог не видела,чтоб его как-то отдельно включали,как АЦП.
Прогоняю пошагово программу, но , похоже, что таймер-счетчик не считает. А должен наверно =)
В моей программе действие совершается (ну а на деле пока что НЕ совершается) по переполнению таймера-счетчика,но он не считает.
Если засунуть вручную FF, то оно отображается, в OCR2 все биты черненькие становятся.
А еще почему-то по команде
ldi R16, 0b11111111 ; ПОЛОЖИТЬ В OCR 0*FF ; на выходе будет лог. 1
out OCR2, R16
с OCRом ничего не происходит.
Прогоняю пошагово программу, но , похоже, что таймер-счетчик не считает. А должен наверно =)
В моей программе действие совершается (ну а на деле пока что НЕ совершается) по переполнению таймера-счетчика,но он не считает.
Если засунуть вручную FF, то оно отображается, в OCR2 все биты черненькие становятся.
А еще почему-то по команде
ldi R16, 0b11111111 ; ПОЛОЖИТЬ В OCR 0*FF ; на выходе будет лог. 1
out OCR2, R16
с OCRом ничего не происходит.
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
Ммм... Точно не считает? Счёт в счетчике должен идти через каждые 64 цикла.
Re: AVR studio 4 в вопросах и ответах
Уже считает =))
Но вот в ОСR2 по вышуказанной программе ничего не ложит.
И в обработчик прерывания никак стрелка-шагатель не встает..
Но вот в ОСR2 по вышуказанной программе ничего не ложит.
И в обработчик прерывания никак стрелка-шагатель не встает..
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
Тогда можно выложить весь код?
Не судите строго, первая программа.
.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 ;выход из обработчика прер-я АЦП
.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 в вопросах и ответах
.. ну во-первых раз это mega8, то следущий вектор идет не через раз.... правильно будетkatu6ka писал(а):Код: Выделить всё
.ORG $000 rjmp RESET ; Reset Handler
.ORG $002 ;rjmp EXT_INT0 ; IRQ0 Handler
Код: Выделить всё
.ORG $000
rjmp RESET
reti ; rjmp EXT_INT0
reti ;
.... и т.д.Код: Выделить всё
.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 бит) на выход
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
В таблице векторов можно не прописывать каждый вектор. Достаточно описать только нужные. По умолчанию все прерывания, кроме RESET, отключены и по этому какое либо другое прерывание оно не может быть вызвано, пока вы явно не включите его.
В соответствии с написанным выше, т.к. код нужно располагать после таблицы, то его нужно выравнять с помощью этого:
По поводу этого:
Есть такие команды: SBI и CBI - они устанавливают\сбрасывают любой бит в любом регистре ввода\вывода (впрочем и до других регистров тоже дотягиваются). Т.е. эти строчки можно заменить этим:
+ Этот регистр не контролирует переключение входа на вход или выход. Он выставляет состояние выхода (ноль или один). Это делает DDRB:
Как уже сказали выше, лучше создать макрос outi. Это самый используемый макрос при настройке регистров.
Теперь конструкцию
можно записать так
Как я уже говорил, конструкция
Это почти тоже самое, что просто
Отличие только в том, что ваша конструкция устанавливает флаг I, но сбрасывает все остальные. А SEI только устанавливает флаг I.
Следовательно, этот код здесь вообще не нужен, т.к. неуместен. SEI уже у вас стоит в нужном месте.
Шестнадцатеричные числа можно писать в виде: 0xFF .
Теперь тот же самый код, но переписанный с использование вышенаписанных поправок, будет выглядеть так:
По поводу сохранения регистра R17 в стек. В общем случае, да, его нужно сохранять в стек. Но если вы уверены, что внезапное изменение значения этого регистра в любой момент времени (вызов прерывания) никак не повлияет на ход вашей программы (как в вашем коде - R17 больше нигде не используется), то его можно и не сохранять.
А вот теперь по поводу неизменности значения OCR2. Ну, что тут сказать: похоже, очередной глюк АВР студии. Я уже заметил, что симулятор там как-то странно обращается с таймерами. Если прогнать это программку в PROTEUS-е, то там все работает и у меня нет причин ему не верить! Ну, что же, это же фирменная среда разработки от AVR.
Да, кстати, прерывание у меня тоже отрабатывает. Причём и в студии. Если у вас нет, то возможно тоже глюк. Решение: обновить.
В соответствии с написанным выше, т.к. код нужно располагать после таблицы, то его нужно выравнять с помощью этого:
Код: Выделить всё
.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Это почти тоже самое, что просто
Код: Выделить всё
SEIОтличие только в том, что ваша конструкция устанавливает флаг 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.
Да, кстати, прерывание у меня тоже отрабатывает. Причём и в студии. Если у вас нет, то возможно тоже глюк. Решение: обновить.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio 4 в вопросах и ответах
это не самый удачный совет. писать код можно сразу после определения последнего задействованного вектора (если они определяются в правильном порядке), а то вы напрасно потеряете приличный кусок памяти впустую. с другой стороны, если ваш код "грязный", т.е. есть вероятность, что вы разрешите прерывание, для котрого не определен вектор, оба совета не хороши - в таком разе надо определять ВСЕ векторы, устанавливая на месте неиспользуемых хотя бы reti - всяко безопаснее (хотя поиск ошибок отнюдь не облегчает)...IfoR писал(а):В таблице векторов можно не прописывать каждый вектор. Достаточно описать только нужные. По умолчанию все прерывания, кроме RESET, отключены и по этому какое либо другое прерывание оно не может быть вызвано, пока вы явно не включите его.
В соответствии с написанным выше, т.к. код нужно располагать после таблицы, то его нужно выравнять с помощью этого:Код: Выделить всё
.ORG INT_VECTORS_SIZE
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
kyraxinoff
- Родился
- Сообщения: 13
- Зарегистрирован: Пн апр 19, 2010 09:58:37
Re: AVR studio 4 в вопросах и ответах
Помогите пожалуйста, разобраться почему не работает прерывание, пишу на Си в 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;
}
Так вот собственно проблема надо что бы в результате прерывания 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 раз.
