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

 
 
 
Reply to this topicStart new topic
> PIC32МХ695F512Н, не читает порт Б
andreichk
сообщение Jul 26 2012, 10:16
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



Привет Народ, Подскажите как правильно оформить запись для чтения и записи данных в массиивы с порта Б , так, чтобы в один массив записывались младшие байты, а в другой старшие.
Предварительно в код вписаны след. строки:

созданы 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ти битный сигнал со счётчика запрограмированного в плиске.проверено осциллографом. В результате чтение и запись старших битов кое-как, а младшие вообще не записываются.
Что я не так сделал? Заранее спасибо.


--------------------
Go to the top of the page
 
+Quote Post
evc
сообщение Jul 26 2012, 12:38
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



А просто так:

Код
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
}


--------------------
УЭР
Go to the top of the page
 
+Quote Post
andreichk
сообщение Jul 26 2012, 15:27
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



верхний код даёт тот же результат, что и мой, а нижний вообще не работает


--------------------
Go to the top of the page
 
+Quote Post
evc
сообщение Jul 26 2012, 19:23
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



А может проблема вообще не программная? Синхронизация передачи, надеюсь, у вас имеется...


--------------------
УЭР
Go to the top of the page
 
+Quote Post
andreichk
сообщение Jul 26 2012, 20:24
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



простите не понял, исхронизация с чем?


--------------------
Go to the top of the page
 
+Quote Post
evc
сообщение Jul 27 2012, 09:06
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(andreichk @ Jul 27 2012, 00:24) *
простите не понял, исхронизация с чем?


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

По коду, уточняю: В моем варианте каждый раз читается порт а затем совершается математическая операция над данными. Это медленнее вашего варианта, но проще некуда и гарантированно работает.
В вашем же варианте, адрес откуда будут сниматься данные, вычисляется один раз компилятором и поэтому потом код выполняется быстрее.
Если в обоих вариантах "не работает", значит проблема не в адресации.


--------------------
УЭР
Go to the top of the page
 
+Quote Post
msalov
сообщение Jul 27 2012, 12:27
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



ИМХО самый "правильный" вариант:
Код
uint16_t tmp = PORTB;
TFT_A[x] = tmp & 0xFF;
TFT_B[x] = tmp >> 8;

Т.к. значение порта читается один раз, в отличие от уже упомянутых вариантов, где присутствует по 2 чтения.
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Jul 27 2012, 14:27
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Jul 27 2012, 00:27) *
верхний код даёт тот же результат, что и мой, а нижний вообще не работает

Значит проблема не в чтении а в дальнейшей обработке данных и отрисовке. Проверить просто - достаточно заполнить массивы не данными с порта а предопределенными константами, и проверить, если отображение на экране не сооответствует действительности, значит надо копать в другом месте. Т.к. оба предложенных варианта чтения с порта должны корректно работать.
Go to the top of the page
 
+Quote Post
andreichk
сообщение Jul 28 2012, 11:38
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



ну вот заполнял я массивы вычисленными значениями синуса.

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

заполняет и отрисовывает как надо,даже очень красиво. а вот данные с порта Б никак.


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Jul 28 2012, 12:49
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



спасибо всем за помощь, но вы все были неправы. Оказывается, ларчик открывается очень просто. Курим даташит на МК 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


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Aug 2 2012, 08:31
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



возникла новая проблема. после того как портБ удалось правильно запустить, с выводом младших битов проблем не возникает. А вот со старшими битами беда. Данные выводятся, если на вход АЦП ничего не подавать, то рисуется прямая линия с отклонениями в 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 запретить
                   }
}//--------------------------??


Что делать, кто знает? Может есть ещё лазейки?


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Aug 6 2012, 16:38
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



эх.... никто ничего больше не подсказывает.....


--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:49
Рейтинг@Mail.ru


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