Перейти к содержанию
    

мда, до nIRQ, как выяснилось, дело не доходит.

раздобыл осцилограф, на выводе nIRQ абсолютный ноль.

попробовал поменять программно частоту CLK (можно менять в диапазоне 1-10 МГц), безрезультатно.

держится 1 МГц - частота по умолчанию.

вывод - инициализация не проходит, а значит не выставляется бит ebs, ea как и все остальные.

поэтому и нет nIRQ.

вот код программки, может кому что в глаза бросится, буду премного благодарен.

typedef unsigned char uchar;
typedef unsigned int uint;

#include <16F676.h>
#device adc=8
#FUSES NOWDT                     //No Watch Dog Timer
#FUSES HS                        //High speed Osc (> 4mhz)
#FUSES NOPROTECT                 //Code not protected from reading
#FUSES NOBROWNOUT                //No brownout reset
#FUSES NOMCLR                    //Master Clear pin used for I/O
#FUSES NOCPD                     //No EE protection
#FUSES NOPUT                     //No Power Up Timer
#FUSES BANDGAP_HIGH          
#use delay(clock=8000000)
#byte PORTC = 7
#byte PORTA = 5
#bit LED = PORTA.1
#bit SDI = PORTC.0
#bit SCK = PORTC.1
#bit nSEL = PORTC.2
#bit FSK = PORTC.3

#bit nIRQ = PORTC.4
#bit SDO = PORTC.5

void Write0( void );
void Write1( void );
void WriteCMD( uint CMD );
void RF2_Init( void );
void WriteFSKbyte( uchar DATA );

   uint ChkSum;

/*****************************************************************/

void RF2_Init( void )
{
   nSEL=1;
   SDI=1;
   SCK=0;
   FSK=0;
}

void main()
{
   ChkSum=0;
   
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   
   SET_TRIS_C(0x30); 
   SET_TRIS_A(0x0); 
      LED=0;

   RF2_Init();
   WriteCMD( 0xCC00 );
   WriteCMD( 0x8B61 );
   WriteCMD( 0xA640 );
   WriteCMD( 0xD040 );
   WriteCMD( 0xC823 );
   WriteCMD( 0xC220 );
   WriteCMD( 0xC001 );

   while (1)
   {
      WriteCMD( 0xC039 );

      LED=1;
      delay_ms(100);
      LED=0;
      delay_ms(100);

      WriteFSKbyte( 0xAA );
      WriteFSKbyte( 0xAA );
      WriteFSKbyte( 0xAA );
      WriteFSKbyte( 0x2D );
      WriteFSKbyte( 0xD4 );

      WriteFSKbyte( 0x30 );
      ChkSum+=0x30;
      WriteFSKbyte( 0x31 );
      ChkSum+=0x31;
      WriteFSKbyte( 0x32 );
      ChkSum+=0x32;
      WriteFSKbyte( 0x33 );
      ChkSum+=0x33;
      WriteFSKbyte( 0x34 );
      ChkSum+=0x34;
      WriteFSKbyte( 0x35 );
      ChkSum+=0x35;
      WriteFSKbyte( 0x36 );
      ChkSum+=0x36;
      WriteFSKbyte( 0x37 );
      ChkSum+=0x37;
      WriteFSKbyte( 0x38 );
      ChkSum+=0x38;
      WriteFSKbyte( 0x39 );
      ChkSum+=0x39;
      WriteFSKbyte( 0x3A );
      ChkSum+=0x3A;
      WriteFSKbyte( 0x3B );
      ChkSum+=0x3B;
      WriteFSKbyte( 0x3C );
      ChkSum+=0x3C;
      WriteFSKbyte( 0x3D );
      ChkSum+=0x3D;
      WriteFSKbyte( 0x3E );
      ChkSum+=0x3E;
      WriteFSKbyte( 0x3F );
      ChkSum+=0x3F;

      ChkSum&=0x0FF;
      WriteFSKbyte( ChkSum );
      WriteFSKbyte( 0xAA );
      WriteCMD( 0xC001 );
      delay_ms(1000);
   }
}

/************************************************************/
void Write0( void )
{
   SDI=0;
   SCK=0;
   #asm
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP  
   NOP
   NOP
   NOP
   NOP
   #endasm
   SCK=1;
   #asm
   NOP
   #endasm
}

/****************************************************************/
void Write1( void )
{
   SDI=1;
   SCK=0;
   #asm
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   #endasm
   SCK=1;
   #asm
   NOP
   #endasm
}
/*****************************************************************/
void WriteFSKbyte( uchar DATA )
{ 
   uchar n=8;
   nSEL=1; 
   while (n--)
      {
      while (!nIRQ);
      while (nIRQ);
      if (DATA&0x80) FSK=1;
      else FSK=0;
      DATA=DATA<<1;
      }
}
/*****************************************************************/
void WriteCMD( uint CMD )
{
   uchar n=16;
   SCK=0;
   nSEL=0;
   while (n--)
   {
      if (CMD&0x8000) Write1();
      else Write0();
      CMD=CMD<<1;
   }
   SCK=0;
   nSEL=1;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот код программки, может кому что в глаза бросится, буду премного благодарен
Скачал описание модуля по ссылке из первого поста. Не нашел в нем команд 0xD040, 0xC823.

 

Раз уж ветка по С:

1) Ээх, не любите вы себя - потратьте час, присвойте всем битам (и/или их комбинациям) осмысленные имена через #define и потом пишите WriteCMD( SET_CONFIG | BAND_433 | CLK_2MHZ | LOAD_CAP_11_5_PF | M1 ) - и программа читабельная станет и вероятность ошибиться гораздо меньше.

 

2) вот вам предложение:

void WriteCMD( uint CMD )
{
   uchar n=16;
   // SCK тут уже равно 0
   nSEL=0;
   do
   {
      if (CMD & (1 << 15) )
           SDI = 1;
      else 
           SDI = 0;
      SCK = 1;
      CMD <<= 1;  // в это время выдерживается пауза высокого уровня SCK, хотя она тут и не нужна, между командами все равно больше 25 нс
      SCK = 0;
   }
   while (--n);      // во время перехода по циклу выдерживается пауза низкого уровня SCK, хотя она тут и не нужна.

   // и тут SCK уже равно 0.
   nSEL=1;

}

циклы do {} while (--var); компилируются эффективнее, чем while(n--) {}. Длинные nop не нужны - по даташиту длительность высокого и низкого уровней SCK должна быть не меньше 25 нс, у вас процессор при всем желании так быстро ногами дергать не сможет. SDI после этой функции может оставаться в любом состоянии и сбрасывать его при инициализации тоже необязательно.

 

3) сделайте отдельную функцию для

    WriteFSKbyte( n );
    ChkSum += n;

исключите возможность ошибки "передали одно, а прибавили другое".

 

4)Какой смысл команды 0xCC00 в вашем тексте? Она выдает содержимое регистра статуса во время последних 8 импульсов SCK, но вы его не читаете. Для начала добейтесь, чтобы модуль вам ответил что-то осмысленное на эту команду. Зациклите ее, засинхронизируйте осциллограф от nSEL, посмотрите, что творится на ногах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, на моя просба никто не можеть помочь?

 

А почему бы Вам самим не скомпилировать пример? Никаких трудностей при этом не было. Да и Вам должно быть удобней, чем лазить по asm+C тексту

В файлах код для передатчика с разными уровнями оптимизации для AVR.

 

vank.rar

 

Может быть, я чего-то просто-напросто не понимаю?

Изменено пользователем tazik

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скачал описание модуля по ссылке из первого поста. Не нашел в нем команд 0xD040, 0xC823.

 

Раз уж ветка по С:

1) Ээх, не любите вы себя - потратьте час, присвойте всем битам (и/или их комбинациям) осмысленные имена через #define и потом пишите WriteCMD( SET_CONFIG | BAND_433 | CLK_2MHZ | LOAD_CAP_11_5_PF | M1 ) - и программа читабельная станет и вероятность ошибиться гораздо меньше.

 

2) вот вам предложение:

void WriteCMD( uint CMD )
{
   uchar n=16;
   // SCK тут уже равно 0
   nSEL=0;
   do
   {
      if (CMD & (1 << 15) )
           SDI = 1;
      else 
           SDI = 0;
      SCK = 1;
      CMD <<= 1;  // в это время выдерживается пауза высокого уровня SCK, хотя она тут и не нужна, между командами все равно больше 25 нс
      SCK = 0;
   }
   while (--n);      // во время перехода по циклу выдерживается пауза низкого уровня SCK, хотя она тут и не нужна.

   // и тут SCK уже равно 0.
   nSEL=1;

}

Спасибо большое!

Действительно так гораздо компактнее. :)

Какой смысл команды 0xCC00 в вашем тексте? Она выдает содержимое регистра статуса во время последних 8 импульсов SCK, но вы его не читаете. Для начала добейтесь, чтобы модуль вам ответил что-то осмысленное на эту команду. Зациклите ее, засинхронизируйте осциллограф от nSEL, посмотрите, что творится на ногах.

Сделал как Вы посоветовали, обнаружилось, что на выходе SDI постоянно ноль.

void RF2_Init( void )
{
   nSEL=1;
   SDI=1;
   SCK=0;
   FSK=0;
}

void main()
{
   
   RF2_Init();

   while (1)
   {
      WriteCMD( 0xCC00 );
   }
}

/*****************************************************************/
void WriteCMD( uint CMD )
{
   uchar n=16;
   // SCK тут уже равно 0
   nSEL=0;
   do
   {
      if (CMD & 0x8000)
              SDI = 1;
      else
              SDI = 0;

      SCK = 1;
      CMD = CMD<<1;  // в это время выдерживается пауза высокого уровня SCK, хотя она тут и не нужна, между командами все равно больше 25 нс
      SCK = 0;
   }
   while (--n);      // во время перехода по циклу выдерживается пауза низкого уровня SCK, хотя она тут и не нужна.

   // и тут SCK уже равно 0.
   nSEL=1;

}

причем клок синал SCK и nSEL идут , а SDI нету :07:

 

 

Причем даже когда делаю так:

 

     if (CMD & 0x8000)
             SDI = 1;
      else
             SDI = 1;

все равно ноль.

 

Причем когда делаю так:

 //     if (CMD & 0x8000)
             SDI = 1;
   //   else
             SDI = 0;

генерит...

 

Что это - ошибка компилятора или мои кривые руки?

Да, компилер CCS_PCWHD_v4.057

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему бы Вам самим не скомпилировать пример? Никаких трудностей при этом не было. Да и Вам должно быть удобней, чем лазить по asm+C тексту

В файлах код для передатчика с разными уровнями оптимизации для AVR.

Спасибо "tazik"! Но мне необходим код для PIC-a. А я не знаю C и поетому не могу скомпилировать пример.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но мне необходим код для PIC-a. А я не знаю C и поетому не могу скомпилировать пример.

 

Пожалуйста, только для PIC`а у меня ничего нет (. Для AVR`а пример скомпилировался с 1-го раза без всяких замечаний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поставил тип переменной CMD "unsigned long int" вместо "unsigned int" - все пошло.

я озадачен :05:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

никак не получается инициализировать RFM02.

по прежнему после инициализации нет импульсов на выходе nIRQ и не меняется частота CLK (настраиваемый выход клоксигнала)

хотя когда гоняю в цикле команду CC00 (read status registor) выдает такой пакет (значит команды в принципе проходят) :

a15df8b17b01cb80dbe3cbb4c6a6240a.jpg

а что это значит?

в даташите об этом только это:

5b42a125d7a99821d5e82f81bab6bba0.jpg

 

помогите советом. :crying:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот куски кода для модулей HopeRF с немецких сайтов. Может кому чего в них пригодится.

Ссылки дали сами китайцы... :a14:

rfm01.zip

rfm02.zip

rfm12.zip

RFM12_RX_TX.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...