Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PIC32МХ695F512Н
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
andreichk
Привет Народ, Подскажите как правильно оформить запись для чтения и записи данных в массиивы с порта Б , так, чтобы в один массив записывались младшие байты, а в другой старшие.
Предварительно в код вписаны след. строки:

созданы 2 глоб. массива
unsigned int TFT_A[512]; // Глобальный буфер А
unsigned int TFT_B[512]; // Глобальный буфер Б

порт Б настроен на вход
TRISB = 0b1111111111111111;//читаем данные с A,B на PORTB

и собственно кусок кода для записи в массивы:

Код
   unsigned int x;  
for( x=0;x<512;x++){

       TFT_A[x] = *(((unsigned char*)(&PORTB)));//чтение порта RB0-7

       TFT_B[x] = *(((unsigned char*)(&PORTB))+1);//чтение порта RB8-15
}


Для отладки на порт подаётся 16ти битный сигнал со счётчика запрограмированного в плиске.проверено осциллографом. В результате чтение и запись старших битов кое-как, а младшие вообще не записываются.
Что я не так сделал? Заранее спасибо.
evc
А просто так:

Код
for( x=0;x<512;x++){

       TFT_A[x] = PORTB & 0xFF;//чтение порта RB0-7

       TFT_B[x] = PORTB / 256;//чтение порта RB8-15
}


Уточнение:
Если вам скорость критична, то ваш код по-моему должен выглядеть так:
Код
for( x=0;x<512;x++){

       TFT_A[x] = *((unsigned char*)(&PORTB));//чтение порта RB0-7

       TFT_B[x] = *((unsigned char*)(&PORTB + 1));//чтение порта RB8-15
}
andreichk
верхний код даёт тот же результат, что и мой, а нижний вообще не работает
evc
А может проблема вообще не программная? Синхронизация передачи, надеюсь, у вас имеется...
andreichk
простите не понял, исхронизация с чем?
evc
Цитата(andreichk @ Jul 27 2012, 00:24) *
простите не понял, исхронизация с чем?


Вы передаете данные с плисины на процессор, так? Должна быть синхронизация. Сигнал по которому процессор будет "узнавать", что на порте есть валидные данные и (опционально) сигнал по которому плиска будет "узнавать" что данные процессор уже получил и можно подавать новые.

По коду, уточняю: В моем варианте каждый раз читается порт а затем совершается математическая операция над данными. Это медленнее вашего варианта, но проще некуда и гарантированно работает.
В вашем же варианте, адрес откуда будут сниматься данные, вычисляется один раз компилятором и поэтому потом код выполняется быстрее.
Если в обоих вариантах "не работает", значит проблема не в адресации.
msalov
ИМХО самый "правильный" вариант:
Код
uint16_t tmp = PORTB;
TFT_A[x] = tmp & 0xFF;
TFT_B[x] = tmp >> 8;

Т.к. значение порта читается один раз, в отличие от уже упомянутых вариантов, где присутствует по 2 чтения.
Ilya_A
Цитата(andreichk @ Jul 27 2012, 00:27) *
верхний код даёт тот же результат, что и мой, а нижний вообще не работает

Значит проблема не в чтении а в дальнейшей обработке данных и отрисовке. Проверить просто - достаточно заполнить массивы не данными с порта а предопределенными константами, и проверить, если отображение на экране не сооответствует действительности, значит надо копать в другом месте. Т.к. оба предложенных варианта чтения с порта должны корректно работать.
andreichk
ну вот заполнял я массивы вычисленными значениями синуса.

TFT_A[x] = sin(((x*u-100)/ 100.3))*20 ;//
TFT_B[x] = cos(x*u/130.9)*40;//

заполняет и отрисовывает как надо,даже очень красиво. а вот данные с порта Б никак.
andreichk
спасибо всем за помощь, но вы все были неправы. Оказывается, ларчик открывается очень просто. Курим даташит на МК smile3046.gif

Цитата
12.1.2 DIGITAL INPUTS
Pins are configured as digital inputs by setting the corresponding
TRIS register bits = 1. When configured as
inputs, they are either TTL buffers or Schmitt Triggers.
Several digital pins share functionality with analog
inputs and default to the analog inputs at POR. Setting
the corresponding bit in the AD1PCFG register = 1
enables the pin as a digital pin

и вписываем соотв. запись в код:
AD1PCFG = 0b1111111111111111;
и всё. Оба массива заполняются и считываются как надо. beer.gif
andreichk
возникла новая проблема. после того как портБ удалось правильно запустить, с выводом младших битов проблем не возникает. А вот со старшими битами беда. Данные выводятся, если на вход АЦП ничего не подавать, то рисуется прямая линия с отклонениями в 1-2 пикселя, но если подать сигнал, то через пару сек проц зависает намертво.

Код
void KANAL_B(void)// выводим на экран сигналы каналa  Б
{   unsigned int x;
       Triggerung_B(); // аппаратная синхронизация
       FIFO_RES_B = 0;    //_LATG8 сброс FIFO в "0"
       FIFO_RES_B = 1;    //_LATG8 и разрешение на считывание
for( x=0;x<479;x++){
                    READ_FIFO_B=0;           //_LATG8 разрешить
                    TFT_B[x] = PORTB >> 8;  // чтение порта RB8-15
                    READ_FIFO_B=1;           //_LATG8 запретить
                   }
}//--------------------------??


Что делать, кто знает? Может есть ещё лазейки?
andreichk
эх.... никто ничего больше не подсказывает.....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.