Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Re: Как указать компилятору Arduino IDE количество SRAM ?

Ср июн 30, 2021 16:32:33

Пока еще не освоил всех тонкостей синтаксиса С. Прошу помощи. - Как в Ардуиновском скетче написать команду записи / чтения байта в / из конкретный адрес ОЗУ ? Считаем, что адрес заведомо свободен.

Re: Как указать компилятору Arduino IDE количество SRAM ?

Ср июн 30, 2021 19:36:34

насчет скетча это к BOB51 (по ардуинам он главнюк тут на форуме :)) ), тем более ранее выкладывалось как.
Потестил обычным Си c малок в протеусе с внешней RAM - вроде работает, хотя полностью не уверен.
Изображение
Упрощенный тест:
Спойлер
Код:
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <avr/sleep.h>

#define BUFFER_SIZE 255

volatile uint8_t  ramTest[255];

void delay_ms(uint16_t); /* Defined in asmfunc.S */
void delay_us(uint16_t); /* Defined in asmfunc.S */

int main(void)
{
    uint8_t *mem;
    uint8_t index;
    uint8_t data=1;   
    delay_ms(200);
    DDRA = 0b11111111;
    DDRD = 0b00000000;
    DDRB = 0b00000000;
    DDRC = 0b11111111;
    DDRG = 0b11111111;
    PORTA = 0b00000000;
    PORTD = 0b00000000;
    PORTB = 0b00000000;
    PORTC = 0b00000000;
    PORTG = 0b00000000;
    ACSR = (1 << ACD);
    // External memory interface enable
    MCUCR |= (1<SRE);
    XMCRA = 0;
    //PC7..PC5 released pins
    XMCRB |= (1<XMM1)|(1<XMM0);
    mem = malloc(BUFFER_SIZE);

    for(index = 0; index < BUFFER_SIZE; index++)
    {
        mem[index] = data++;
        ramTest[index] = mem[index];
    }

    while(1);
}

в опциях линкера добавил:
Код:
-Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x8030ff

Re: Как указать компилятору Arduino IDE количество SRAM ?

Ср июн 30, 2021 21:39:46

oleg110592 писал(а):Упрощенный тест:
Тест не пройден, у вас на картинке AVR Data memory - U4.
Чисто, теоретически
Спойлер
Код:
   DDRC = 0xFF;
   PORTC = 0x00;

XMCRA = _BV(SRL2);
MCUCR |= (_BV(SRE) | _BV(SRW10));

   uint16_t a=0;
   for(uint16_t i=0x8000; i < 0xFFFF; i++){
      (*((uint8_t * const) (i))) = ((uint8_t) (a++));
   }

Проблема с шиной А15. 0x8000 выставляет на шине А15 единицу.
Можно адресовать с 0x1100 но это включает шину А12.
В протеусе работает.
Назад прочитать командой
Код:
data = (*((uint8_t * const) (address)))

Re: Как указать компилятору Arduino IDE количество SRAM ?

Чт июл 01, 2021 08:03:17

а как же оно туда попало? Вся родная память дальше пустая. Вот эта строка туда и читает из внешней памяти:
Код:
ramTest[index] = mem[index];

Картинка, где явно видно адрес указателя подробнее:
Изображение
Листинг похоже подтверждает:
Спойлер
Код:
    mem = malloc(BUFFER_SIZE);
 126:   8f ef          ldi   r24, 0xFF   ; 255
 128:   90 e0          ldi   r25, 0x00   ; 0
 12a:   0e 94 b6 00    call   0x16c   ; 0x16c <malloc>
 12e:   90 93 06 02    sts   0x0206, r25   ; 0x800206 <mem+0x1>
 132:   80 93 05 02    sts   0x0205, r24   ; 0x800205 <mem>
 136:   80 e0          ldi   r24, 0x00   ; 0
 138:   90 e0          ldi   r25, 0x00   ; 0
 13a:   21 e0          ldi   r18, 0x01   ; 1
 13c:   28 0f          add   r18, r24

    for(index = 0; index < BUFFER_SIZE; index++)
    {
        mem[index] = data++;
 13e:   e0 91 05 02    lds   r30, 0x0205   ; 0x800205 <mem>
 142:   f0 91 06 02    lds   r31, 0x0206   ; 0x800206 <mem+0x1>
 146:   e8 0f          add   r30, r24
 148:   f9 1f          adc   r31, r25
 14a:   20 83          st   Z, r18
        ramTest[index] = mem[index];
 14c:   e0 91 05 02    lds   r30, 0x0205   ; 0x800205 <mem>
 150:   f0 91 06 02    lds   r31, 0x0206   ; 0x800206 <mem+0x1>
 154:   e8 0f          add   r30, r24
 156:   f9 1f          adc   r31, r25
 158:   20 81          ld   r18, Z
 15a:   fc 01          movw   r30, r24
 15c:   ea 5f          subi   r30, 0xFA   ; 250
 15e:   fe 4f          sbci   r31, 0xFE   ; 254
 160:   20 83          st   Z, r18
 162:   01 96          adiw   r24, 0x01   ; 1
    for(index = 0; index < BUFFER_SIZE; index++)
 164:   8f 3f          cpi   r24, 0xFF   ; 255
 166:   91 05          cpc   r25, r1
 168:   41 f7          brne   .-48        ; 0x13a <main+0x4c>
 16a:   ff cf          rjmp   .-2         ; 0x16a <main+0x7c>



и в map файле:
Код:
                0x00801100                __heap_start = 0x801100
                0x008030ff                __heap_end = 0x8030ff

листинг маллока не приложен.
И тут пример, который упрощал (в усарт не хотелось), реально испытаный автором в железе (повтор) :
https://www.rlocman.ru/shem/schematics.html?di=71095

Re: Как указать компилятору Arduino IDE количество SRAM ?

Чт июл 01, 2021 09:34:32

oleg110592, внимательно смотрим на мою картинку
СпойлерИзображение

Re: Как указать компилятору Arduino IDE количество SRAM ?

Чт июл 01, 2021 09:50:13

внимательно смотрим...

так что ли для прохождения теста надо:
Изображение

Re: Как указать компилятору Arduino IDE количество SRAM ?

Чт июл 01, 2021 09:56:16

Пока еще не освоил всех тонкостей синтаксиса С. Прошу помощи. - Как в Ардуиновском скетче написать команду записи / чтения байта в / из конкретный адрес ОЗУ ? Считаем, что адрес заведомо свободен.

Для простейшего теста внешней аппаратной обвязки схемы можно просто симитировать аппаратный блок в МК примитив-дрыголапом.
Это позволит исключить ошибки в настройках РСФ аппаратного блока управления внешней памятью, в том числе и "накладку адресов" в младшей части адресного пространства.
Относительно чтения/записи по конкретному адресу через Си - надо таки будет сначала аппаратный модуль управления внешним ОЗУ настроить... да и макет для проверки соорудть, чтоб в реале посмотреть. У меня для такого разве что мега8515...
:roll:

Re: Как указать компилятору Arduino IDE количество SRAM ?

Вт июл 06, 2021 18:24:14

Всем большое спасибо. Понял как пользоваться пойнтером *Ptr.

Что касается схемотехники - В роли регистра адреса лучше использовать 74HCT574(четыре !). Надо ввести в схему цепи задержки сигналов ALE, #WR и #RD относительно сигналов адреса/данных. В роли задержки - пара инверторов. Два инвертора - повторитель. Шесть инверторов из микры (напр. 74HCT04) как раз то что требуется. Без них Протеус показывает лажу. В данном случае он не врет, логически все верно. Полагаться на супер-пупер быстродействие регистра адреса и микры памяти - опрометчивое дело. Выставил в настройках проца задержки по максимуму - оказалось недостаточно. Даташит предупреждает об этом же.

Re: Как указать компилятору Arduino IDE количество SRAM ?

Ср июл 07, 2021 10:15:55

Задержки зависят от типа ОЗУ (см. даташит) и конфигурации линий монтажа.
8)

Re: Как указать компилятору Arduino IDE количество SRAM ?

Ср июл 07, 2021 11:07:55

Что касается схемотехники - В роли регистра адреса лучше использовать 74HCT574(четыре !)

В папке протеуса есть примеры (для ардуинщиков много), а среди примеров есть папка AVR External Memory. Там по схеме регистр 74LS373 и память 6264, есть и диаграммы работы схемы - может есть смысл рассмотреть. Я брал эту схему, только заменил микроконтроллер атмега8515 мегой128 - программно, как выше в постах видно - протеус нормально работает.
з.ы. в протеусе есть и сама среда ардуино

Re: Как указать компилятору Arduino IDE количество SRAM ?

Ср июл 07, 2021 14:14:15

То все-таки симулятор...
Соответственно допуски определенные заложены.
:dont_know:
В реале у той же ОЗУ есть варианты с различным временем доступа,
да и прокладка трасс линий адреса/данных многое меняет - это ежли реал-макет делается.
На котуинке, к примеру, стоит 74HC573(К1533ИР33) + UM61512AK-15/W24512AK-15 (15nS доступ)....
( у 6264 из тех, что попадались "вживую" - только 70nS...)
И то при кварце в 11,0592МГц (тактовая МК ~ 1Мгц). Выше частоту поднимать таки не рисковал - ибо там не только данные, но и исполняемая программа размещается.
В принципе... тот блок ВПД можно и с мегой8515/162й протестировать...
https://img.radiokot.ru/files/20529/2k8oskg0us.JPG
монтаж совершенно примитивный
верхняя сторона с регистром
https://img.radiokot.ru/files/20529/17kiakfs6n.jpg
нижняя сторона с собственно ОЗУшкой
https://img.radiokot.ru/files/20529/17kiakxghg.jpg
Кстати... не обязательно абсолютное соответствие старшего байта адресов у МК раскладке микросхемы памяти делать.
Можно и по принципу "как удобнее" - для МК они все равно будут последовательно считываться, несмотря на "физически размещенную чехарду".
:roll:

Re: Как указать компилятору Arduino IDE количество SRAM ?

Ср июл 07, 2021 15:45:31

да и прокладка трасс линий адреса/данных многое меняет - это ежли реал-макет делается

Andy, который реальный тест проводил (выше ссылка была) проложил трассы как попало:
СпойлерИзображение

но использовал
SRAM Alliance AS7C4096A 12ns 44 pin TSOP-II
Latch NXP 74AHC373 20 pin TSSOP-20
первоисточник перевода на радиолоцмане:
https://andybrown.me.uk/2011/08/28/512k ... ega-build/
з.ы. там цивильная разводка того же есть

Re: Как указать компилятору Arduino IDE количество SRAM ?

Чт июл 08, 2021 01:22:29

Искал почему в Протеусе внешняя память не пишется, не читается. Когда ввел для задержек микру с инверторами - Протеус заработал. Об этом написано в предыдущем моем посте.
В реале наверняка придется сделать как в Протеусе, те ввести микру с инверторами. Про недостаточность задержек в процессоре упоминается в его даташите.
Ответить