Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: из флєш - в уарт
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
MichaZ
Подскажите,как в IAR сделать следующее

есть строка в флэш

обьявляю строку:
__flash unsigned char on[] = "\nON command received!\0";

указатель не нее
unsigned char __flash *on_ptr=&on[0];

хочу вывести на екран.пишу функцию:
void USART_transmit_string_from_flash(unsigned char __flash *ptr)
{
while(*ptr)
{
USART_transmit(*ptr++);//функция вывода байта
}
}

компилятор не ругается но и программа не работает.
подскажите,в чем дело.

спасибо
BlackJack
Что именно не работает? и при чем здесь экран?
программ передачи байта живая?
BVU
Может попробовать так: USART_transmit(*(ptr++));
MichaZ
да,живая.не виводится ничего в терминал(bray).
сейчас нашел в аппнотах драйвер к терминалу.там есть что то похожее.пробую
defunct
Цитата(MichaZ @ Feb 3 2006, 13:47) *
да,живая.не виводится ничего в терминал(bray).
сейчас нашел в аппнотах драйвер к терминалу.там есть что то похожее.пробую


Проверил - работает:

Код
void USART_transmit_string_from_flash(unsigned char __flash *ptr)
{
    unsigned char c;
    while(*ptr)
    {
        c = *ptr++;
        USART_transmit( c );
     }
}
Silent Bob
А USART_transmit функция или макрос? Если макром, то инструкции вида *ptr++ использовать нельзя!

А USART_transmit функция или макрос? Если макром, то инструкции вида *ptr++ использовать нельзя!
kay
приведи листинг функции USART_transmit
Rst7
Цитата(Silent Bob @ Feb 10 2006, 09:56) *
А USART_transmit функция или макрос? Если макром, то инструкции вида *ptr++ использовать нельзя!

А USART_transmit функция или макрос? Если макром, то инструкции вида *ptr++ использовать нельзя!


Обоснуй!

Обоснуй! wink.gif
viakon
Цитата(defunct @ Feb 4 2006, 00:00) *
Проверил - работает:

Код
void USART_transmit_string_from_flash(unsigned char __flash *ptr)
{
    unsigned char c;
    while(*ptr)
    {
        c = *ptr++;
        USART_transmit( c );
     }
}


Если и работает то строка лежит в озу, при инициализации памяти туда помещается. а нада чтоб из флеша читалась

void write_str_from_prg(PGM_P str)
{
while(pgm_read_byte(str)) put_uart(pgm_read_byte(str++));
}

в GCC так делается
Rst7
Цитата(viakon @ Feb 10 2006, 13:29) *
...
в GCC так делается


А у человека - IAR wink.gif
viakon
Цитата(Rst7 @ Feb 10 2006, 16:35) *
А у человека - IAR wink.gif


Думаешь он не догадается как переделать под IAR? smile.gif
Rst7
Цитата(viakon @ Feb 10 2006, 13:46) *
Цитата(Rst7 @ Feb 10 2006, 16:35) *

А у человека - IAR wink.gif


Думаешь он не догадается как переделать под IAR? smile.gif


Ты не понял, то что он сделал - в IAR работает так как хочется - берет из flash, т.к. указатель с модификатором __flash
sensor_ua
Неинтересно мучаться с модификаторам в зависимости от источника данных - проще через __generic
Ну и насчет макроса - или показывайте какой он крутой, или не юзайте в таком контексте - "подводные грабли" могут бытьwink.gif)

__flash unsigned char on[] = "\nON command received!\0";

void USART_transmit_string_from_flash(unsigned char __generic *ptr)
{
unsigned char c;
while(*ptr)
{
c=ptr++;
USART_transmit©;//функция вывода байта
}

}

Вызов
USART_transmit_string_from_flash(&on[0]);
IgorKossak
Цитата(sensor_ua @ Feb 10 2006, 15:49) *
USART_transmit_string_from_flash(&on[0]);

Ну тогда бы я её назвал
Код
USART_transmit_string_from_anywhere();
wink.gif
за исключением, разве что, EEPROM, как говорили раньше в других постах.
Тем не менее, это по-моему будет непереносимо на GCC.
Георгий
У меня с Уартом в порядке, а вот при сравнении компилятор выдает ошибку
Код
char HexCom[9];
__flash char Status[]   = "STATUS\0";

if (strcmp(HexCom, Status) == 0) response_sms(1);


Код
Error[Pe167]: argument of type "char __flash *" is incompatible with parameter of type "char const *"
Sergio66
Сдается мне, что *ptr++ инкрементирует не указатель, а саму переменную по адресу ptr!!! Сделайте так: ptr++
Rst7
Цитата(Георгий @ Feb 14 2006, 14:40) *
У меня с Уартом в порядке, а вот при сравнении компилятор выдает ошибку
Код
char HexCom[9];
__flash char Status[]   = "STATUS\0";

if (strcmp(HexCom, Status) == 0) response_sms(1);


Код
Error[Pe167]: argument of type "char __flash *" is incompatible with parameter of type "char const *"


Логика компилятора железная - не совпадают типы. Пользуйтесь strcmp_P!
Георгий
А на strcmp_P обругался! Он в каком хедере объявлен?
Нашел. pgmspace.h
Tech
__flash char Status[] = "STATUS\0";

if (strcmp(HexCom, (char *)Status) == 0) response_sms(1);
Георгий
Только судя по листингам результат будет ошибочный.
Код
   \   000000C8   ....               RCALL   gsb_decoder
   \   000000CA   E026               LDI     R18, 6
   \   000000CC   ....               LDI     R17, LOW(Status)
   \   000000CE   ....               LDI     R16, HexCom
   \   000000D0   ....               RCALL   strncmp
   \   000000D2   2B01               OR      R16, R17


   \   000000C8   ....               RCALL   gsb_decoder
   \   000000CA   E006               LDI     R16, 6
   \   000000CC   ....               LDI     R30, LOW(Status)
   \   000000CE   ....               LDI     R31, Status >> 8
   \   000000D0   ....               LDI     R26, HexCom
   \   000000D2   ....               RCALL   strncmp_P
   \   000000D4   2B01               OR      R16, R17

В первом случае он возьмет байт по LD, а во втором по LPM
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.