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

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1479
Зарегистрирован: Вс май 13, 2012 00:01:54

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

Сообщение Ariadna-on-Line »

Пока еще не освоил всех тонкостей синтаксиса С. Прошу помощи. - Как в Ардуиновском скетче написать команду записи / чтения байта в / из конкретный адрес ОЗУ ? Считаем, что адрес заведомо свободен.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

насчет скетча это к 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
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

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)))
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

а как же оно туда попало? Вся родная память дальше пустая. Вот эта строка туда и читает из внешней памяти:

Код: Выделить всё

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
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

oleg110592, внимательно смотрим на мою картинку
СпойлерИзображение
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4055082#p4055082"]внимательно смотрим...[/uquote]
так что ли для прохождения теста надо:
Изображение
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15545
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

[uquote="Ariadna-on-Line",url="/forum/viewtopic.php?p=4054719#p4054719"]Пока еще не освоил всех тонкостей синтаксиса С. Прошу помощи. - Как в Ардуиновском скетче написать команду записи / чтения байта в / из конкретный адрес ОЗУ ? Считаем, что адрес заведомо свободен.[/uquote]
Для простейшего теста внешней аппаратной обвязки схемы можно просто симитировать аппаратный блок в МК примитив-дрыголапом.
Это позволит исключить ошибки в настройках РСФ аппаратного блока управления внешней памятью, в том числе и "накладку адресов" в младшей части адресного пространства.
Относительно чтения/записи по конкретному адресу через Си - надо таки будет сначала аппаратный модуль управления внешним ОЗУ настроить... да и макет для проверки соорудть, чтоб в реале посмотреть. У меня для такого разве что мега8515...
:roll:
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1479
Зарегистрирован: Вс май 13, 2012 00:01:54

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

Сообщение Ariadna-on-Line »

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

Что касается схемотехники - В роли регистра адреса лучше использовать 74HCT574(четыре !). Надо ввести в схему цепи задержки сигналов ALE, #WR и #RD относительно сигналов адреса/данных. В роли задержки - пара инверторов. Два инвертора - повторитель. Шесть инверторов из микры (напр. 74HCT04) как раз то что требуется. Без них Протеус показывает лажу. В данном случае он не врет, логически все верно. Полагаться на супер-пупер быстродействие регистра адреса и микры памяти - опрометчивое дело. Выставил в настройках проца задержки по максимуму - оказалось недостаточно. Даташит предупреждает об этом же.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15545
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Задержки зависят от типа ОЗУ (см. даташит) и конфигурации линий монтажа.
8)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

[uquote="Ariadna-on-Line",url="/forum/viewtopic.php?p=4057592#p4057592"]Что касается схемотехники - В роли регистра адреса лучше использовать 74HCT574(четыре !)[/uquote]
В папке протеуса есть примеры (для ардуинщиков много), а среди примеров есть папка AVR External Memory. Там по схеме регистр 74LS373 и память 6264, есть и диаграммы работы схемы - может есть смысл рассмотреть. Я брал эту схему, только заменил микроконтроллер атмега8515 мегой128 - программно, как выше в постах видно - протеус нормально работает.
з.ы. в протеусе есть и сама среда ардуино
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15545
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

То все-таки симулятор...
Соответственно допуски определенные заложены.
: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:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=4057879#p4057879"]да и прокладка трасс линий адреса/данных многое меняет - это ежли реал-макет делается[/uquote]
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/
з.ы. там цивильная разводка того же есть
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1479
Зарегистрирован: Вс май 13, 2012 00:01:54

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

Сообщение Ariadna-on-Line »

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

Вернуться в «Arduino»