реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
IVN2013
сообщение Feb 3 2014, 19:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 12-08-13
Пользователь №: 77 889



Доброго времени! Пытаюсь считать и вывести все содержимое flash m128 (на AVR GCC), использую функцию pgm_read_byte_near () ; - считываются первые 2 байта корректно, остальное неправильно.
Читаю и вывожу так:
Код
for (uint16_t  address_short = 0; address_short<0x01fc00; address_short++  )
            
            {    
                UDR1 = pgm_read_byte_near(address_short);
            }

Подскажите пожалуйста - что может быть не так. Сам подозреваю что ошибки возникают из-за того, что адрес 16-ти битный. Спасибо!

И еще не понял отличие pgm_read_byte от pgm_read_byte_near.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 3 2014, 20:44
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(IVN2013 @ Feb 3 2014, 21:59) *
Подскажите пожалуйста - что может быть не так.
Вы заталкиваете данные в UART чаще, чем он успевает их отправить. Вам нужно дожидаться готовности UART принять данные (бит TXE) перед записью в UDR.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 3 2014, 21:36
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(IVN2013 @ Feb 3 2014, 21:59) *
Читаю и вывожу так:
Код
for (uint16_t  address_short = 0; address_short<0x01fc00; address_short++  )

Цитата(IVN2013 @ Feb 3 2014, 21:59) *
Подскажите пожалуйста - что может быть не так. Сам подозреваю что ошибки возникают из-за того, что адрес 16-ти битный.
Нет, пока не возникают. Но возникнут, как только ожидание готовности от UART-а вставите:
1) address_short имеет максимальное значение 0xFFFF и значит всегда меньше 0x01fc00. Цикл бесконечный (при включённой оптимизации).
2) в m128 число байтов равно 0x1FFFF - значит с помощью 16р. адреса считаете только первую половину памяти.

Цитата(IVN2013 @ Feb 3 2014, 21:59) *
И еще не понял отличие pgm_read_byte от pgm_read_byte_near.
В итоге одно и тоже - чтение flash с адресом до 0xFFFF. Нажмите Go to definition или Go to Implementation или как у вас в IDE называется.
Вам нужна функция pgm_read_byte_far. Или что-то своё аналогичное написать можно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 03:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01435 секунд с 7
ELECTRONIX ©2004-2016