Atmega 128A - AU + внешняя SRAM (62256 +74HC753) пробовал ли кто собирать?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

есть ли подводные камни ?

axill
Offline
Зарегистрирован: 05.09.2011

Я планировал уже и память есть и защелки, но руки не дошли

судя по описанию там все просто:

- цепляем чип памяти к соотвествующим пинам меги используя защелку для 8бит адреса

- настраиваем фьюзы

- настраиваем компилятор на новый размер памяти

вроде ничего более

подводные камни могут быть при необходимости согласовывать уровни, вся статическая память которую видел трех вольтовая и не факт, что толерантная к 5в

еще тайминги надо сверить у памяти и защелки с планируемой тактовой МК

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

память едет вот эта, питание 4.5 - 5.5 в, 70нс

http://ru.aliexpress.com/item/5pcs-Free-shipping-HM62256BLFP-7T-HM62256BLFP/32657849622.html

axill
Offline
Зарегистрирован: 05.09.2011

интересный вариант, не дорогой

но 70нсек если правильно понимаю это длиньше такта 16мгц, а чтение там идет за три такта, причем собственно на само считывание отдается один такт, при 16мгц это 62.5 нсек такт

т.е. я бы с этой памятью не расчитывал на работу на частоте выше 8-12 мгц

axill
Offline
Зарегистрирован: 05.09.2011

я брал CY7C1019DV33 там время 10нсек, но стоит намного дороже

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

приедут, буду пробовать, установка адреса у них 55нс, считывание 70, может и на 16мгц заведется :)

a5021
Offline
Зарегистрирован: 07.07.2013

Теоретически, можно кварц с частотой повыше поставить. Атмеги вроде вверх по частоте идут без особых проблем. В разумных пределах, разумеется.

inspiritus
Offline
Зарегистрирован: 17.12.2012

то есть это дополнительная память для программ или данных ?

кака схема подключения, если не секрет ?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

О! Господа, просвятите - эту память меги 128/2560 принимают как родную и обращение по адресному пространству? Что такое сигнал ALE  и заче  защёлка? Т.е. понятно зачем она, по почему младшая часть адреса на одной шине с данными, а не со старшей частью адреса? Это не ошибка? Так мегу придумали?

axill
Offline
Зарегистрирован: 05.09.2011

faeton пишет:

О! Господа, просвятите - эту память меги 128/2560 принимают как родную и обращение по адресному пространству? Что такое сигнал ALE  и заче  защёлка? Т.е. понятно зачем она, по почему младшая часть адреса на одной шине с данными, а не со старшей частью адреса? Это не ошибка? Так мегу придумали?

откройте даташит, там все расписано

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Я пробовал на Мега2560, но память была статическая EtronTech EM51256A-20P даташит конкретно на эту так и не нашел. Была вытащена из кеша матери на 486DX. Судя по маркировакам прочих чипов от EtronTech эта вроде как типовая 32к8 20нсек. Так и запаял 2шт (64к8) + регистр-защелка 74VHC373 тоже из какой-то матери .. не заработало. Детальное описание тут, в проектах, тема "недовольным, супер дуня". Там и разводка платы есть практически в 1 слой и фотки и проверочный скетч, которому вовсе ничего прописывать для компилятора не требуется.

При 70нс, скорее всего потребуется 3 такта ожидания, поскольку только в этом режиме есть растянутый цикл чтения-записи, в остальных только доп. такты ожидания выставления адреса. 3+3 = 6 тактов на 1 операцию чтения/записи .. 16/6 = 2.5Мгц., но все равно лучше чем читать последовательную память.

axill
Offline
Зарегистрирован: 05.09.2011

А где там такты ожидания настраиваются? По идее там ничего сложного. Скорее всего или память не рабочая или что то не так подключили, что немудрено без даташита. А память вся статическая и что у ТС и та, что я называл

я кстати планировал подключить 128к используя один цифровой пин как 17й бит адрес

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Работа интерфейса (на Мега2560, по крайней мере) настраивается двумя регистрами, тут скетч примера было описание "как", в комментах к коду:

  //   SRE(7)=0x80 - enable Xbus
  // , SRL0,1,2(6,5,4)=0 - banks [0x10..0x70]=[0x2200,0x4000..0xE000]: [0,0x10] -- start upper bank only!
  // , SRW11(3),SRW10(2) = [0x0,0x04,0x08,0x0c] upper sector: 0,1,2,2+1 wait cycles
  // , SRW01(1),SRW00(0) = [0x0,0x01,0x02,0x03] for lower sector wait states
XMCRA = 0x80 | 0x00 | 0x00 | 0x00;

  // XMBK(7) = 0x80 -- bus keeper AD0..AD7
  // , XMM(2,1,0) -- Xbus address mask 0 - full 64k, 1 - not A15 .. 7 - not portC as address!
XMCRB = 0x80;

 

То есть, всю внешнюю память можно поделить на 2 банка установкой бит SRLO (6,5,4 биты регистра XMCRA): "верхнюю" и "нижнюю". При этом 2 значения относятся к одному и тому варианту "банк только 1"

Битами 0,1 и 2,3 как раз устанавливаются раздельные дополнительные задержки каждому банку к имеющейся "по умолчания" в 1 дополнительный такт. Соответственно "0" - 1 такт ожидания, "1" +2 такта, "2" +3 такта и "3" - +3такта задержки от адреса И +1 такт удлинение цикла записи (время удержания данных процессором на шине), итого +4 такта. Вот "удлинять цикл записи" можно только в этом последнем режиме и он дает +4 такта к 2 имеющимся у МК при обращениях к своей внутренней памяти.

Итого имеем 8Мгц - "родная SRAM", 5.33Мгц - "внешняя без задержек" .. и 2.5Мгц "худший случай".

Регистр XMCRB - позволяет маскировать шину адреса, уменьшая разрядность и тем самым освобождать ножки порта "С" для собственного применения. При этом, конечно же никто не мешает использовать их для адресации внешней памяти "вручную". Этот прием позволяет обращаться к маскируемым внутренней ЗУ, адресным областям внешней памяти. То есть иметь 64к + внутренняя SRAM полностью.

Делается так: маскируем линию C7 (A15) в XMCRB, устанавливаем вручную С7=0, и обращаемся к ячейкам 32К+младшая зона адресов. Поскольку старшая линия адреса замаскирована, то процессор её на шину НЕ выставит, а у вас она установлена в 0, что приведет к обращению к младшим адресам внешней SRAM, чего сделать иным способом - проблематично.

На самом деле, тут непаханное поле для реализации разного рода менеджеров страниц без существенного расхода ножек МК .. :)

К примеру, ставим на контроллер внешней ЗУ кроме регистра-защелки младшей части адреса, ещё и регстр страницы, входами на ту же линию AD0..7. Запрещаем xBus и обычной записью в порт прописываем новый регистр "страниц/ы", используя С7 в качестве строба записи. Регистр страниц может использовать А14 адреса как выборку какие 4 бита подать на память в качестве старшей части адреса вместо А14,А15,А16,А17 .. итого имеем:

1. Замаскированную старшую линию адреса - адресное окно 32к в старшей части адресов.

2. Две виртуальные страницы внешней SRAM по 16кб в этом окне.

3. 256 килобайт внешнего ЗУ.

Можно и похитрее поизголяться .. :)

P.S. Да, есть опасение что запял память как-то "не так". Насколько смог, проследил на 486DX куда какие ноги ведут .. но мало что понял. Вроде бы адрес, данные запаяны верно, а вот с управлением ничего там понять не смог.. Поскольку адрес-данные совпали с типовыми чипами такого формата, то и сделал по типовому в надежде что прокатит. Ан не тут-то было. :(

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

нарисовал девелоперскую плату, на выходных буду лутить :)

a5021
Offline
Зарегистрирован: 07.07.2013

Прямые углы в дорожках уберите. Дурной тон и переотражение сигналов.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

axill пишет:

нашел дешевые 45нс sram 62256

http://ru.aliexpress.com/item/Free-shipping-5pcs-lot-IS62C256AL-45ULI-ISSI-SOP28-memory-chip-new/32664778748.html

а вот про скорость памяти, если 70 нс и кварц 16мгц -  то WS = 1 и если 55нс и ниже то WS = 0 при 16 мгц кварце :)

и еще неплохая статейка

http://radio-hobby.org/modules/news/article.php?storyid=828

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

запустил внешнюю память, все работает, вот скетч теста памяти переделанный от Arhat109-2 для Atmega128A + Sram 32Kb


uint32_t test_start, test_end;
uint8_t  pattern;

void printResult(uint8_t isOk)
{
  Serial.print("Pattern = ");
  Serial.print(pattern, HEX);
  Serial.print(" Test");
  Serial.print(isOk ? " OK" : ": Error");
  Serial.print(", Time = ");
  Serial.print(test_end - test_start, DEC);
  Serial.println(" mcsec.");
  if (isOk == 0) {
    DDRB |= (1 << PB4);
    PORTB |= (1 << PB4);
  }
}

/**
   test memory with pattern
*/
uint8_t memTest(uint8_t pattern)
{
  volatile uint8_t *mem = (volatile uint8_t *)0x1100;
  uint8_t   res;
  uint8_t   isGood = 1;
  Serial.print("Pattern = "); Serial.print( pattern, HEX);
  Serial.print(", Address 0 = "); Serial.println( (uint16_t)mem, HEX);
  test_start = micros();
  do {
    *mem = pattern;
    res = *mem;
    if ( res != pattern ) isGood = 0;
  } while ( (uint16_t)(++mem) < 0x9100);
  test_end = micros();
  return isGood;
}

void setup()
{
  MCUCR |= (1 << SRE);
  // , SRL0,1,2(6,5,4)=0 - banks [0x10..0x70]=[0x2200,0x4000..0xE000]: [0,0x10] -- start upper bank only!
  // , SRW11(3),SRW10(2) = [0x0,0x04,0x08,0x0c] upper sector: 0,1,2,2+1 wait cycles
  // , SRW01(1),SRW00(0) = [0x0,0x01,0x02,0x03] for lower sector wait states
  XMCRA = 0;
  // XMBK(7) = 0x80 -- bus keeper AD0..AD7
  // , XMM(2,1,0) -- Xbus address mask 0 - full 64k, 1 - not A15 .. 7 - not portC as address!
  //PC7 released pins
  XMCRB |= (1 << XMM0);
  DDRC |= (1 << PC7);
  PORTC |= (0 << PC7);

  Serial.begin(115200);
  /*printResult(
    memTest(pattern = 0x00) // and calc test_start, test_end too!
    );
    printResult(
    memTest(pattern = 0x55) // and calc test_start, test_end too!
    );
    printResult(
    memTest(pattern = 0xAA) // and calc test_start, test_end too!
    );*/
}

void loop() {
  printResult(
    memTest(pattern = 0x00) // and calc test_start, test_end too!
  );
  printResult(
    memTest(pattern = 0x55) // and calc test_start, test_end too!
  );
  printResult(
    memTest(pattern = 0xAA) // and calc test_start, test_end too!
  );
  delay(500);
}

вот выхлоп, память HM62256BLFP-7T - 70нс. регистр защелка SN74HC573D,  кварц 16 Мгц

Pattern = 0, Address 0 = 1100
Pattern = 0 Test OK, Time = 31096 mcsec.
Pattern = 55, Address 0 = 1100
Pattern = 55 Test OK, Time = 31372 mcsec.
Pattern = AA, Address 0 = 1100
Pattern = AA Test OK, Time = 31380 mcsec.
 


 

 

 

axill
Offline
Зарегистрирован: 05.09.2011

Супер! Поздравляю!

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Valera19701 пишет:
запустил внешнюю память, все работает, вот скетч теста памяти переделанный от Arhat109-2 для Atmega128A + Sram 32Kb
Тест не показательный, надо бы сначала прописать всю память разными значениями, а в другом цикле прочитать.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Andy пишет:

Тест не показательный, надо бы сначала прописать всю память разными значениями, а в другом цикле прочитать.

я в курсе, просто вчера пришла память, я ее быстро проверил, позже перепишу тестовый скетч :)

зы, переделал


uint32_t test_start, test_end;
uint8_t i = 0;
boolean flag = 0;

void printResult(boolean isOk) {
  Serial.print("Pattern = ");
  Serial.print(i, HEX);
  Serial.print(" Test");
  Serial.print(isOk ? " OK" : ": Error");
  Serial.print(", Time = ");
  Serial.print(test_end - test_start, DEC);
  Serial.println(" mcsec.");
  if (isOk == 0) {
    flag = 1;
  }
  if (flag == 1) {
    DDRB |= (1 << PB4); // if error led on 
    PORTB |= (1 << PB4);
  }
}

void memTestwrite(uint8_t pattern) {
  volatile uint8_t *mem = (volatile uint8_t *)0x1100;
  do {
    *mem = pattern;
  } while ( (uint16_t)(++mem) < 0x9100);
}

boolean memTestread(uint8_t pattern) {
  volatile uint8_t *mem = (volatile uint8_t *)0x1100;
  uint8_t   res;
  boolean   isGood = 1;
  test_start = micros();
  do {
    res = *mem;
    if ( res != pattern ) {
      isGood = 0;
    }
  } while ( (uint16_t)(++mem) < 0x9100);
  test_end = micros();
  return isGood;
}

void setup() {
  MCUCR |= (1 << SRE);
  XMCRA = 0;
  XMCRB |= (1 << XMM0); //PC7 release pin
  DDRC |= (1 << PC7);
  PORTC &= ~(1 << PC7);
  Serial.begin(115200);
}

void loop() {
  memTestwrite(i);
  printResult(memTestread(i));
  i = i + 1;
  i = i;
  if (i == 255) {
    i = 0;
  }
}

 

std
Offline
Зарегистрирован: 05.01.2012

Респект, а можно тупой вопрос по принципиальной схеме? Я не умею в шины вообще, от слова сафсэм. Как понять три толстых синих стрелки PA0..7 и только две PA8..15? значит ли это что AD0 у U3 соединяется с D0 U4 (11 вывод) и с D0U5 (2 вывод); AD1 U3 - с D1U4 (12 вывод) и D1U5 (3 вывод) и т. д., а потом A8 U3 - с A8 U4(25 вывод), A9 U3 - с A9 U4(24 вывод) и т. д.?

Хочу тоже сделать.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

std пишет:

значит ли это что AD0 у U3 соединяется с D0 U4 (11 вывод) и с D0U5 (2 вывод); AD1 U3 - с D1U4 (12 вывод) и D1U5 (3 вывод) и т. д., а потом A8 U3 - с A8 U4(25 вывод), A9 U3 - с A9 U4(24 вывод) и т. д.?

Хочу тоже сделать.

да

вот моя плата в спринте

https://yadi.sk/d/IK5CJYN5sFXkT

и среда IDE 1.6.9 atmega128

https://yadi.sk/d/T44-s_klsSHd6

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Первые подводные камни, написал скетч, но по окончанию loop начинается загрузка сначала

uint8_t ab[64][128], ba[64][128];

void setup() {
  MCUCR |= (1 << SRE); // | (1 << SRW10); //wait 1 cycle
  XMCRA = 0; // |= (1 << SRW11);  //wait 1 state
  XMCRB |= (1 << XMM0); //PC7 released pin
  DDRC |= (1 << PC7);
  PORTC &= ~(1 << PC7);
  Serial.begin(115200);
  Serial.println("Setup");
}

void loop() {
  Serial.println("Start");
  for (uint8_t k = 0; k < 64; k++) {
    for (uint8_t i = 0; i < 128; i++) {
      ab[k][i] = i;
      ba[k][i] = i;
    }
  }
  for (uint8_t k = 0; k < 64; k++) {
    for (uint8_t i = 0; i < 128; i++) {
      if (ab[k][i] != ba[k][i]) {
        DDRB |= (1 << PB4);
        PORTB |= (1 << PB4);
      }
    }
  }
  Serial.println("End");
}

вот выхлоп

Setup
Start
End
Setup
Start
End
Setup
Start
End
Setup
Start
End
 

watchdog выключен, кто что посоветует?

есть сомнение что компилятор собирает только для 4кб памяти,

пробовал добавить в секцию boards.txt флаг

atmega128.build.extra_flags=-Wl,-Tdata=0x801100,--defsym=__heap_end=0x8090ff

видно что собирает с этим флагом но все равно не работает

ps, разобрался :)

std
Offline
Зарегистрирован: 05.01.2012

А что сделать надо было?

a5021
Offline
Зарегистрирован: 07.07.2013

Не говорит. Видно государственная тайна.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

не то и не так добавлял, надо добавить в boards.txt строчку

atmega128.compiler.c.elf.extra_flags=-Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x8090ff

и все заработало :)

по материалам

http://www.rlocman.ru/shem/schematics.html?di=71095

правильный скетч со строкой иннициализации XMEM

void initExtSRAM(void) __attribute__((naked, section(".init3")));

void initExtSRAM(void) {
  MCUCR |= (1 << SRE); // | (1 << SRW10); //wait 1 cycle
  XMCRA = 0; // |= (1 << SRW11);  //wait 1 state
  XMCRB |= (1 << XMM0); //PC7 released pin
  DDRC |= (1 << PC7);;
  PORTC &= ~(1 << PC7);
}

uint8_t ab[125][128], ba[125][128];

void setup() {
  Serial.begin(115200);
  Serial.println("Setup");
  DDRB |= (1 << PB4);
  PORTB &= ~(1 << PB4);
}

void loop() {
  Serial.println("Start");
  for (uint8_t k = 0; k < 125; k++) {
    for (uint16_t i = 0; i < 128; i++) {
      ab[k][i] = i;
      ba[k][i] = i;
    }
  }
  for (uint8_t k = 0; k < 125; k++) {
    for (uint16_t i = 0; i < 128; i++) {
      if (ab[k][i] != ba[k][i]) {
           PORTB |= (1 << PB4); 
      }
      //Serial.println(ab[k][i]);
    }
  }
  Serial.println("End");
}

еще про иннициализацию памяти

http://avr-libc.narod.ru/mem_sections.html

Maverik
Offline
Зарегистрирован: 12.09.2012

а чем обусловлен выбор именно этой микросхемы памяти ?

вроде уже отработанный вариант  - пиковская  23k256 , цепляется легко, стоит 40 рублей.

еще кто-то вроде цеплял старую компьютерную DDR1  или даже еще до неё которая была, не помню подробности.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Maverik пишет:

а чем обусловлен выбор именно этой микросхемы памяти ?

скоростью, параллельная быстрее чем spi

Maverik
Offline
Зарегистрирован: 12.09.2012

всё равно для многих задач , мне кажется,  пойдеть, нужно только пихать в неё константы и переменные, к которым программа редко обращается. всё ж быстрее, чем еепром.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

ну eeprom у 128 вообще песня, 4Кб заполняет нулями около минуты :)

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Maverik пишет:

пиковская  23k256

* микрочиповская

axill
Offline
Зарегистрирован: 05.09.2011

Maverik пишет:

всё равно для многих задач , мне кажется,  пойдеть, нужно только пихать в неё константы и переменные, к которым программа редко обращается. всё ж быстрее, чем еепром.

разница кардинальная. Паралельная память для МК мегя128 работает совершенно точно так же как встроенная. Не на уровне программ, а на уровне машинных инструкций

память на spi это совсем другое, программный уровень. Тоже применима, но не сравнима

Immortal
Offline
Зарегистрирован: 28.12.2013

А где брали мс памяти? Хочу повторить конструкцию, думаю заказать тут $3.74 5 шт./лот HM62256BLFP-7T чип памяти SOP28

также ищу защелку в более мелком корпусе.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
axill
Offline
Зарегистрирован: 05.09.2011

Valera19701 пишет:

на 20Мгц запускать буду:)

мега128 гарантируется до 16мгц. поэкспериментировать конечно никто не мешает, но результат может быть не тот, что ожидается

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

народ запускает, почему бы не попробовать?

https://github.com/MCUdude/MegaCore

на 16Мгц память на 70нс. работает на ура, думаю что на 45нc и защелка 74AHC573 при 20 Мгц работать будет :)

axill
Offline
Зарегистрирован: 05.09.2011

Работать будет, не сомнения

но как только выходим за пределы допустимого никто уже не гарантирует стабильность

погоняетет месяц другой дайте знать

Immortal
Offline
Зарегистрирован: 28.12.2013

Кристаллы с плотной начинкой как у меги128 почти не разгоняются. Да и сделана она на старом техпроцессе, не PicoPower

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Atmega128A-AU по моему на новом техпроцессе

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Не знаю, какой там техпроцесс, но точно не по технолгии picoPower. Там буквенный индекс должен быть P, PA, PB.

a5021
Offline
Зарегистрирован: 07.07.2013

Новая 128-ая атмега -- это 1280 и 1281.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

a5021 пишет:

Новая 128-ая атмега -- это 1280 и 1281.

с какого перепугу ? это разные чипы,  читайте дш

128А это новая ревизия 128 и 128L

a5021
Offline
Зарегистрирован: 07.07.2013

"Разная" там 1280, т.к. она в 100-пиновом корпусе. А 1281, вполне себе одинаковая, за исключением нескольких мелких нюансов.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Valera19701 пишет:

128А это новая ревизия 128 и 128L

Древняя Atmega8A тоже новая ревизия после ископаемой Atmega8, но от этого не менее древняя. 128L вообще не нашел на сайте Атмела.

axill
Offline
Зарегистрирован: 05.09.2011

128A правильнее назвать багфиксингом 128 без А. Точно так же атмел поступал с мега8, мега16, мега32 и т.д.

были исправлены часть errata, но по сути этот тот же чип, на том же ядре и такой же древний) в частности древность 128а можно понять не только по отсутствию picopower, но и по отсутствию PCINT прерываний

возможно чуть более совершенный технологический процесс, потому, что в версиях без А атмел по сути отбраковывал часть чипов и наносил на них маркировку L (мое предположение) для работы на пониженной частоте и пониженном напряжении. Когда в версиях с А диапазон напряжений расширен и отпала необходимость сортировать на L и не L

но в целом мега128 очень неплоха. особенно учитывая аномально низкую цену на нее у китайцев (что загадка)

а отладкак в JTAG так просто сказка если сравнивать с глюками debugWire интерфейса в той же мега328

a5021
Offline
Зарегистрирован: 07.07.2013

axill пишет:
но в целом мега128 очень неплоха. особенно учитывая аномально низкую цену

Не особо и спорю, но 20 МК для любительских целей -- это как-то многовато. Среди атмег это наверное очень неплохой вариант, но если смотеть шире, то на таких количествах и STM32F030C8T6 по 47 руб/шт. можно на али купить. Ног и флеша, правда, поменьше, но вот ОЗУ и прочего фарша ощутимо погуще. И если бы выбор стоял конкретно передо мной, то не факт, что я бы двинулся в сторону атмеги.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Valera19701 пишет:

зы, переделал


uint32_t test_start, test_end;
uint8_t i = 0;
boolean flag = 0;

void printResult(boolean isOk) {
  Serial.print("Pattern = ");
  Serial.print(i, HEX);
  Serial.print(" Test");
  Serial.print(isOk ? " OK" : ": Error");
  Serial.print(", Time = ");
  Serial.print(test_end - test_start, DEC);
  Serial.println(" mcsec.");
  if (isOk == 0) {
    flag = 1;
  }
  if (flag == 1) {
    DDRB |= (1 << PB4); // if error led on 
    PORTB |= (1 << PB4);
  }
}

void memTestwrite(uint8_t pattern) {
  volatile uint8_t *mem = (volatile uint8_t *)0x1100;
  do {
    *mem = pattern;
  } while ( (uint16_t)(++mem) < 0x9100);
}

boolean memTestread(uint8_t pattern) {
  volatile uint8_t *mem = (volatile uint8_t *)0x1100;
  uint8_t   res;
  boolean   isGood = 1;
  test_start = micros();
  do {
    res = *mem;
    if ( res != pattern ) {
      isGood = 0;
    }
  } while ( (uint16_t)(++mem) < 0x9100);
  test_end = micros();
  return isGood;
}

void setup() {
  MCUCR |= (1 << SRE);
  XMCRA = 0;
  XMCRB |= (1 << XMM0); //PC7 release pin
  DDRC |= (1 << PC7);
  PORTC &= ~(1 << PC7);
  Serial.begin(115200);
}

void loop() {
  memTestwrite(i);
  printResult(memTestread(i));
  i = i + 1;
  i = i;
  if (i == 255) {
    i = 0;
  }
}

 

1. Записывать во все ячейки памяти одно и то же значение - не очень хорошая идея: такой тест в принципе не способен выявить проблемы с адресацией.

2. Что Вы хотели сказать строкой 57?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

andriano пишет:

2. Что Вы хотели сказать строкой 57?

1) ну это первый вариант

2) старая привычка пуще неволи, она там не нужна :)

Immortal
Offline
Зарегистрирован: 28.12.2013

Valera19701 пишет:

Atmega128A-AU по моему на новом техпроцессе

Неа, она второго поколения. Мне лично пофиг на это, я их ценю за то что они дешевые.

У атмела AVR имеют условно 4 поколения/техпроцесса.
1 В первом поколении такие МК как atmega8. У них нет ни микропотребления ни системы прерываний PCINT (только INT). Небольшое число PWM, другие опорные напряжения АЦП и ряд других отличий.
2 Потом было улучшенное поколение с индексами A. Туда входят та же atmega8 только с буквой А, также atmega128A, atmega16A и ряд других. У них так же нет ни микропотребления ни PCINT, это такое поколение багфиксов. В даташите на atmega8a есть Глава с описанием отличий от atmega8 - там наглядно видно какие баги фиксили.
3 Третье поколение это как раз atmega328p/pa, atmega644p/pa, atmega1281p, atmega1284p и ряд других - с расширенным числом pwm, PCINT, микропотребление и ряд других отличий.
4 Ну и четвёртое поколение это такие МК как attiny4/5/9/10. У них улучшенное микропотребление и новый протокол программирования TPI
Из относящегося к питанию также у многих новых кристаллов изменились уровни POR.
Микроконтроллеры «А» и «не-А» с точки зрения программатора не отличаются ничем. Соответствующие кристаллы имеют одинаковый набор «фьюзов» (fuses) и одинаковые сигнатуры.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Immortal, 128 мне нравится из-за кол-ва памяти, ножек и цены, она подходит мне в 95 % моих проектов :)