Например TDA7294

Форум РадиоКот • Просмотр темы - Таймеры/счётчики в AVR
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср июл 30, 2025 23:34:32

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 1382 ]    , , , 4, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вт окт 29, 2013 08:54:53 
Друг Кота
Аватар пользователя

Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21
Сообщений: 19745
Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Black_Wolf писал(а):
На мой взгляд разницы быть не должно.

А метка Ресет-то где?

_________________
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Измерить нннада?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вт окт 29, 2013 21:14:26 
Родился

Зарегистрирован: Вс окт 27, 2013 14:07:37
Сообщений: 19
Рейтинг сообщения: 0
Gudd-Head,
Думаю, Вы прочитали мои последние посты - это обрывки кода, относящиеся только к прерыванию 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

Единственно, нужны два hex-файла:
1. Как в коде выше,
2. В прерывании TIM2_OVF есть закомментированные три строки "nop". Раскомментируйте их и скомпилируйте 2-й hex-файл.
Поможете?

Также прикрепил проект (для компилирования):
Вложение:
ATMega8_Test_Asynchronous.rar [109.16 KiB]
Скачиваний: 342


Кстати, поставил AtmelStudio 6.1, но проблемы с обработчиком прерывания TIM2_OVF теже: если в вышеуказанном коде раскомментировать три строки "nop" (сразу за меткой TIM2_OVF:), то обработчик TIM2_OVF уже не работает в ISIS. :-/


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср окт 30, 2013 01:44:22 
Друг Кота

Карма: 64
Рейтинг сообщений: 1013
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4332
Откуда: Ижевск
Рейтинг сообщения: 0
Как-то так
Вложение:
TEST1_2.rar

Правда, не понятно что Вы хотите увидеть от этой проги. Вроде, в прерывании идет вывод на порт D, но оный на вывод не настроен. Или настроенный на вывод порт B это ошибка?
Также в ступор меня ввела команда
Код:
            brbc SREG_Z, Wait_For_Switch_ASSR  ;BRBC - Branch if Bit in SREG is Cleared

и, хотя, студия даже не пискнула я её не понимаю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт окт 31, 2013 06:16:24 
Родился

Зарегистрирован: Вс окт 27, 2013 14:07:37
Сообщений: 19
Рейтинг сообщения: 0
akl,
Испытал в ISIS файлы "TEST1.hex" и "TEST2.hex". Первый работает, второй - нет. Получается, что Atmel Studio v.6.1 у меня работает. Кстати, обратил внимание, что программа "TEST1.hex" каждые 8 - 10 секунд работы замирает на пару секунд.... Почему так получается, пока мне не понятно...впечатление, что что-то с адресом прерывания "TIM2_OVF".

akl писал(а):
Правда, не понятно что Вы хотите увидеть от этой проги. Вроде, в прерывании идет вывод на порт D, но оный на вывод не настроен. Или настроенный на вывод порт B это ошибка?

Цель этой проги - оттестировать прерывание "TIM2_OVF", когда Timer/Counter2 работает в асинхронном режиме. Сегменты, которые загораются на индикаторе, должны моргать раз в 1 сек.

Оба порта C и D настроены на вывод:
Код:
;Настройка порта C и D на вывод.
      ldi Temp,0b11111111
      out ddrc,Temp
      out ddrb,Temp

К порту С подключены катоды индикаторов, а к порту D - аноды сегментов индикатора (на кнопки не смотрите, к этой проге не относятся):
Вложение:
ATMega8_Test_Asynchronous.png [113.93 KiB]
Скачиваний: 709


akl писал(а):
Также в ступор меня ввела командаКод:            brbc SREG_Z, Wait_For_Switch_ASSR  ;BRBC - Branch if Bit in SREG is Cleared и, хотя, студия даже не пискнула я её не понимаю.

SREG_Z - это флаг Z в статусном регистре SREG. Из файла "m8def.inc":
Спойлер
Цитата:
; 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

"Wait_For_Switch_ASSR" - это цикл "Ждать_Переключения_Регистра_ASSR":
Спойлер
Код:
;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>

Пока результат ANDI не будет равен нулю, цикл "Wait_For_Switch_ASSR" будет выполняться.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт окт 31, 2013 07:41:30 
Друг Кота

Карма: 64
Рейтинг сообщений: 1013
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4332
Откуда: Ижевск
Рейтинг сообщения: 0
Black_Wolf писал(а):
Испытал в ISIS файлы...

Black_Wolf Извините, но мне не ведома прога ISIS, с помощью которой Вы проверяете коды, сгенерированные студией.
Black_Wolf писал(а):
Оба порта C и D настроены на вывод:
Код:
;Настройка порта C и D на вывод.
ldi Temp,0b11111111
out ddrc,Temp
out ddrb,Temp

К порту С подключены катоды индикаторов, а к порту D - аноды сегментов индикатора
Покажите, где порт D настраивается на вывод
Black_Wolf писал(а):
SREG_Z - это флаг Z в статусном регистре SREG. Из файла "m8def.inc"
Понятно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт окт 31, 2013 11:45:00 
Родился

Зарегистрирован: Вс окт 27, 2013 14:07:37
Сообщений: 19
Рейтинг сообщения: 0
akl писал(а):
Покажите, где порт D настраивается на вывод

Ух, промахнулся я с одной буквой, правильно так "out ddrd,Temp".

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

Также есть вопрос. При прогоне программы регистр TCNT2 не меняет своего значения (ниже прикрепил скрин). Как в Atmel Studio запускать прерывания в режиме отладки? Сначала я попробовал установить бит TOV2 во флаговом регистре прерываний TIFR, но безрезультатно - в прерывание не прыгнул. Появилась ещё мысль - программно увеличивать содержимое TCNT2 и при его переполнении прога должна прыгнуть в обработчик TIM2_OVF. Что скажете?
Вложение:
ATMega8_Test_Asynchronous_TCNT2.png [142.12 KiB]
Скачиваний: 524


Дополнено 2:
akl писал(а):
Black_Wolf Извините, но мне не ведома прога ISIS, с помощью которой Вы проверяете коды, сгенерированные студией.

ISIS - это симулятор в Proteus-е. Посмотрел свойства ярлычка: "...\Proteus 7.7 SP2\BIN\ISIS.EXE"


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пт ноя 01, 2013 10:22:11 
Друг Кота

Карма: 64
Рейтинг сообщений: 1013
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4332
Откуда: Ижевск
Рейтинг сообщения: 0
Black_Wolf писал(а):
При прогоне программы регистр TCNT2 не меняет своего значения (ниже прикрепил скрин). Как в Atmel Studio запускать прерывания в режиме отладки?
Ничего для этого не надо делать. Разве что снять предделитель /128 на время отладки. Желательно также назначить тактовую (3.276800МГц), чтобы увидеть правильность формирования интервала.
СпойлерИзображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пт ноя 01, 2013 22:16:14 
Родился

Зарегистрирован: Вс окт 27, 2013 14:07:37
Сообщений: 19
Рейтинг сообщения: 0
akl, спасибо! Понятно.

Дополнено:
Значение TCNT2 меняется, но прога в обработчик прерывания не прыгает...
М.б. ещё какие-либо настройки в Atmel Studio нужно поменять?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс ноя 24, 2013 13:16:05 
Сверлит текстолит когтями
Аватар пользователя

Карма: 9
Рейтинг сообщений: 19
Зарегистрирован: Ср мар 10, 2010 22:28:34
Сообщений: 1287
Откуда: Запад Беларуси
Рейтинг сообщения: 0
Можно ли, используя возможности tiny45(85), управлять цветом RGB светодиода? Подключить его к 3 разным выводам микросхемы и управлять цветом.
Или нужно искать контроллер с тремя ШИМ?

_________________
Изображение
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс ноя 24, 2013 14:07:05 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 0
Можно. Для этого используют программную реализацию ШИМ.

_________________
Ставим плюсы: )


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср дек 11, 2013 12:46:30 
Открыл глаза
Аватар пользователя

Зарегистрирован: Чт сен 05, 2013 11:01:55
Сообщений: 52
Откуда: MoscowCity
Рейтинг сообщения: 0
Подскажите как мне собрать два регистра данных 16-разрядного счетчика в единую переменную на Си? Есть 2 восьмиразрядных регистра TCNT1L и TCNT1H. Мне их нужно слить в одну 16-разр. переменную unsigned int. Как это правильно сделать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср дек 11, 2013 13:09:14 
Опытный кот
Аватар пользователя

Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19
Сообщений: 838
Откуда: с Земли
Рейтинг сообщения: 0
Очень просто:
uint16_t a = 12345;
TCNT1 = a;
a = TCNT1;

_________________
Все будет только лучше, в крайнем случае - хуже.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср дек 11, 2013 13:19:05 
Открыл глаза
Аватар пользователя

Зарегистрирован: Чт сен 05, 2013 11:01:55
Сообщений: 52
Откуда: MoscowCity
Рейтинг сообщения: 0
coredumped писал(а):
Очень просто:
uint16_t a = 12345;
TCNT1 = a;
a = TCNT1;


Т.е. можно просто отбросить буквы L и H в названии регистров и оперировать сразу одним 16-разрядным TCNT1?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср дек 11, 2013 14:41:54 
Опытный кот
Аватар пользователя

Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19
Сообщений: 838
Откуда: с Земли
Рейтинг сообщения: 0
*BoyKot* писал(а):
Т.е. можно просто отбросить буквы L и H в названии регистров и оперировать сразу одним 16-разрядным TCNT1?

Да :)

_________________
Все будет только лучше, в крайнем случае - хуже.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср дек 11, 2013 15:27:52 
Открыл глаза
Аватар пользователя

Зарегистрирован: Чт сен 05, 2013 11:01:55
Сообщений: 52
Откуда: MoscowCity
Рейтинг сообщения: 0
coredumped писал(а):
*BoyKot* писал(а):
Т.е. можно просто отбросить буквы L и H в названии регистров и оперировать сразу одним 16-разрядным TCNT1?

Да :)

Понятно. Еще от ассемблера не отвык.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пт янв 03, 2014 22:58:48 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн авг 31, 2009 21:53:48
Сообщений: 30
Рейтинг сообщения: 0
Пробую повторить код программы по этому уроку на 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");
   }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Сб янв 04, 2014 12:11:15 
Сверлит текстолит когтями
Аватар пользователя

Карма: 10
Рейтинг сообщений: 111
Зарегистрирован: Ср июл 25, 2012 21:40:09
Сообщений: 1193
Откуда: Самара
Рейтинг сообщения: 0
Вопрос.
Не могу докумекать до следующей штуки:

Тини13

регистр TCNT0. По описанию, он должен считать от 0 до 255.
Инкрементируя свое значение при каждом тике процессора...и вызывая прерывание по переполнению при переходе от 0xFF -> 0x00

я хочу его использовать в
Код:
main ()
{
...
unsigned char counter=0;
while()
{

[b]counter++[/b]
}
...
}


вместо переменной counter

Но как завести таймер?
что бы он только тупо считал.

Код:
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
СообщениеДобавлено: Сб янв 04, 2014 12:16:09 
Друг Кота

Карма: 64
Рейтинг сообщений: 1013
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4332
Откуда: Ижевск
Рейтинг сообщения: 0
Используйте TCCR0B=(1<<CS00)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Сб янв 04, 2014 12:19:46 
Сверлит текстолит когтями
Аватар пользователя

Карма: 10
Рейтинг сообщений: 111
Зарегистрирован: Ср июл 25, 2012 21:40:09
Сообщений: 1193
Откуда: Самара
Рейтинг сообщения: 0
Код:
TIMSK0 = TIMSK0|(1<<TOIE0); //разрешение таймера как счетчика?
TCCR0A = TCCR0A|(1<<WGM00)|(0<<WGM01); //управление модулем таймера/счетчика? режим PWM Phase correct

а при этом эти настройки нужны?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Сб янв 04, 2014 15:58:16 
Вымогатель припоя
Аватар пользователя

Карма: 5
Рейтинг сообщений: 74
Зарегистрирован: Пн июн 18, 2012 12:01:04
Сообщений: 650
Откуда: Челябинская область, Копейск
Рейтинг сообщения: 0
TIMSK0 и TCCR0A настраивать не надо, просто запускается счетчик TCNT0 в регистре TCCR0B и все.
Однако, если его запустить с прескалером 1:1, тогда вы не увидите плавного нарастания счета, т.к. счетчик будет увеличиваться с каждым машинным тактом, а цикл программы проходит не за один такт.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 1382 ]    , , , 4, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y