Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как создать 24 битный указатель (code vision)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
ysmat
нужно создать указатель для работы с внешней памятью
чип atxmega128a1

haker_fox
QUOTE (ysmat @ Oct 31 2012, 18:55) *
нужно создать указатель для работы с внешней памятью
чип atxmega128a1

Создайте 32-х битный и не мучайтесь)
ysmat
Цитата(haker_fox @ Oct 31 2012, 14:58) *
Создайте 32-х битный и не мучайтесь)

вопрос как создать смотрел в гугле не нашел
походу в code vision нет такого понятия как размер указателя
MrYuran
Цитата(ysmat @ Oct 31 2012, 15:21) *
походу в code vision нет такого понятия как размер указателя

Есть (обязан быть) stdint.h, а в нем может быть uint24_t (возможны вариации)
_Артём_
Цитата(MrYuran @ Oct 31 2012, 13:31) *
Есть (обязан быть) stdint.h, а в нем может быть uint24_t (возможны вариации)

Может там и есть 3-х байтовай тип данных, но при чём тут это?
Вопрос о том, как адресовать более 64к байт данных - к xmega может подключаться до 16 МБ памяти.
ysmat
вот файл stdint.h
/*
CodeVisionAVR C Compiler
© 1998-2008 Pavel Haiduc, HP InfoTech S.R.L.

stdint.h standard header
*/

#ifndef _STDINT_INCLUDED_
#define _STDINT_INCLUDED_

typedef signed char int8_t;
typedef unsigned char uint8_t;

typedef short int16_t;
typedef unsigned short uint16_t;

typedef long int32_t;
typedef unsigned long uint32_t;

// An integer type large enough to be able to hold a pointer to RAM.
#ifdef _MODEL_TINY_
typedef signed char intptr_t;
typedef unsigned char uintptr_t;
#else
typedef short intptr_t;
typedef unsigned short uintptr_t;
#endif

// An integer type large enough to be able to hold a pointer to FLASH.
#if defined _MODEL_MEDIUM_ | defined _MODEL_LARGE_
typedef long flash_intptr_t;
typedef unsigned long flash_uintptr_t;
#else
typedef short flash_intptr_t;
typedef unsigned short flash_uintptr_t;
#endif

// An integer type large enough to be able to hold a pointer to EEPROM.
typedef short eeprom_intptr_t;
typedef unsigned short eeprom_uintptr_t;

#endif
Палыч
Цитата(ysmat @ Oct 31 2012, 15:21) *
походу в code vision нет такого понятия как размер указателя

Уж не знаю: какая у Вас версия ? У себя я нашёл версию 1.24.7f... Подозреваю, что она совсем не последняя - всё-таки семилетней давности... Но в Help'е явно сказано: указатель для модели памяти tiny - 8 бит, small - 16 бит. И всё...
Загляните в Help своего транслятора: Menu -> Help -> Help topics -> CodeVisionAVR C Compiler Reference -> Pointers
ysmat
Цитата
Вопрос о том, как адресовать более 64к байт данных - к xmega может подключаться до 16 МБ памяти.

а можно ли попробывать сделать эту адресацию напрямую на asme
или будут глюки
_Артём_
Цитата(ysmat @ Oct 31 2012, 17:29) *
а можно ли попробывать сделать эту адресацию напрямую на asme
или будут глюки


На асме всё можно.
Но всё-таки что вы адресовать хотите и как предполагаете работать с данными?
Короче говоря, что нужно-то?
ysmat
к атхмеге128 подключен lcd екран как внешняя память
нужно работать с ним

пример
Код
void Cls(unsigned char col)// ЗАЛИВКА ЦВЕТОМ
{
unsigned int i;
unsigned int j;
unsigned char  *VRAM; // АДРЕС ДИСПЛЕЯ

VRAM = 0x020000; // НАЧАЛЬНЫЙ АДРЕС ДИСПЛЕЯ ЗА ПРЕДЕЛАМИ ВНУТРЕННЕЙ ПАМЯТИ


  for (i = 0; i < 272; i++)
    {
      for (j = 0; j < 480; j++) {*VRAM++ = col;}
    }
}
_Артём_
Цитата(ysmat @ Oct 31 2012, 20:24) *
Код
void Cls(unsigned char col)// ЗАЛИВКА ЦВЕТОМ
{
unsigned int i;
unsigned int j;
unsigned char  *VRAM; // АДРЕС ДИСПЛЕЯ

VRAM = 0x020000; // НАЧАЛЬНЫЙ АДРЕС ДИСПЛЕЯ ЗА ПРЕДЕЛАМИ ВНУТРЕННЕЙ ПАМЯТИ


  for (i = 0; i < 272; i++)
    {
      for (j = 0; j < 480; j++) {*VRAM++ = col;}
    }
}

Да, такое на асме сделать можно, но нужно учесть какий регистры компилятор использует.
=GM=
А так почему нельзя сделать

unsigned long i;
unsigned char *VRAM;
VRAM=0x00020000;
for(i=0;i<130560;i++) *VRAM++=colour;
_Артём_
Цитата(=GM= @ Oct 31 2012, 22:41) *
А так почему нельзя сделать

Можно и так, но вдруг окажется что сделать 130560 раз инкремент двухбатого числа быстрее 130560 инкрементов 4-х байтового.
ysmat
Цитата(=GM= @ Oct 31 2012, 23:41) *
А так почему нельзя сделать

unsigned long i;
unsigned char *VRAM;
VRAM=0x00020000;
for(i=0;i<130560;i++) *VRAM++=colour;


Error: D:\PROECT\AVR\SDR_avr_2\SDR.c(1285): a value of type 'long' can't be assigned to an entity of type 'unsigned char *'

в любом случаи главная проблема не решена
модель памяти small - указатели 16 бит
бессмысленно пытаться записать туда большее

кстати у avr-gcc вроде то же 16 бит не понятно как он работает с xмегами
ведь он идет в составе avrstudio6
_Артём_
Цитата(ysmat @ Oct 31 2012, 23:48) *
Error: D:\PROECT\AVR\SDR_avr_2\SDR.c(1285): a value of type 'long' can't be assigned to an entity of type 'unsigned char *'

Модель - моделью, а строка
Код
VRAM=0x00020000;

всё равно должна вызвать ошибку.
Где-то так надо бы:
Код
VRAM=(unsigned char *)0x00020000;



Цитата(ysmat @ Oct 31 2012, 23:48) *
в любом случаи главная проблема не решена
модель памяти small - указатели 16 бит
бессмысленно пытаться записать туда большее

Что больше не бывает?
Ещё одна причина бросить CodeVision...

Цитата(ysmat @ Oct 31 2012, 23:48) *
кстати у avr-gcc вроде то же 16 бит не понятно как он работает с xмегами
ведь он идет в составе avrstudio6

У атмела должна быть апнота по работе с EBI, хотя бы для Иара.
Работают они там с SRAM так:

Код
#define SDRAM(addr) ((uint8_t *) SDRAM_ADDR)[addr] //!< Macro to access SDRAM.
#define SRAM(addr)  ((uint8_t *) SRAM_ADDR)[addr] //!< Macro to access SRAM.
    for (uint16_t i = 0; i < 1000; ++i) {
        SRAM(i) = (uint8_t) (i & 0xff);
    }
    
    // Copy to SDRAM.
    for (uint16_t i = 0; i < 1000; ++i) {
        SDRAM(i) = SRAM(i);
    }

Модель - Large.
Интересно где у GCC она включается?

haker_fox
QUOTE (ysmat @ Nov 1 2012, 03:24) *
к атхмеге128 подключен lcd екран как внешняя память
нужно работать с ним

А так нельзя?
CODE
void Cls(unsigned char col)// ЗАЛИВКА ЦВЕТОМ
{
unsigned int i;
unsigned int j;
uint32_t *VRAM; // АДРЕС ДИСПЛЕЯ

VRAM =(uint32_t*) 0x020000; // НАЧАЛЬНЫЙ АДРЕС ДИСПЛЕЯ ЗА ПРЕДЕЛАМИ ВНУТРЕННЕЙ ПАМЯТИ


  for (i = 0; i < 272; i++)
    {
      for (j = 0; j < 480; j++) {*VRAM++ = col;}
    }
}
_Артём_
Цитата(haker_fox @ Nov 1 2012, 03:25) *
А так нельзя?

Можно, но толку-то...
Больше 64 (или 32КБ) не поадресуешь - модель не той системы.


Цитата(haker_fox @ Nov 1 2012, 03:25) *
Код
void Cls(unsigned char col)// ЗАЛИВКА ЦВЕТОМ
{
uint32_t *VRAM; // АДРЕС ДИСПЛЕЯ

VRAM =(uint32_t*) 0x020000; // НАЧАЛЬНЫЙ АДРЕС ДИСПЛЕЯ ЗА ПРЕДЕЛАМИ ВНУТРЕННЕЙ ПАМЯТИ


  for (i = 0; i < 272; i++)
    {
      for (j = 0; j < 480; j++) {*VRAM++ = col;}
    }
}


И смысл другой - *VRAM= пишет в память по 4 байта зараз.
Это на АРМ, без разницы (местами наверное - случаи бывают разные), что так
Цитата
uint8_t * ptr8=(uint8_t *)0x020000;
//....
for (i=0; i<100500; i++) {
*ptr8++=digit;
}


что так

Цитата
uint32_t * ptr32=(uint32_t *)0x020000;;
//....
for (i=0; i<100500/4; i++) {
*ptr32++=digit|(digit<<8)|(digit<<16)(digit<<24);
}

А на АВР как надо?
Сергей Борщ
QUOTE (_Артём_ @ Nov 1 2012, 01:26) *
Работают они там с SRAM так:
Чушь какая-то. Завернули в макросы обращение по указателю. Ничего нового не внести, семантику скрыли - жди граблей. Ключевое слово - "модель памяти Large", т.е. все указатели 24-битные, что и требовалось.

А автору вопроса остается только через асм, молясь, чтобы не пересечься с компилятором по используемым в асм-вставках регистрам. Ну или сменить проц. Полагаю, тот же STM32 покрывает хмегу по всем показателям, включая цену.
ysmat
посмотрел на настройки компилятора там есть выбор Large
Сергей Борщ
QUOTE (ysmat @ Nov 1 2012, 11:43) *
посмотрел на настройки компилятора там есть выбор Large
Тогда посмотрите документацию на предмет - что это означает и как с этим работать.
ysmat
The LARGE memory model is similar to the SMALL memory model, except it uses pointers to the FLASH memory area that are 32 bits wide.
The LARGE memory model can be used for chips with 256kbytes or more of FLASH.
In all memory models pointers to the EEPROM memory area are 16 bit wide

сказано что указатели flash 32 бита eeprom 16 про ram ни слова



что то я совсем запутался
не работает даже с двух байтным числом

unsigned char *VRAM;//
VRAM = 0xABAB; // НАЧАЛЬНЫЙ АДРЕС ЗА ПРЕДЕЛАМИ ВНУТРЕННЕЙ ПАМЯТИ

ошибка Error: D:\proect\SDR_avr_2\SDR.c(1272): a value of type 'unsigned int' can't be assigned to an entity of type 'unsigned char *'
Палыч
Цитата(ysmat @ Nov 1 2012, 13:15) *
ошибка Error: D:\proect\SDR_avr_2\SDR.c(1272): a value of type 'unsigned int' can't be assigned to an entity of type 'unsigned char *'

VRAM = (unsigned char *) 0xABAB;

Цитата(ysmat @ Nov 1 2012, 13:15) *
сказано что указатели flash 32 бита eeprom 16 про ram ни слова

Ну, как же - сказано: английским по-белому "is similar to the SMALL", за исключением указателей на flash...
haker_fox
QUOTE (_Артём_ @ Nov 1 2012, 10:53) *
А на АВР как надо?

Честно говоря, не знаю... Просто посмотрел у автора дисплейчик 480*272. У меня к АРМу с таким же разрешением подключен через интерфейс RGB (цифра). Там за раз и надо 4 байта писать. Вот я автоматом сюда и разместил предложение rolleyes.gif
ysmat
у меня к этому екрану подключена простая плис она и занимаеться регенерациеей
_Артём_
Цитата(ysmat @ Nov 1 2012, 14:49) *
у меня к этому екрану подключена простая плис она и занимаеться регенерациеей

Пишите Гайдуку в суппорт - пусть разъясняет...как ОЗУ такого объёма адресовать.
Либо на асме делайте.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.