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

 
 
 
Reply to this topicStart new topic
> Переезд из CVAVR в Atmel Studio, Xmega, пара нюансов
ffs2001
сообщение May 25 2016, 19:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 3-12-14
Пользователь №: 83 971



Коллеги, может, кто сталкивался,

перевожу проект из CVAVR в Atmel Studio 7.
Код проверенный и 100% рабочий.

В Studio заработало, но с нюансами:

код, нормально выполняющийся в CVAVR:
(читаем уникальный код Атмеги, SP-драйвер родной Атмелевский)
Код
    uint8_t i;
    uint8_t addr[11] ={0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x10,0x12,0x13,0x14,0x15};      
    for (i=0; i<11; i++){
        
        SP_WaitForSPM();        
        int2hexstr(SP_ReadCalibrationByte(addr[i]),guid,i*2);
    }


код, работающий в Studio
Код
    uint8_t i;
    uint8_t addr[11] ={0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x10,0x12,0x13,0x14,0x15};
    
    [b]_delay_ms(2);[/b]      
    for (i=0; i<11; i++){
        
        SP_WaitForSPM();        
        int2hexstr(SP_ReadCalibrationByte(addr[i]),guid,i*2);
        [b]_delay_ms(2);[/b]
    }

Без делея выдаёт фуфло. На что ему делей?


И ещё непонятный момент.
Работа начинается с bootloader'а, в некоторый момент происходит jump 0x00. Иногда в application section пусто (так задумано), и контроллер "по нолям" снова приходит в бутлоадер.

Код
void jump_to_0(){
            
    CCP = CCP_IOREG_gc;
    PMIC.CTRL = 0;

    asm volatile("jmp 0x00");
}

После CVAVR всё происходит без проблем, а после Студии – начинает глючить USART, например.
Правильно ли я понимаю, что в Студии нужно делать что-то вроде pmic_set_vector_location(PMIC_VEC_APPLICATION) перед jump 0x00 и, соответственно, принудительный перевод векторов на бутлодер в начале бутлодера?

Сообщение отредактировал ffs2001 - May 26 2016, 08:30
Go to the top of the page
 
+Quote Post
ffs2001
сообщение May 26 2016, 13:33
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 3-12-14
Пользователь №: 83 971



Первый вопрос решил так:

Код
uint8_t i;
    uint8_t addr[11] ={0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x10,0x12,0x13,0x14,0x15};      
    for (i=0; i<11; i++){
        
        NVM_CMD = NVM_CMD_NO_OPERATION_gc;
        SP_WaitForSPM();
        NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;        
        //int2hexstr(SP_ReadCalibrationByte(addr[i]),guid,i*2);
        int2hexstr(pgm_read_byte(addr[i]),guid,i*2);
        NVM_CMD = NVM_CMD_NO_OPERATION_gc;
    }


т.е. заменил код из Атмелевского SP_driver.s на Студиевский из avr/pgmspace.h . Буду благодарен, если кто-то подскажет, в чём принципиальная разница.

Хм. Второй глюк тоже ушёл.
В CVAVR я использовал не SP_driver.s целиком, а копировал частично код, оформляя в виде функций с ассемблерными вставками. Видимо, где-то накосячил с регистром ожидания.
Нефиговые ошибки, однако, прощает компилятор CVAVR.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:31
Рейтинг@Mail.ru


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