|
|
  |
Вопрос про последовательный сдвиговый регистр, что делаю не так? |
|
|
|
Jun 14 2010, 20:16
|
Группа: Участник
Сообщений: 10
Регистрация: 14-06-10
Пользователь №: 57 921

|
Здравствуйте! Потребовалось загрузить в последовательный сдвиговый регистр PLL синтезатора MC145158 некоторые данные, загружать решил при помощи микроконтроллера attiny2313, написал для этого в CodeVision AVR следующую программу: Код #include<tiny2313.h> #include<delay.h> #define CLK PORTB.0 #define DATA PORTB.1 #define ENB PORTB.2 #define led PORTD.5 #define wait delay_us(500);
void send(unsigned int data,unsigned int length) { int i,j; for(i=length;i!=0;i--) { if((data & (1<<i))!=0) { DATA=1; } else { DATA=0; } CLK=1; wait CLK=0; wait } } void main(void) { DDRB=0b00000111; DDRD.5=1; send(0b10001110110110,14); send(0b0001000000,10); send(0b00100000,8); wait ENB=1; //включаем защелку, передаем данные в счетчики delay_ms(10); ENB=0; led=1; while(1); } Вроде бы все правильно, код работает, но загружает в регистр что-то не то, на ножке fR PLL синтезатора должен появиться сигнал с частотой 1.5625 кГц, но его нет В чем может быть проблема?
Сообщение отредактировал #Eugene - Jun 14 2010, 20:57
|
|
|
|
|
Jun 14 2010, 20:36
|
Группа: Участник
Сообщений: 10
Регистрация: 14-06-10
Пользователь №: 57 921

|
Эмм... А как иначе? первым берем следующий бит, вторым продвигаем его по регистру к концу... Или я что-то не понимаю? Код в первом посте обновил.
|
|
|
|
|
Jun 14 2010, 20:58
|
Группа: Участник
Сообщений: 10
Регистрация: 14-06-10
Пользователь №: 57 921

|
Понятно, исправил код в первом посте, правильно? Черт, не заметил временные диаграммы в даташите
Сообщение отредактировал #Eugene - Jun 14 2010, 21:05
|
|
|
|
|
Jun 14 2010, 21:21
|
Группа: Участник
Сообщений: 10
Регистрация: 14-06-10
Пользователь №: 57 921

|
Цитата загрузили 14 бит значения ÷ N counter N counter 10-и битный же?
|
|
|
|
|
Jun 14 2010, 21:56
|
Группа: Участник
Сообщений: 10
Регистрация: 14-06-10
Пользователь №: 57 921

|
Спасибо, разобрался. Загрузил только что в регистр R 100100000000000 (2048), кварц стоит на 3200 кГц, на выходе fR появился сигнал частотой 800 кГц, значит в регистр загрузилось не 2048, а 4, но почему? Загружаю вот так: Код void send(unsigned int data,unsigned int length) { int i; for(i=0;i!=length;i++) { wait if((data & (1<<i))!=0) { DATA=1; } else { DATA=0; } wait CLK=1; wait CLK=0; wait } } void main(void) { send(0b100100000000000,15); delay_us(500); ENB=1; delay_us(500); ENB=0; while(1); }
Сообщение отредактировал #Eugene - Jun 14 2010, 21:57
|
|
|
|
|
Jun 14 2010, 22:11
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(#Eugene @ Jun 15 2010, 01:56)  в регистр загрузилось не 2048, а 4, но почему? Данные должны загружаться старшим битом вперед, а в вашей программе они загружаются в противоположном направлении. Я бы написал как-нибудь так: Код #define wait() delay_us(500)
void send(unsigned int data) { int i = 15;
do { if(data & 1) DATA = 1; else DATA = 0; data >>= 1; wait(); CLK = 1; wait(); CLK = 0; wait(); } while(--i); }
void main(void) { send(0b001000000000001); delay_us(500); ENB = 1; delay_us(500); ENB = 0; while(1); }
|
|
|
|
|
Jun 15 2010, 09:25
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(aaarrr @ Jun 15 2010, 02:11)  Я бы написал как-нибудь так: Можно чуток короче: Код DATA = (data & 1); data >>= 1;
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 15 2010, 13:49
|
Группа: Участник
Сообщений: 10
Регистрация: 14-06-10
Пользователь №: 57 921

|
Наконец то я разобрался. Чем больше R тем меньше ширина импульса и по этому при R = 2048 я их не замечал на экране осциллографа Так и должно быть? Странно как-то...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|