Alexey_N 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Господа, я простодушно всю жизнь думал, что если отключить оптимизацию в компиляторе, то прога будет работать самым правильным способом, и некие странные глюки могут уйти. А вот сейчас получается наоборот, прога без оптимизации глючит, - работает на неправильной частоте. То есть с хотя бы первым уровнем оптимизации я получаю честные 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(); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба А вот сейчас получается наоборот, прога без оптимизации глючит, - работает на неправильной частоте. Как Вы определяете частоту? Дизассеблер смотрели? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey_N 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Как Вы определяете частоту? Дизассеблер смотрели? Осциллографом на ноге 4 порта D. (Это обеспечивается строчкой PORTCFG.CLKOUT = 0x82; // Clock output on PORTD pin4) Дизассемблер не смотрел, честно говоря не очень разобрался в АтемлСтудии, - где там его включить? И просьба - киньте в меня, плз., компилируемый файл (например из одного оператора типа __watchdog_reset();) для ИАРа. Для Х-меги. Попробую на ИАРе запустить... Спасибо. Разобрался, - дизассемблированный текст в файле .lss. Вижу - два совсем разных текста... сюда запостить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба 1 - Магические числа. Через месяц, разбираясь со своим же проектом не вспомните, что значат все эти ваши циферки. 2 - IAR. (правда avr, не иксы). Все проекты настроены на high optimization (balanced). И я проверяю каждый кусок своего кода. Если компилятор что-то выкидывает, значит, я что-то не так написал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey_N 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба 1 - Магические числа. Через месяц, разбираясь со своим же проектом не вспомните, что значат все эти ваши циферки. 2 - IAR. (правда avr, не иксы). Все проекты настроены на high optimization (balanced). И я проверяю каждый кусок своего кода. Если компилятор что-то выкидывает, значит, я что-то не так написал. 1.Ну я же здесь опустил развернутые пояснения по каждому битику конфигурационных регистров, только общий смысл: PORTC шевелит ногой (тестпоинт TP3), а на выходе порта D - смотрю осциллом частоту. Настройки OSC и CLK расписывать очень громоздко, но суть в том, что они по разному компилируются в зависимости от оптимизации... 2.Может быть у Вас в ИАРе удастся хоть что-то скомпилировать под ATmega32E5? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 9 февраля, 2017 Опубликовано 9 февраля, 2017 · Жалоба То есть с хотя бы первым уровнем оптимизации я получаю честные 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey_N 0 15 февраля, 2017 Опубликовано 15 февраля, 2017 · Жалоба Похоже при выключенной оптимизации компилятор генерирует код, который не вкладывается в отведенные 4 такта. Перепишите эти два оператора на встроенном ассемблере или оберните через "pragma". Да, скорее всего Вы правы, ничем другим я объяснить этот фокус не могу. Но и проверить тоже. К сожалению юзать встроенный ассемблер или загадочные "прагмы" я уже/ещё не умею, а разбираться долго. Оставим. Как-то работает и ладно, это будет последний проект на АтмелСтудии, дальше перелезу на ИАР, тестовый пример уже скомпилировался. А попутно обнаружилось странное поведение АЦП на Х-меге, - при уменьшении измеряемого напряжения, выдаваемые цифры сначала прогнозируемо уменьшаются, а потом начинают резко возрастать! Немонотонность какая-то... Интересно, кто-нибудь встречался ещё с таким эффектом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 15 февраля, 2017 Опубликовано 15 февраля, 2017 · Жалоба А попутно обнаружилось странное поведение АЦП на Х-меге, - при уменьшении измеряемого напряжения, выдаваемые цифры сначала прогнозируемо уменьшаются, а потом начинают резко возрастать! Немонотонность какая-то... Интересно, кто-нибудь встречался ещё с таким эффектом? Проверьте порядок чтения чтения байтов результата измерения: там строгая последовательность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey_N 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба Проверьте порядок чтения чтения байтов результата измерения: там строгая последовательность. Нашел граблю, - немонотонность наступала видимо из-за моей баги - связи измеряемого напряжения с напряжением питания, (а референс = встроенный бандгап = 1.0В). Ну как-то так я себе это объясняю... Подал напряжение от тестового переменного резистора - немонотонность исчезла. И только утер пот со лба как заметил, что АЦП прекрасно меряет напряжения ВЫШЕ референса!!! То есть вот даю ему на вход 2 Вольта (референс = 1 В), и у меня ещё даже разрядная сетка не кончается! То есть где-то до 2,1 В - измеряемый диапазон, потом упирается в потолок. Я в шоке... В общем переключил референс на "питание/1.6" от греха подальше, ну их, эти встроенные бандгапы... ЗЫ. Да, последовательность чтения проверил, - не влияет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться