|
|
  |
Меня обижает компилятор в АтмелСтудии, Игры с Х-мегой (Е5) |
|
|
|
Feb 7 2017, 15:03
|
Местный
  
Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943

|
Господа, я простодушно всю жизнь думал, что если отключить оптимизацию в компиляторе, то прога будет работать самым правильным способом, и некие странные глюки могут уйти. А вот сейчас получается наоборот, прога без оптимизации глючит, - работает на неправильной частоте. То есть с хотя бы первым уровнем оптимизации я получаю честные 8 МГц тактовой, а если поставить Оптимизация = None, то работает только на 2 МГц, что бы я не заряжал в регистры OSC и CLK. Вот код, посмотрите пожалуйста, - может быть я что-то не так делаю?: Код //------------------------------------------------------------- #include <avr/io.h> #include <avr/cpufunc.h> #include <avr/wdt.h> #include <inttypes.h> #include <util/atomic.h> #include "pin_macros.h"
#define TP3_ON VPORT1_OUT |= PIN3_bm // #define TP3_OFF VPORT1_OUT &= ~PIN3_bm //
//----------------- THE MAIN -------------------------------------- int main (void) { cli(); // SYSTEM_CLK = 8 MHz: OSC.CTRL = 0x61; // RC8MEN & RC2MEN while(!(OSC.STATUS & OSC_RC8MRDY_bm)); CPU_CCP = CCP_IOREG_gc; // protected by the configuration change protection mechanism CLK.CTRL = 0x05; // 101- RC8MHZ (8MHz internal oscillator) // PORTC: PORTC.DIR = 0x08; // TP3 PORTC.OUT = 0x00; // PORTD: PORTD.DIR = 0x10; // pin4 PORTD.OUT = 0x00; PORTCFG.CLKOUT = 0x82; // Clock output on PORTD pin4 // WDT: CPU_CCP = CCP_IOREG_gc; // protected by the configuration change protection mechanism WDT.CTRL = 0x27; // 4.0s // sei(); // while(1) { TP3_ON; wdt_reset(); TP3_OFF; wdt_reset(); } }
|
|
|
|
|
Feb 7 2017, 16:30
|
Местный
  
Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943

|
Цитата(Dog Pawlowa @ Feb 7 2017, 18:33)  Как Вы определяете частоту? Дизассеблер смотрели? Осциллографом на ноге 4 порта D. (Это обеспечивается строчкой PORTCFG.CLKOUT = 0x82; // Clock output on PORTD pin4) Дизассемблер не смотрел, честно говоря не очень разобрался в АтемлСтудии, - где там его включить? И просьба - киньте в меня, плз., компилируемый файл (например из одного оператора типа __watchdog_reset()  для ИАРа. Для Х-меги. Попробую на ИАРе запустить... Спасибо. Разобрался, - дизассемблированный текст в файле .lss. Вижу - два совсем разных текста... сюда запостить?
|
|
|
|
|
Feb 7 2017, 16:51
|
Местный
  
Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943

|
Цитата(demiurg1978 @ Feb 7 2017, 19:39)  1 - Магические числа. Через месяц, разбираясь со своим же проектом не вспомните, что значат все эти ваши циферки. 2 - IAR. (правда avr, не иксы). Все проекты настроены на high optimization (balanced). И я проверяю каждый кусок своего кода. Если компилятор что-то выкидывает, значит, я что-то не так написал. 1.Ну я же здесь опустил развернутые пояснения по каждому битику конфигурационных регистров, только общий смысл: PORTC шевелит ногой (тестпоинт TP3), а на выходе порта D - смотрю осциллом частоту. Настройки OSC и CLK расписывать очень громоздко, но суть в том, что они по разному компилируются в зависимости от оптимизации... 2.Может быть у Вас в ИАРе удастся хоть что-то скомпилировать под ATmega32E5?
|
|
|
|
|
Feb 9 2017, 01:33
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(Alexey_N @ Feb 7 2017, 17:03)  То есть с хотя бы первым уровнем оптимизации я получаю честные 8 МГц тактовой, а если поставить Оптимизация = None, то работает только на 2 МГц, что бы я не заряжал в регистры OSC и CLK. Вот код, посмотрите пожалуйста, - может быть я что-то не так делаю?: Код .... CPU_CCP = CCP_IOREG_gc; // protected by the configuration change protection mechanism CLK.CTRL = 0x05; // 101- RC8MHZ (8MHz internal oscillator) .... Защита работает следующим образом: после занесения в CCP register разрешения изменений нужно в течении 4-х тактов процессора изменить значение регистра CLK. Похоже при выключенной оптимизации компилятор генерирует код, который не вкладывается в отведенные 4 такта. Перепишите эти два оператора на встроенном ассемблере или оберните через "pragma". Пример для ИАРа: Код void write_CCP_gurad(void* addr,BYTE value) { asm ("MOVW R31:R30, R17:R16\n"); asm ("LDI R19, 216\n"); asm ("OUT 0x34, R19\n"); asm ("ST Z, R18\n"); }
write_CCP_gurad((void*)&CLK.CTRL,0x05);
|
|
|
|
|
Feb 15 2017, 17:11
|
Местный
  
Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943

|
Цитата(aiwa @ Feb 9 2017, 04:33)  Похоже при выключенной оптимизации компилятор генерирует код, который не вкладывается в отведенные 4 такта. Перепишите эти два оператора на встроенном ассемблере или оберните через "pragma". Да, скорее всего Вы правы, ничем другим я объяснить этот фокус не могу. Но и проверить тоже. К сожалению юзать встроенный ассемблер или загадочные "прагмы" я уже/ещё не умею, а разбираться долго. Оставим. Как-то работает и ладно, это будет последний проект на АтмелСтудии, дальше перелезу на ИАР, тестовый пример уже скомпилировался. А попутно обнаружилось странное поведение АЦП на Х-меге, - при уменьшении измеряемого напряжения, выдаваемые цифры сначала прогнозируемо уменьшаются, а потом начинают резко возрастать! Немонотонность какая-то... Интересно, кто-нибудь встречался ещё с таким эффектом?
|
|
|
|
|
Feb 15 2017, 18:15
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(Alexey_N @ Feb 15 2017, 19:11)  А попутно обнаружилось странное поведение АЦП на Х-меге, - при уменьшении измеряемого напряжения, выдаваемые цифры сначала прогнозируемо уменьшаются, а потом начинают резко возрастать! Немонотонность какая-то... Интересно, кто-нибудь встречался ещё с таким эффектом? Проверьте порядок чтения чтения байтов результата измерения: там строгая последовательность.
|
|
|
|
|
Feb 16 2017, 12:09
|
Местный
  
Группа: Свой
Сообщений: 308
Регистрация: 12-05-05
Из: мск
Пользователь №: 4 943

|
Цитата(aiwa @ Feb 15 2017, 21:15)  Проверьте порядок чтения чтения байтов результата измерения: там строгая последовательность. Нашел граблю, - немонотонность наступала видимо из-за моей баги - связи измеряемого напряжения с напряжением питания, (а референс = встроенный бандгап = 1.0В). Ну как-то так я себе это объясняю... Подал напряжение от тестового переменного резистора - немонотонность исчезла. И только утер пот со лба как заметил, что АЦП прекрасно меряет напряжения ВЫШЕ референса!!! То есть вот даю ему на вход 2 Вольта (референс = 1 В), и у меня ещё даже разрядная сетка не кончается! То есть где-то до 2,1 В - измеряемый диапазон, потом упирается в потолок. Я в шоке... В общем переключил референс на "питание/1.6" от греха подальше, ну их, эти встроенные бандгапы... ЗЫ. Да, последовательность чтения проверил, - не влияет.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|