Jump to content
CUBE

Асинхронный режим Timer2 на ATmega8 от кварцевого резонатора 32768Гц RTC

Recommended Posts

Не могу запустить асинхронный режим. 

Ниже будет представлен код которым пытаюсь отладить. Там в 1 коде идёт работа от внутреннего источника таков (стоит 1МГц).  После 5 миганий таймер должен перейти в асинхронный режим и мигать с частотой в 1 Гц. У меня происходит 5 миганий потом ничего. Фьюзы менять пробовал, ничего не дало, сейчас дефолт. Корпус кварца к земле тянуть пробовал - безрезультатно. 

Возможно что-то в подключении накосячил, если не видно на фото ниже, спрашиваете, нужно будет - нарисую схему. 

Компилятор Atmel Studio 7

Шью через Sind Prog 2.1.1 + USBasp 2.0

Вот код: 

.macro outi 
 ldi r16, @1 
 out @0, r16 
.endm 
.org $000 
rjmp reset 
.org $001 
reti 
.org $002 
reti 
.org $003 
reti 
.org $004 
rjmp timer2_ovf 
.org $005 
reti 
.org $006 
reti 
.org $007 
reti 
.org $008 
reti 
.org $009 
reti 
.org $00A 
reti 
.org $00B 
reti 
.org $00C 
reti 
.org $00D 
reti 
.org $00E 
reti 
.org $00F 
reti 
.org $011 
reti 
.org $012 
reti 
.ORG INT_VECTORS_SIZE 
 
reset: 
.equ portout=portd 
.equ ddrout=ddrd 
.def led=r17 
.def mask=r18 
.def counter=r19 
 outi spl,low(ramend) 
 outi sph,high(ramend) 
 
 outi ddrout, 0xff 
 
 outi tccr2, 0b00000111 
 outi timsk, 1«toie2 
 
  
 
  
 ldi led,1«5 
 ldi mask,1«5 
 sei 
cycle: 
cpi counter, 10 
breq offtim 
 rjmp cycle 
 
timer2_ovf: 
inc counter 
 out portout, led 
 eor led, mask 
reti 
  
offtim: 
outi timsk, 0«toie2 
rjmp asinxron 
 
asinxron: 
 outi assr, 0b00001000 
back: 
 in r16, assr 
 cpi r16, 0b00001000 
 brne back 
 
  outi tccr2, 0b00000101 
  outi tcnt2, 0 
  outi ocr2, 0 
  outi timsk, 1«toie2 
 
 
m1: 
rjmp m1

DSC_0073.thumb.JPG.030623a7fd4921c758295f752b815068.JPG

DSC_0072.thumb.JPG.dc17cd2be78d3acd941dc10a24aa4900.JPG

Верх меги на фото слева. 

Edited by CUBE

Share this post


Link to post
Share on other sites

http://easyelectronics.ru/avr-uchebnyj-kurs-asinxronnyj-rezhim-tajmera.html

В этой статье читал что при подключении для асинхронного режима к TOSC1 и 2 они не нужны.

P.s. Завтра на всякий случай куплю и с ними попробую. И кварц другой возьму 

Share this post


Link to post
Share on other sites

Технология Maxim Integrated nanoPower: когда малый IQ имеет преимущества

При разработке устройств с батарейным питанием важно выбирать компоненты не просто с малым потреблением, но и с предельно малым током покоя. При этом следует обратить внимание на линейку nanoPower производства компании Maxim Integrated. В статье рассмотрено их применение на примере системы датчиков беспроводной оконной сигнализации.

Подробнее

13 часа назад, CUBE сказал:

После 5 миганий таймер должен перейти в асинхронный режим и мигать с частотой в 1 Гц

я бы сначала убедился что процессор "видит" эти асинхронные такты на заданной ноге! То есть надо включить порт на input и куда то вывести значение ноги без всяких таймеров и убедится что процессор видит нули и единицы (меандр) на этой ноге.

Когда работа железа проверена таким образом можно смело разбираться с настройками более сложной (чем порт ввода вывода) периферии процессора.

Share this post


Link to post
Share on other sites
                     

Платы Nucleo на базе STM32G0: чего можно добиться с помощью связки Nucleo и Arduino

Платы Nucleo и платы расширения X-NUCLEO от STMicroelectronics можно интегрировать в платформу Arduino с помощью библиотеки STM32duino. Связка плат Nucleo и платформы Arduino, и наличие готовых библиотек – представляет удобный инструмент для создания прототипов и конечных приложений в условиях ограниченного времени. Статья содержит пошаговые инструкции по установке библиотек и запуску примеров для Nucleo.

Подробнее...

7 часов назад, ruhi сказал:

я бы сначала убедился что процессор "видит" эти асинхронные такты на заданной ноге! То есть надо включить порт на input и куда то вывести значение ноги без всяких таймеров и убедится что процессор видит нули и единицы (меандр) на этой ноге.

Так я делаю ещё проще. Не в порт завожу и отслеживаю, а смотрю саму ногу светодиодом. Ножка в асинхронном не тикает, в любом другом за мило дело.

7 часов назад, Геннадий сказал:

При переключении в асинхронный режим линии порта PB6, PB7 отключаются от системы ввода/вывода.

Тааак. Знаю про это. Они мне и не нужны.Вывод на PD5 делаю.

Сегодня выполнил следующие потуги:

  • Попробовал другой резонатор
  • Добавил конденсаторы на 22 pF (хоть они там и не нужны)
  • Пробовал использовать режим по сравнению с ocr2, а не по переполнению
  • Добавил запрет глобальных прерываний, при инициализации асинхронного режима и последующее включение непосредственно перед

Пока результата нет. И с сожалению идей как ещё попробовать тоже

Share this post


Link to post
Share on other sites
4 часа назад, CUBE сказал:

Добавил конденсаторы на 22 pF (хоть они там и не нужны)

а при чем здесь конденсаторы тогда? если входной сигнал на ноге есть надо с настройками таймера разбираться - почему он на этот сигнал не реагирует!

нога то правильно выбрана для таймера - он там вроде только с одной определенной асинхронные такты может принимать? и выдавать тоже на определенную но другую.

Share this post


Link to post
Share on other sites

1. конденсаторы нужны т.к. замечено что не на всех МК запускался генератор

2. Зачем ассемблер, думаете это  круто, нет - это глупость, не щнаете как толком работать с железлм и лезите в программирование с этого входа.

Самая большая проблема, ограничиваете себя в примерах

3. если уж так хотите ASM, напишите код инициализации на СИ и посмотрите как скомпрометируется код ASM

4. RTC генератор можно проверить простым шарканьем по входам пальцем, счетчик при этом должен щелкать, правда если не обладаете высоким статичным зарядом

5. Чтобы проверить саму настройку счетчика достаточно просто переключить источник тактирования

Share this post


Link to post
Share on other sites
...
  outi tccr2, 0b00000101 
  outi tcnt2, 0 
  outi ocr2, 0 
  outi timsk, 1«toie2 
  outi tifr, 0
...

А так? И глобальный запрет прерываний необходим перед изменением assr, с последующим разрешением.

Edited by Berg

Share this post


Link to post
Share on other sites
11 час назад, hasl сказал:

2. Зачем ассемблер, думаете это  круто, нет - это глупость

Это лаба в моем институте.

 

11 час назад, hasl сказал:

3. если уж так хотите ASM, напишите код инициализации на СИ и посмотрите как скомпрометируется код ASM

Это глупость. Кто пишет на си инициализацию делают в asm

 

11 час назад, hasl сказал:

5. Чтобы проверить саму настройку счетчика достаточно просто переключить источник тактирования

Не 1 раз писал, что делал так. Настройка самого таймера работает. Не работает асинхронный режим.

12 часа назад, ruhi сказал:

и выдавать тоже на определенную но другую.

Ничего про этой найти не смог. Можно поподробнее?

Edited by CUBE

Share this post


Link to post
Share on other sites

Вот так у меня работает:

		cli
;====настроим Т2 на асинхронный режим и кварц 32кГц===
		clr	r16            		;
		out	TCCR2,r16      		;
		out	OCR2,r16       		;
		ldi	r16,0b00001000 		;
		out	ASSR,r16       		;
		ldi	r16,0b00001010		;
		out	TCCR2,r16      		;
wait_tccr2:
		in	r16,ASSR        ;
		sbrc	r16,0         	;
		rjmp	wait_tccr2     	;
		ldi	r16,0b01100101 		;
		out	OCR2,r16       		;
wait_ocr2:
		in	r16,ASSR        ;
		sbrc	r16,1         	;
		rjmp	wait_ocr2      	;
		ldi	r16,0b00001010		;
		out	TCCR2,r16      		;
		clr	r16                 ;
		out	TCNT2,r16           ;
wait_tcnt2:
		in	r16,ASSR        ;
		sbrc	r16,2         	;
		rjmp	wait_tcnt2     	;
		sei

Не помню, почему делал отдельно каждый регистр, но работает.

Share this post


Link to post
Share on other sites
1 час назад, CUBE сказал:

Ничего про этой найти не смог. Можно поподробнее?

Извиняюсь, начать надо было с вопроса о типе процессора, это Атмега??? или кто??? Какой номер таймера используете.

На каждую атмегу есть пдф-ка и там есть раздел про таймеры типа такого:

16-bit Timer/Counter
(Timer/Counter1 and
Timer/Counter3)
The 16-bit Timer/Counter unit allows accurate program execution timing (event management),
wave generation, and signal timing measurement. The main features are:
• True 16-bit Design (i.e.,Allows 16-bit PWM)
• Three Independent Output Compare Units
• Double Buffered Output Compare Registers

...

Там все расписано, в принципе в интернете, достаточно просто, можно найти полный русский перевод.

И, совет, вы бы хоть подписали инструкции в вашем коде, что они по вашему делают, а то вообще говоря не понятно что мы обсуждаем, потому что:

 

1 час назад, CUBE сказал:

Настройка самого таймера работает. Не работает асинхронный режим.

режим или настройка не могут работать или НЕ работать, не работает всегда таймер пусть в каком то определенном режиме, с определенными настройками.

Я бы попросил все таки уточнить, что вы имеете ввиду под "асинхронный режим", я боюсь мы исходим из разных определений.

Share this post


Link to post
Share on other sites

@Геннадий Не могу понять как работает ваш код. Точнее почему он работает. Ведь вы ничего не писали в TIMSK то есть нет разрешения прерываний не по переполнению не по совпадению, выбран лишь решим по совпадению (бит WGM21 в TCCR2).

У меня не работает.

 

Edited by CUBE

Share this post


Link to post
Share on other sites
54 минуты назад, ruhi сказал:

это Атмега???

Да. В название темы указано. Пробовал и на 16А.

 

56 минут назад, ruhi сказал:

Какой номер таймера используете.

Timer/Counter2 8-bit async (TC2)

 

58 минут назад, ruhi сказал:

И, совет, вы бы хоть подписали инструкции в вашем коде

Согласен, у асемблера ужасная читаемость. Сделаю

 

59 минут назад, ruhi сказал:

Я бы попросил все таки уточнить, что вы имеете ввиду под "асинхронный режим", я боюсь мы исходим из разных определений.

Асинхронный режим работы таймера. При которой таймер работает от внешнего кварца, а сама программа выполняется он внутреннего источника тактов. Задается в регистре ASSR битом AS2. При его работе PB6 PB7 перестают быть пинами ввода/вывода и на них вешается кварцевый резонатор, разработчиками как раз предполагается что часовой (32768 кГц). Только при инициализации этого режима таймер отказывается тикать.

Share this post


Link to post
Share on other sites
56 минут назад, CUBE сказал:

@Геннадий Не могу понять как работает ваш код. Точнее почему он работает. Ведь вы ничего не писали в TIMSK то есть нет разрешения прерываний не по переполнению не по совпадению, выбран лишь решим по совпадению (бит WGM21 в TCCR2).

Это не весь код, а последовательность инициализации таймера для асинхронного режима. Все остальное - прерывания, предделители и т.д. остается на Ваше усмотрение.

Share this post


Link to post
Share on other sites
4 часа назад, CUBE сказал:

При его работе PB6 PB7 перестают быть пинами ввода/вывода и на них вешается кварцевый резонатор, разработчиками как раз предполагается что часовой (32768 кГц).

Ага, вот этого я не понял. Я думал он от меандра работает на одной ноге. Тогда надо осциллографом смотреть есть ли колебания на кварце.

Потом вот это CS02:0 установлено???

Depending on the mode of operation used, the counter is cleared, incremented, or decremented
at each timer clock (clkT0). clkT0 can be generated from an external or internal
clock source, selected by the clock select bits (CS02:0). When no clock source is
selected (CS02:0 = 0) the timer is stopped.

А то он останется стопед даже если:

4 часа назад, CUBE сказал:

Задается в регистре ASSR битом AS2.

 

Share this post


Link to post
Share on other sites

Решено. Я 2 раза не всмотрелся что дают мне продавцы. (как позже выяснилось на 32 768 просто не было, и давали какой был с такими же циферками). 

Естественно ничего не работало с кварцами на 32 768 000 т.е. 32,768 МГц. 

Поставил на 32768 Гц (32,768кГц)  все заработало с пол пинка. 

P.s. Всем кто пытался помочь спасибо. Жаль что решение оказалось не достойно широкого обозрения. 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
    • By n_angelo
      Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален.
      Используемая периферия: DAC, DMA, TIM4, CLK, GPIO
      Задача у программы такая:
      В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод.
      Проблема:
      Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом.
      Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается.
      Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг.
      Спасибо.
       
       
       
       
    • By Вячеслав_НС
      помогите разобраться с кодом .(послать значение по шине TWI на ЦАП PCF8591) не работает в протеусе ...
      #define F_CPU 8000000UL 
      #include <stdlib.h>
      #include <avr/io.h>
      #include <util/delay.h>
      //*** ИНИЦИАЛИЗАЦИЯ ШИНЫ TWI ***/
      void TWI_Init(void)
      {
          // Установка тактовой частоты F_scl  = 100 кГц
          TWBR =32;
          TWSR &= (~((1<<TWPS1)|(1<<TWPS0)));
          TWCR |= (1 << TWEN);            // Разрешение работы TWI-модуля
      }

      /*** ЗАПУСК TWI ***/
      void TWI_Start(void)
      {
          TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
          while(!(TWCR & (1<<TWINT)));
          TWDR = 1001000; // передача адреса модуля PCF8591 в шину TWI
          TWCR=(1<<TWINT)|(1<<TWEN);
          while(!(TWCR & (1<<TWINT)));
      }
      /*** ОСТАНОВКА TWI ***/
      void TWI_Stop(void)
      {
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
          while(TWCR & (1<<TWSTO));        // Ожидание завершения передачи условия СТОП
      }
      /***ПЕРЕДАЧА ДАННЫХ В TWI***/
      void TWI_WriteByte(uint8_t data)
      {
          TWDR = data;                    // Загрузка данных в TWDR
          TWCR=(1<<TWINT)|(1<<TWEN);
          while(!(TWCR & (1 << TWINT)));    // Ожидание завершения передачи данных
      }
      /*** ПЕРЕДАТЬ ЗНАЧЕНИЕ В PCF8591 ***/
      void PCF8591_get(void)
      {
          TWI_Start();                // Запуск TWI
          TWI_WriteByte(0x40);        //включаем цап
          TWI_WriteByte(100);            // запись в ЦАП значения 100
          TWI_Stop();                    // Остановить TWI
      }            
          int main(void)
      {
          TWI_Init();    
          while (1)
      {
              PCF8591_get;
             _delay_ms(50);
        }
      }
  • Сообщения

    • Тогда из всего вышесказанного на предыдущих двух страницах остаётся только это: Отсюда вывод: Что-то не так с усилителем для наушников или с подключением к нему. Ну не можете вы слышать шумы с уровнем за -90 дБ (как в ваших файлах - примерах). Например, выходное сопротивление темброблока оказалось таким, что у усилителя возрос уровень собственного шума. Что-то где-то как-то так соединилось,  что на вход усилителя попёрли наводки. Особенно если вы говорите не о шумах, а о фоне 50 - 100 Гц.  Или тупо он подвозбуждается при подключении к темброблоку... Измерьте всё-таки коэффициент передачи темброблока при средних положениях регуляторов АЧХ. Посмотрите сигнал на входе усилителя и на его выходе при полностью собранной системе - с линейного выхода компьютера - темброблок - усилитель - наушники.  Сигнал подавать не надо, смотрите шумы, подключая вход звуковой карты к указанным точкам. Прямо так, не разбирая соединения, параллельно. Если конечно выход на наушники к "корпусу" привязан, а не "плавающий".
    • позже скину подробное фото - ес будете повторять - учтите промахи - я слишком близко расположил некоторые детали - пожадничал на плате) позже до собираю-докуплю запчасти -скину с тгр фотки .
    • а что может быть с моими наушниками не так?) да, слушал, конечно. когда музыка играет все прекрасно, "шшшш" не слышно, все регулируется. как только тишина, слушаешь змей. это в наушниках. в колонках тоже слушал, но по-моему не пробовал регулировать тембр или басс.
    • Скорее наоборот, был подключен правильно к исправному проверенному оборудованию, потому и не шумел. А может наоборот, был подключен так, что не был подключен совсем, потому и не шумел.   Опять половина текста между строк провалилась... Вы слушали шумы, или музыку? Вы вообще хоть раз пробовали подключить к звуковой карте и послушать, как звучит? Звук, музыку, запись. На нормальной для вас громкости.
    • Косяки конечно видны (не туда дорожки заведены) но судя по осциллограмме работает. Если напрягает шум, то можно попробовать разные ништяки в виде замедления скорости открытия-закрытия\RC-цепи исток-сток\ёмкости на ноги транзисторов по питанию. Ферритовые бусинки туда же.  
    • так надо же было проверить шум/фон самой платы я слушал через темброблок и на колонках, и в наушниках. но, по-моему, не пробовал крутить регуляторы. а что может быть что темброблок может не работать с колонками, поэтому и не шумел?
    • Музыку слушать вы будете тоже ? Кстати, ещё теперь гложет вопрос, а куда, чем и как "замкнут" вход?
×
×
  • Create New...