|
Atxmega Внешний кварц |
|
|
|
May 28 2011, 07:55
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884

|
Добрый день! Начал изучать Atxmega192A. Программирую в AVR Studio 4.18. Как я понял, необходимо в программе сначала определить какой будет использоваться кварц (у меня внешний). Для этого написал следующую функцию: Код void CLK_init() { CCP=0xD8; CLK.CTRL=3; CCP=0xD8; OSC.XOSCCTRL=0x40; CCP=0xD8; OSC.CTRL=(1<<3); } Оптимизация кода включена O1. При отладке кода в AVR Studio вижу, что в ССP регистр записывается 1 вместо D8. СLK.CTRL вообще не обновляется. А при записи регистра OSC.CTRL в нем остается изначально установленный нулевой байт, разрешающий работу внутреного кварца. Подскажите, пожалуйста, что я делаю не так.
Сообщение отредактировал KIG - May 28 2011, 08:15
|
|
|
|
|
May 28 2011, 12:26
|

Профессионал
    
Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955

|
Сначала надо разрешить кварцевый генератор, потом подождать, пока он устаканится, потом выбрать его в качестве источника тактирования. В ССP никогда не увидите записанной сигнатуры - большинство битов там только на запись, читайте описание. Вот мой ассемблерный код, но я не жду, т.к. у меня внешний генератор, запускающийся раньше проца. Код LDI r16,OSC_XOSCEN_bm|OSC_RC2MEN_bm//|OSC_RC32MEN_bm STS OSC_CTRL,r16 LDI r16,CLK_SCLKSEL0_bm|CLK_SCLKSEL1_bm LDI r17,CCP_IOREG_gc OUT CPU_CCP,r17 ;загрузили Protect IO Register signature STS CLK_CTRL,r16 ;внешнее тактирование
|
|
|
|
|
Jun 22 2011, 16:29
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 19-07-06
Пользователь №: 18 920

|
ATxmega32A4 с отключенной перефирией, внутренний генератор, питание 3.3V:
2mHz - 3mA 32mHz - 19mA
|
|
|
|
|
Jun 24 2011, 19:56
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 18-11-08
Пользователь №: 41 732

|
вот так я запускал кварц 7.372800 Код #include <avr/io.h> void CCPWrite( volatile uint8_t * address, uint8_t value ) { volatile uint8_t * tmpAddr = address; asm volatile( "movw r30, %0" "\n\t" "ldi r16, %2" "\n\t" "out %3, r16" "\n\t" "st Z, %1" "\n\t" : : "r" (tmpAddr), "r" (value), "M" (CCP_IOREG_gc), "i" (&CCP) : "r16", "r30", "r31" ); }
int main(void) { OSC.XOSCCTRL=0x4b; OSC.CTRL = 0x08; while (!(OSC.STATUS &OSC_XOSCRDY_bm)); CCPWrite(&CLK.CTRL,0x03); OSC.CTRL = 0x08; return 0; }
|
|
|
|
|
Jun 25 2011, 11:38
|
Участник

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272

|
Кварц 4МГц + умножитель на 8 : (у меня работает без вопросов)
OSC.XOSCCTRL=0x4b; // диапазон: 2-9 МГц, внешний резонатор, с временем запуска 16 000 циклов OSC.CTRL=0x08; // включаем генератор на внешнем кварцевом резонаторе while(!(OSC.STATUS&0x08)); // ждём готовности генератора на внешнем кварцевом резонаторе
OSC.PLLCTRL=0xc8; // внешний источник синхро, множитель=8 OSC.CTRL=0x18; // включаем синтезатор частоты while(!(OSC.STATUS&0x10)); // ждём готовности синтезатора частоты
CPU_CCP=0xd8; // разрешить (сигнатурой) изменение важного регистра (следущая строка) CLK.CTRL=0x04; // источник системной синхронизации - синтезатор частоты CLK.PSCTRL=0x00; // Коэф. деления предделителей A, B и C = 1.
|
|
|
|
|
Jul 1 2011, 05:49
|
Группа: Новичок
Сообщений: 3
Регистрация: 1-07-11
Пользователь №: 66 004

|
Цитата(Юрий_СВ @ Jun 25 2011, 15:38)  . Вообще в Хmega по сравнению с Atmega выбор источника тактирования задается не фьюзами, что с одной стороны удобно что случайно не запоришь процессор, а с другой стороны увеличивает время запуска процессора на примерно 6мс, что не всегда желательно. Нормальная статья по выбору внешнего источника тактирования на Xmega
Сообщение отредактировал IgorKossak - Jul 3 2011, 17:45
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Jul 1 2011, 10:45
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата(V_G @ Jul 1 2011, 13:35)  Там нет внутреннего кварца. А источники тактирования можно оперативно переключать. С внутренних на внешние и обратно а internal(RC) это разве не внутренний? от 32Кгц до 32Мгц. У меня atxmega128a3
|
|
|
|
|
Jul 3 2011, 08:11
|
Группа: Новичок
Сообщений: 3
Регистрация: 1-07-11
Пользователь №: 66 004

|
Цитата(Pavel_Bor @ Jul 1 2011, 14:45)  а internal(RC) это разве не внутренний? от 32Кгц до 32Мгц. У меня atxmega128a3 internal(RC) - внутренний RC-генератор, достаточно удобная вещь однако ей нехватает точности кварца и может плавать с нагревом процессора хоть и не существенно, но для точный вычислений не всегда подходит
|
|
|
|
|
Aug 1 2011, 17:39
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 31-07-06
Из: Мытищи
Пользователь №: 19 220

|
Не проходит у меня снятие защиты в CCP: Код CCP = 0xD8; CLK.CTRL = 0x04; в IOView видно что CLK.CTRL весь в нулях. Скопипастил у rubic (спасибо ему ) его пример с замысловатым CCPWrite: Код void CCPWrite( volatile uint8_t * address, uint8_t value ) { volatile uint8_t * tmpAddr = address; asm volatile( "movw r30, %0" "\n\t" "ldi r16, %2" "\n\t" "out %3, r16" "\n\t" "st Z, %1" "\n\t" : : "r" (tmpAddr), "r" (value), "M" (CCP_IOREG_gc), "i" (&CCP) : "r16", "r30", "r31" ); } и сразу же все заработало. Неужели без ассемблерных вставок код не успевает за 4 цикла прописать CLK.CTRL ? Компилячу в AVR Studio 5 его gcc.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|