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

 
 
> Вопрос про последовательный сдвиговый регистр, что делаю не так?
#Eugene
сообщение Jun 14 2010, 20:16
Сообщение #1





Группа: Участник
Сообщений: 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 кГц, но его нет laughing.gif
В чем может быть проблема?

Сообщение отредактировал #Eugene - Jun 14 2010, 20:57
Прикрепленные файлы
Прикрепленный файл  MC145158_2.pdf ( 718.65 килобайт ) Кол-во скачиваний: 26
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
#Eugene
сообщение Jun 14 2010, 21:56
Сообщение #2





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 14 2010, 22:11
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post



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

 


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


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