А метка Ресет-то где?Black_Wolf писал(а):На мой взгляд разницы быть не должно.
Таймеры/счётчики в AVR
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Таймеры/счётчики в AVR
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
-
Black_Wolf
- Родился
- Сообщения: 19
- Зарегистрирован: Вс окт 27, 2013 14:07:37
Re: Таймеры/счётчики в AVR
Gudd-Head,
Думаю, Вы прочитали мои последние посты - это обрывки кода, относящиеся только к прерыванию TIM2_OVF.
akl,
Если не затруднит, то откомпилируйте, пож-та, в вашей AtmelStudio для ATMega8 нижеуказанный код:
Единственно, нужны два hex-файла:
1. Как в коде выше,
2. В прерывании TIM2_OVF есть закомментированные три строки "nop". Раскомментируйте их и скомпилируйте 2-й hex-файл.
Поможете?
Также прикрепил проект (для компилирования): Кстати, поставил AtmelStudio 6.1, но проблемы с обработчиком прерывания TIM2_OVF теже: если в вышеуказанном коде раскомментировать три строки "nop" (сразу за меткой TIM2_OVF:), то обработчик TIM2_OVF уже не работает в ISIS. :-/
Думаю, Вы прочитали мои последние посты - это обрывки кода, относящиеся только к прерыванию TIM2_OVF.
akl,
Если не затруднит, то откомпилируйте, пож-та, в вашей AtmelStudio для ATMega8 нижеуказанный код:
Спойлер
Код: Выделить всё
/*
* ATMega8_Test_Asynchronous.asm
*
* Created: 27.10.2013 13:10:41
* Author: Alex
*/
;.include "m8def.inc"
.def Seconds=R16
.def SetOnVD1=R17
.def SetOnVD2=R20
.def Temp=R18
.CSEG
.ORG 0
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_COMPB ; Timer1 CompareB Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
rjmp USART_UDRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
rjmp ADC_IRQ ; ADC Conversion Complete Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWSI ; Two-wire Serial Interface Handler
rjmp SPM_RDY ; Store Program Memory Ready Handler
EXT_INT0: ret ; IRQ0 Handler
EXT_INT1: ret ; IRQ1 Handler
TIM2_COMP: ret ; Timer2 Compare Handler
;TIM2_OVF: ret ; Timer2 Overflow Handler
TIM1_CAPT: ret ; Timer1 Capture Handler
TIM1_COMPA: ret ; Timer1 CompareA Handler
TIM1_COMPB: ret ; Timer1 CompareB Handler
TIM1_OVF: ret ; Timer1 Overflow Handler
TIM0_OVF: ret ; Timer0 Overflow Handler
SPI_STC: ret ; SPI Transfer Complete Handler
USART_RXC: ret ; USART RX Complete Handler
USART_UDRE: ret ; UDR Empty Handler
USART_TXC: ret ; USART TX Complete Handler
ADC_IRQ: ret ; ADC Conversion Complete Handler
EE_RDY: ret ; EEPROM Ready Handler
ANA_COMP: ret ; Analog Comparator Handler
TWSI: ret ; Two-wire Serial Interface Handler
SPM_RDY: ret ; Store Program Memory Ready Handler
TIM2_OVF:
;Timer2 Overflow Handler
;nop
;nop
;nop
cpi Seconds,0
brbs 1, TurnON_VD2 ;BRBS - Branch if Bit in SREG is Set
TurnON_VD1:
out PortD, SetOnVD1
inc Seconds
rjmp TIM2_OVF_Exit
TurnON_VD2:
out PortD, SetOnVD2
dec Seconds
TIM2_OVF_Exit:
reti
RESET:
cli ; Clear the interrupt bit in the status register, disable interrupt execution
;Инициализация стека
ldi r16,high(RAMEND); Main program start. RAMEND is the highest 16-bit address in SRAM
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
;НАСТРОЙКА TIMER/COUNTER2 В АСИНХРОННЫЙ РЕЖИМ
;1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2.
;Запрепить прерывания, сбросив биты OCIE2 and TOIE2 в регистре TIMSK, биты 7 и 6
clr Temp
cbr Temp, (1<<OCIE2)|(1<<TOIE2)
out TIMSK, Temp
;2. Select clock source by setting AS2 as appropriate
;Установить бит AS2 = 1 в регистре ASSR, бит 3
clr Temp
sbr Temp, (1<<AS2)
out ASSR, Temp
;3. Write new values to TCNT2, OCR2, and TCCR2.
;Записать новые значения в TCNT2 (хранит значение),
;OCR2 (вых. рег-р сравнения), and TCCR2 (рег-р управл-я, вкл. предделителями)
clr Temp
out TCNT2, Temp
out OCR2, Temp ;В программе не используется
;Устанавливаем предделитель = 128
;32,768 кГц / 128 / 256 => переполнение раз в 1 сек.
clr Temp
sbr Temp, (1<<CS22)|(0<<CS21)|(1<<CS20)
out TCCR2, Temp
;4. To switch to asynchronous operation:
;Wait for TCN2UB, OCR2UB, and TCR2UB - биты 2, 1, 0 в ASSR
;В ASSR д.б. значение 0b00001000, проверяем его.
Wait_For_Switch_ASSR:
in Temp, ASSR
andi Temp, (0<<AS2)|(1<<TCN2UB)|(1<<OCR2UB)|(1<<TCR2UB)
brbc SREG_Z, Wait_For_Switch_ASSR ;BRBC - Branch if Bit in SREG is Cleared
;<END Wait_For_Switch_ASSR>
;5. Clear the Timer/Counter2 Interrupt Flags.
;Сбросить флаги прерываний OCF2 и TOV2 (биты 7 и 6 в TIFR), записав в них "1", т.к.:
;Alternatively, OCF2 is cleared by writing a logic one to the flag
;Alternatively, TOV2 is cleared by writing a logic one to the flag.
clr Temp
sbr Temp, (1<<OCF2)|(1<<TOV2)
out TIFR, Temp
;6. Enable interrupts, if needed.
;Разрешаем прерывания по переполнению в Timer/Counter2
;Записать TOIE2 = 1 (бит 6 в TIMSK)
clr Temp
sbr Temp, (1<<TOIE2)
out TIMSK, Temp
;<END НАСТРОЙКА TIMER/COUNTER2 В АСИНХРОННЫЙ РЕЖИМ>
;Вспомогательные переменные
ldi Seconds, 0
ldi SetOnVD1, 0b00011110
ldi SetOnVD2, 0b11100000
;Настройка порта C и D на вывод.
ldi Temp,0b11111111
out ddrc,Temp
out ddrb,Temp
clr Temp
out PortC, Temp
sei ; Enable interrupts
;<END RESET>
Main:
Ldi Temp, 0b00000001
out PortD, Temp
rjmp Main
1. Как в коде выше,
2. В прерывании TIM2_OVF есть закомментированные три строки "nop". Раскомментируйте их и скомпилируйте 2-й hex-файл.
Поможете?
Также прикрепил проект (для компилирования): Кстати, поставил AtmelStudio 6.1, но проблемы с обработчиком прерывания TIM2_OVF теже: если в вышеуказанном коде раскомментировать три строки "nop" (сразу за меткой TIM2_OVF:), то обработчик TIM2_OVF уже не работает в ISIS. :-/
Re: Таймеры/счётчики в AVR
Как-то так
Правда, не понятно что Вы хотите увидеть от этой проги. Вроде, в прерывании идет вывод на порт D, но оный на вывод не настроен. Или настроенный на вывод порт B это ошибка?
Также в ступор меня ввела команда
и, хотя, студия даже не пискнула я её не понимаю.
Также в ступор меня ввела команда
Код: Выделить всё
brbc SREG_Z, Wait_For_Switch_ASSR ;BRBC - Branch if Bit in SREG is Clearedи, хотя, студия даже не пискнула я её не понимаю.
-
Black_Wolf
- Родился
- Сообщения: 19
- Зарегистрирован: Вс окт 27, 2013 14:07:37
Re: Таймеры/счётчики в AVR
akl,
Испытал в ISIS файлы "TEST1.hex" и "TEST2.hex". Первый работает, второй - нет. Получается, что Atmel Studio v.6.1 у меня работает. Кстати, обратил внимание, что программа "TEST1.hex" каждые 8 - 10 секунд работы замирает на пару секунд.... Почему так получается, пока мне не понятно...впечатление, что что-то с адресом прерывания "TIM2_OVF".
Оба порта C и D настроены на вывод:
К порту С подключены катоды индикаторов, а к порту D - аноды сегментов индикатора (на кнопки не смотрите, к этой проге не относятся):
"Wait_For_Switch_ASSR" - это цикл "Ждать_Переключения_Регистра_ASSR":
Пока результат ANDI не будет равен нулю, цикл "Wait_For_Switch_ASSR" будет выполняться.
Испытал в ISIS файлы "TEST1.hex" и "TEST2.hex". Первый работает, второй - нет. Получается, что Atmel Studio v.6.1 у меня работает. Кстати, обратил внимание, что программа "TEST1.hex" каждые 8 - 10 секунд работы замирает на пару секунд.... Почему так получается, пока мне не понятно...впечатление, что что-то с адресом прерывания "TIM2_OVF".
Цель этой проги - оттестировать прерывание "TIM2_OVF", когда Timer/Counter2 работает в асинхронном режиме. Сегменты, которые загораются на индикаторе, должны моргать раз в 1 сек.akl писал(а):Правда, не понятно что Вы хотите увидеть от этой проги. Вроде, в прерывании идет вывод на порт D, но оный на вывод не настроен. Или настроенный на вывод порт B это ошибка?
Оба порта C и D настроены на вывод:
Код: Выделить всё
;Настройка порта C и D на вывод.
ldi Temp,0b11111111
out ddrc,Temp
out ddrb,Temp
SREG_Z - это флаг Z в статусном регистре SREG. Из файла "m8def.inc":akl писал(а):Также в ступор меня ввела командаКод: brbc SREG_Z, Wait_For_Switch_ASSR ;BRBC - Branch if Bit in SREG is Cleared и, хотя, студия даже не пискнула я её не понимаю.
Спойлер
; SREG - Status Register
.equ SREG_C = 0 ; Carry Flag
.equ SREG_Z = 1 ; Zero Flag
.equ SREG_N = 2 ; Negative Flag
.equ SREG_V = 3 ; Two's Complement Overflow Flag
.equ SREG_S = 4 ; Sign Bit
.equ SREG_H = 5 ; Half Carry Flag
.equ SREG_T = 6 ; Bit Copy Storage
.equ SREG_I = 7 ; Global Interrupt Enable
Спойлер
Код: Выделить всё
;4. To switch to asynchronous operation:
;Wait for TCN2UB, OCR2UB, and TCR2UB - биты 2, 1, 0 в ASSR
;В ASSR д.б. значение 0b00001000, проверяем его.
Wait_For_Switch_ASSR:
in Temp, ASSR
andi Temp, (0<<AS2)|(1<<TCN2UB)|(1<<OCR2UB)|(1<<TCR2UB)
brbc SREG_Z, Wait_For_Switch_ASSR ;BRBC - Branch if Bit in SREG is Cleared
;<END Wait_For_Switch_ASSR>
Re: Таймеры/счётчики в AVR
Black_Wolf Извините, но мне не ведома прога ISIS, с помощью которой Вы проверяете коды, сгенерированные студией.Black_Wolf писал(а):Испытал в ISIS файлы...
Покажите, где порт D настраивается на выводBlack_Wolf писал(а):Оба порта C и D настроены на вывод:
Код:
;Настройка порта C и D на вывод.
ldi Temp,0b11111111
out ddrc,Temp
out ddrb,Temp
К порту С подключены катоды индикаторов, а к порту D - аноды сегментов индикатора
Понятно.Black_Wolf писал(а):SREG_Z - это флаг Z в статусном регистре SREG. Из файла "m8def.inc"
- Реклама
-
Black_Wolf
- Родился
- Сообщения: 19
- Зарегистрирован: Вс окт 27, 2013 14:07:37
Re: Таймеры/счётчики в AVR
Ух, промахнулся я с одной буквой, правильно так "out ddrd,Temp".akl писал(а):Покажите, где порт D настраивается на вывод
Да, опечатка.akl писал(а):Правда, не понятно что Вы хотите увидеть от этой проги. Вроде, в прерывании идет вывод на порт D, но оный на вывод не настроен. Или настроенный на вывод порт B это ошибка?
Из-за опечатки теперь понял, почему "как бы рабочая" программа не работала на реальном железе (думал порты у МК сгорели), но совсем не понятно, почему "как бы рабочая" программа работала в ISIS...
Дополнено:
Переписал я прогу. Из обработчика прерывания TIM2_OVF убрал весь функциональный код (перенёс его в основное тело программы), оставил только переменную-флаг. Всё заработало как надо. Для себя пока сделал вывод, что в обработчике прерывания не следует применять инструкции ветвления RJMP. Конечная версия кода (проверено в ISIS и на ATmega8):
Спойлер
Код: Выделить всё
.def Seconds=R16
.def Temp=R18
.CSEG
.ORG 0
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_COMPB ; Timer1 CompareB Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
rjmp USART_UDRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
rjmp ADC_IRQ ; ADC Conversion Complete Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWSI ; Two-wire Serial Interface Handler
rjmp SPM_RDY ; Store Program Memory Ready Handler
EXT_INT0: ret ; IRQ0 Handler
EXT_INT1: ret ; IRQ1 Handler
TIM2_COMP: ret ; Timer2 Compare Handler
;TIM2_OVF: ret ; Timer2 Overflow Handler
TIM1_CAPT: ret ; Timer1 Capture Handler
TIM1_COMPA: ret ; Timer1 CompareA Handler
TIM1_COMPB: ret ; Timer1 CompareB Handler
TIM1_OVF: ret ; Timer1 Overflow Handler
TIM0_OVF: ret ; Timer0 Overflow Handler
SPI_STC: ret ; SPI Transfer Complete Handler
USART_RXC: ret ; USART RX Complete Handler
USART_UDRE: ret ; UDR Empty Handler
USART_TXC: ret ; USART TX Complete Handler
ADC_IRQ: ret ; ADC Conversion Complete Handler
EE_RDY: ret ; EEPROM Ready Handler
ANA_COMP: ret ; Analog Comparator Handler
TWSI: ret ; Two-wire Serial Interface Handler
SPM_RDY: ret ; Store Program Memory Ready Handler
TIM2_OVF:
;Timer2 Overflow Handler
push Temp
in Temp, SREG
push Temp
inc Seconds
pop Temp
out SREG, Temp
pop Temp
reti
RESET:
cli ; Clear the interrupt bit in the status register, disable interrupt execution
;Инициализация стека
ldi r16,high(RAMEND); Main program start. RAMEND is the highest 16-bit address in SRAM
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
;НАСТРОЙКА TIMER/COUNTER2 В АСИНХРОННЫЙ РЕЖИМ
;1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2.
;Запрепить прерывания, сбросив биты OCIE2 and TOIE2 в регистре TIMSK, биты 7 и 6
clr Temp
cbr Temp, (1<<OCIE2)|(1<<TOIE2)
out TIMSK, Temp
;2. Select clock source by setting AS2 as appropriate
;Установить бит AS2 = 1 в регистре ASSR, бит 3
clr Temp
sbr Temp, (1<<AS2)
out ASSR, Temp
;3. Write new values to TCNT2, OCR2, and TCCR2.
;Записать новые значения в TCNT2 (хранит значение),
;OCR2 (вых. рег-р сравнения), and TCCR2 (рег-р управл-я, вкл. предделителями)
clr Temp
out TCNT2, Temp
out OCR2, Temp ;В программе не используется
;Устанавливаем предделитель = 128
;32,768 кГц / 128 / 256 => переполнение раз в 1 сек.
clr Temp
sbr Temp, (1<<CS22)|(0<<CS21)|(1<<CS20)
out TCCR2, Temp
;4. To switch to asynchronous operation:
;Wait for TCN2UB, OCR2UB, and TCR2UB - биты 2, 1, 0 в ASSR
;В ASSR д.б. значение 0b00001000, проверяем его.
Wait_For_Switch_ASSR:
in Temp, ASSR
andi Temp, (0<<AS2)|(1<<TCN2UB)|(1<<OCR2UB)|(1<<TCR2UB)
brbc SREG_Z, Wait_For_Switch_ASSR ;BRBC - Branch if Bit in SREG is Cleared
;<END Wait_For_Switch_ASSR>
;5. Clear the Timer/Counter2 Interrupt Flags.
;Сбросить флаги прерываний OCF2 и TOV2 (биты 7 и 6 в TIFR), записав в них "1", т.к.:
;Alternatively, OCF2 is cleared by writing a logic one to the flag
;Alternatively, TOV2 is cleared by writing a logic one to the flag.
clr Temp
sbr Temp, (1<<OCF2)|(1<<TOV2)
out TIFR, Temp
;6. Enable interrupts, if needed.
;Разрешаем прерывания по переполнению в Timer/Counter2
;Записать TOIE2 = 1 (бит 6 в TIMSK)
clr Temp
sbr Temp, (1<<TOIE2)
out TIMSK, Temp
;<END НАСТРОЙКА TIMER/COUNTER2 В АСИНХРОННЫЙ РЕЖИМ>
;Вспомогательные переменные
ldi Seconds, 0
;Настройка порта C и D на вывод
ldi Temp,0b11111111
out ddrc,Temp
out ddrd,Temp
clr Temp
out PortC, Temp
;Включить один сегмент на индикаторе
Ldi Temp, 0b00000001
out PortD, Temp
sei ; Enable interrupts
;<END RESET>
Main:
ldi Temp, 0b11100000
sbrc Seconds, 0 ;SBRC - Skip if Bit in Register is Cleared
ldi Temp, 0b00011110
ori Temp, 0b00000001
out PortD, Temp
rjmp Main
ISIS - это симулятор в Proteus-е. Посмотрел свойства ярлычка: "...\Proteus 7.7 SP2\BIN\ISIS.EXE"akl писал(а): Black_Wolf Извините, но мне не ведома прога ISIS, с помощью которой Вы проверяете коды, сгенерированные студией.
Re: Таймеры/счётчики в AVR
Ничего для этого не надо делать. Разве что снять предделитель /128 на время отладки. Желательно также назначить тактовую (3.276800МГц), чтобы увидеть правильность формирования интервала.Black_Wolf писал(а): При прогоне программы регистр TCNT2 не меняет своего значения (ниже прикрепил скрин). Как в Atmel Studio запускать прерывания в режиме отладки?
-
Black_Wolf
- Родился
- Сообщения: 19
- Зарегистрирован: Вс окт 27, 2013 14:07:37
Re: Таймеры/счётчики в AVR
akl, спасибо! Понятно.
Дополнено:
Значение TCNT2 меняется, но прога в обработчик прерывания не прыгает...
М.б. ещё какие-либо настройки в Atmel Studio нужно поменять?
Дополнено:
Значение TCNT2 меняется, но прога в обработчик прерывания не прыгает...
М.б. ещё какие-либо настройки в Atmel Studio нужно поменять?
- Xatrix
- Сверлит текстолит когтями
- Сообщения: 1296
- Зарегистрирован: Ср мар 10, 2010 22:28:34
- Откуда: Запад Беларуси
Re: Таймеры/счётчики в AVR
Можно ли, используя возможности tiny45(85), управлять цветом RGB светодиода? Подключить его к 3 разным выводам микросхемы и управлять цветом.
Или нужно искать контроллер с тремя ШИМ?
Или нужно искать контроллер с тремя ШИМ?
Re: Таймеры/счётчики в AVR
Подскажите как мне собрать два регистра данных 16-разрядного счетчика в единую переменную на Си? Есть 2 восьмиразрядных регистра TCNT1L и TCNT1H. Мне их нужно слить в одну 16-разр. переменную unsigned int. Как это правильно сделать?
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: Таймеры/счётчики в AVR
Очень просто:
uint16_t a = 12345;
TCNT1 = a;
a = TCNT1;
uint16_t a = 12345;
TCNT1 = a;
a = TCNT1;
Все будет только лучше, в крайнем случае - хуже.
Re: Таймеры/счётчики в AVR
Т.е. можно просто отбросить буквы L и H в названии регистров и оперировать сразу одним 16-разрядным TCNT1?coredumped писал(а):Очень просто:
uint16_t a = 12345;
TCNT1 = a;
a = TCNT1;
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: Таймеры/счётчики в AVR
Да*BoyKot* писал(а): Т.е. можно просто отбросить буквы L и H в названии регистров и оперировать сразу одним 16-разрядным TCNT1?
Все будет только лучше, в крайнем случае - хуже.
Re: Таймеры/счётчики в AVR
Понятно. Еще от ассемблера не отвык.coredumped писал(а):Да*BoyKot* писал(а): Т.е. можно просто отбросить буквы L и H в названии регистров и оперировать сразу одним 16-разрядным TCNT1?
- tager_
- Первый раз сказал Мяу!
- Сообщения: 30
- Зарегистрирован: Пн авг 31, 2009 21:53:48
- Контактная информация:
Re: Таймеры/счётчики в AVR
Пробую повторить код программы по этому уроку на atmel studio 6.1. Микроконтроллер atmega16 [youtube]http://www.youtube.com/watch?v=fxfvNA_guF4[/youtube]
В симуляторе флаги устанавливаются, а вектор не уходит. Подскажите в чем проблема может быть? Вроде код правильно скопировал, проверял несколько раз.
В симуляторе флаги устанавливаются, а вектор не уходит. Подскажите в чем проблема может быть? Вроде код правильно скопировал, проверял несколько раз.
Спойлер
Код: Выделить всё
#define F_CPU 16384000UL
#include <avr/io.h>
#include <avr/interrupt.h>
//***************//
ISR (TIMER0_COMP_vect) // обработчик прерывания таймера Т0
{
asm("nop");
}
ISR (TIMER0_OVF_vect) // Обработчик прерывания таймера по переполнению
{
asm("nop");
}
int main(void)
{
TCCR0 |=(1<<0); // выбираем коэффициэнт деления
TCCR0 &=~(1<<WGM00); // выбираем режим работы таймера
TCCR0 &=~(1<<WGM01); // выбираем режим работы таймера
TIMSK |=(1<<0); // задаём вектор прерывания при переполнении
//OCR0 = 50;
asm("sei"); // разрешаем глобальные прерывания
while(1)
{
asm("nop");
}
}- c2n
- Сверлит текстолит когтями
- Сообщения: 1193
- Зарегистрирован: Ср июл 25, 2012 21:40:09
- Откуда: Самара
- Контактная информация:
Re: Таймеры/счётчики в AVR
Вопрос.
Не могу докумекать до следующей штуки:
Тини13
регистр TCNT0. По описанию, он должен считать от 0 до 255.
Инкрементируя свое значение при каждом тике процессора...и вызывая прерывание по переполнению при переходе от 0xFF -> 0x00
я хочу его использовать в
вместо переменной counter
Но как завести таймер?
что бы он только тупо считал.
кажется что это не те настройки регистров...
Что хочу сделать:
я считаю, что данный код будет делать следующее:
на порту Б у меня при каждом тике будет выводиться значение по нарастающей, по кругу 0-255.
Только как правильно настроить таймер? подскажите пожалуйста
Не могу докумекать до следующей штуки:
Тини13
регистр TCNT0. По описанию, он должен считать от 0 до 255.
Инкрементируя свое значение при каждом тике процессора...и вызывая прерывание по переполнению при переходе от 0xFF -> 0x00
я хочу его использовать в
Код: Выделить всё
main ()
{
...
unsigned char counter=0;
while()
{
[b]counter++[/b]
}
...
}Но как завести таймер?
что бы он только тупо считал.
Код: Выделить всё
TIMSK0 = TIMSK0|(1<<TOIE0); //разрешение таймера как счетчика?
TCCR0A = TCCR0A|(1<<WGM00)|(0<<WGM01); //управление модулем таймера/счетчика? режим PWM Phase correctЧто хочу сделать:
Код: Выделить всё
int ShowInPortB(unsigned Char AnyWarible)
{
PORTB=AnyVarible;
}
int main()
{
...
while(1)
{
ShowInPortB(TCNT0);
}
...
}на порту Б у меня при каждом тике будет выводиться значение по нарастающей, по кругу 0-255.
Только как правильно настроить таймер? подскажите пожалуйста
Re: Таймеры/счётчики в AVR
Используйте TCCR0B=(1<<CS00)
- c2n
- Сверлит текстолит когтями
- Сообщения: 1193
- Зарегистрирован: Ср июл 25, 2012 21:40:09
- Откуда: Самара
- Контактная информация:
Re: Таймеры/счётчики в AVR
Код: Выделить всё
TIMSK0 = TIMSK0|(1<<TOIE0); //разрешение таймера как счетчика?
TCCR0A = TCCR0A|(1<<WGM00)|(0<<WGM01); //управление модулем таймера/счетчика? режим PWM Phase correct- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Таймеры/счётчики в AVR
TIMSK0 и TCCR0A настраивать не надо, просто запускается счетчик TCNT0 в регистре TCCR0B и все.
Однако, если его запустить с прескалером 1:1, тогда вы не увидите плавного нарастания счета, т.к. счетчик будет увеличиваться с каждым машинным тактом, а цикл программы проходит не за один такт.
Однако, если его запустить с прескалером 1:1, тогда вы не увидите плавного нарастания счета, т.к. счетчик будет увеличиваться с каждым машинным тактом, а цикл программы проходит не за один такт.




