реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Atxmega Внешний кварц
KIG
сообщение May 28 2011, 07:55
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
V_G
сообщение May 28 2011, 12:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 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            ;внешнее тактирование
Go to the top of the page
 
+Quote Post
asm_lock
сообщение Jun 22 2011, 09:42
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 30-01-09
Из: СПб
Пользователь №: 44 178



Использовал ATxmega128A1....Подцепил внешний кварец на 16Мгц. Процедурка вышла простенькая и незатейливая, но пришлось пошаманить:

void setclk()
{

OSC.XOSCCTRL=0xCB; // 16MHz, start time 16000 clk
OSC.CTRL= 0x08; // enable external clock
while((OSC.STATUS & 0x08) == 0 ); // ожидание появления в регистре статуса бита включения синхронизации от внешнего генератора
OSC.PLLCTRL = 0xC2; // настройка блока PLL на синхронизацию от внешнего источника и 2-х кратоное умножение
OSC.CTRL = OSC.CTRL | 0x10; // разрешение работы блока PLL
while((OSC.STATUS & 0x10) == 0 ) ; // ожидание появления в регистре статуса бита включения блока PLL
CCP=0xD8; // load protect IO
CLK.CTRL = 0x04; // настройка системной синхронизации от блока PLL
OSC.CTRL = OSC.CTRL & 0xFE; // отключение системной синхронизации от внутреннего RC-генератора частотой 2 МГц

}

Только вот я заметил одну странность. В даташите написано что ток потребления при частоте 32 МГц от внешнего кварца (думаю что внешний кварец был 16МГц, и PLL *2) и Vcc=3.0 B не должен превышать 20мА. У меня при отключенной периферии и начальных настройках Icc= 40мА.
Go to the top of the page
 
+Quote Post
Fusion
сообщение Jun 22 2011, 16:29
Сообщение #4


Участник
*

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



ATxmega32A4 с отключенной перефирией, внутренний генератор, питание 3.3V:

2mHz - 3mA
32mHz - 19mA
Go to the top of the page
 
+Quote Post
asm_lock
сообщение Jun 22 2011, 18:29
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 30-01-09
Из: СПб
Пользователь №: 44 178



у меня тоже периферия отключена. Подключен внешний кварцевый резонатор на 16 МГц. Включен PLL с множителем 2. И все.. Что так может жрать, не знаю. Если разрешаю выход сигнала CLKOUT, то ток потребления становится 50мА....не меньше.

Предполагаю, что в даташите допущена ошибка.....

Сообщение отредактировал asm_lock - Jun 23 2011, 11:42
Go to the top of the page
 
+Quote Post
rubic
сообщение Jun 24 2011, 19:56
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Jun 25 2011, 11:38
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
zumanah
сообщение Jul 1 2011, 05:49
Сообщение #8





Группа: Новичок
Сообщений: 3
Регистрация: 1-07-11
Пользователь №: 66 004



Цитата(Юрий_СВ @ Jun 25 2011, 15:38) *
.


Вообще в Хmega по сравнению с Atmega выбор источника тактирования задается не фьюзами, что с одной стороны удобно что случайно не запоришь процессор, а с другой стороны увеличивает время запуска процессора на примерно 6мс, что не всегда желательно. Нормальная статья по выбору внешнего источника тактирования на Xmega

Сообщение отредактировал IgorKossak - Jul 3 2011, 17:45
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 1 2011, 09:48
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Возможно ли на xmege запустить 2 кварца? например внешний и внутренний?
Go to the top of the page
 
+Quote Post
V_G
сообщение Jul 1 2011, 10:35
Сообщение #10


Профессионал
*****

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



Там нет внутреннего кварца.
А источники тактирования можно оперативно переключать. С внутренних на внешние и обратно
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 1 2011, 10:45
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Цитата(V_G @ Jul 1 2011, 13:35) *
Там нет внутреннего кварца.
А источники тактирования можно оперативно переключать. С внутренних на внешние и обратно


а internal(RC) это разве не внутренний? от 32Кгц до 32Мгц. У меня atxmega128a3
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Jul 1 2011, 11:26
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата
а internal(RC) это разве не внутренний?

Внутренний. Но не "кварц"...
Go to the top of the page
 
+Quote Post
zumanah
сообщение Jul 3 2011, 08:11
Сообщение #13





Группа: Новичок
Сообщений: 3
Регистрация: 1-07-11
Пользователь №: 66 004



Цитата(Pavel_Bor @ Jul 1 2011, 14:45) *
а internal(RC) это разве не внутренний? от 32Кгц до 32Мгц. У меня atxmega128a3

internal(RC) - внутренний RC-генератор, достаточно удобная вещь однако ей нехватает точности кварца и может плавать с нагревом процессора хоть и не существенно, но для точный вычислений не всегда подходит
Go to the top of the page
 
+Quote Post
V_G
сообщение Jul 3 2011, 11:10
Сообщение #14


Профессионал
*****

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



Точность внутренних генераторов в xmege существенно повышена в сравнении с просто мегой (введена термокомпенсация), но все равно до кварцевой не дотягивает.
Go to the top of the page
 
+Quote Post
uzig
сообщение Aug 1 2011, 17:39
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 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.




Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 09:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016