|
Вопрос по Си... |
|
|
|
Apr 22 2008, 15:29
|
Участник

Группа: Новичок
Сообщений: 39
Регистрация: 2-09-07
Пользователь №: 30 237

|
Прошу прощения за глупый вопрос. Пытаюсь разобраться с программой для РIС(пример передачи пакета данных для RF-модуля FSK-передатчика http://www.hoperf.com/pdf/RF02B.pdf ). Сама программка находится здесь: http://www.hoperf.com/pdf/RF02_code.pdf стр. 11-16. И там на стр. 15 вот такой фрагмент кода:  Не подскажите зачем там эти две строчки: ........ while (!nIRQ); while (nIRQ); ......... что бы это значило?
|
|
|
|
|
 |
Ответов
|
Apr 29 2008, 20:57
|
Участник

Группа: Новичок
Сообщений: 39
Регистрация: 2-09-07
Пользователь №: 30 237

|
мда, до 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;
}
|
|
|
|
|
Apr 29 2008, 23:33
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(wasp @ Apr 29 2008, 23:57)  вот код программки, может кому что в глаза бросится, буду премного благодарен Скачал описание модуля по ссылке из первого поста. Не нашел в нем команд 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, посмотрите, что творится на ногах.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 1 2008, 10:44
|
Участник

Группа: Новичок
Сообщений: 39
Регистрация: 2-09-07
Пользователь №: 30 237

|
Цитата(Сергей Борщ @ Apr 30 2008, 03:33)  Скачал описание модуля по ссылке из первого поста. Не нашел в нем команд 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 нету Причем даже когда делаю так: Код if (CMD & 0x8000) SDI = 1; else SDI = 1; все равно ноль. Причем когда делаю так: Код // if (CMD & 0x8000) SDI = 1; // else SDI = 0; генерит... Что это - ошибка компилятора или мои кривые руки? Да, компилер CCS_PCWHD_v4.057
|
|
|
|
Сообщений в этой теме
wasp Вопрос по Си... Apr 22 2008, 15:29 rezident Видимо автор таким образом пытался импульс какой-т... Apr 22 2008, 15:33 wasp Цитата(rezident @ Apr 22 2008, 19:33) Вид... Apr 22 2008, 15:46  tazik Цитата(wasp @ Apr 22 2008, 23:46) спасибо... Apr 22 2008, 16:02   wasp Цитата(tazik @ Apr 22 2008, 20:02) Синтак... Apr 22 2008, 16:08   2b|!2b?.. Цитата(tazik @ Apr 22 2008, 20:02) Синтак... Apr 28 2008, 07:12 arttab а nIRQ должны быть объявлены как изменяемые из вне... Apr 22 2008, 23:46 wasp в продолжение темы...
прошил и подключил PIC16F676... Apr 25 2008, 19:07 tazik Цитата(wasp @ Apr 26 2008, 03:07) в продо... Apr 26 2008, 08:03  wasp Цитата(tazik @ Apr 26 2008, 12:03) Сам не... Apr 28 2008, 06:18   tazik Цитата(wasp @ Apr 28 2008, 14:18) Но не с... Apr 28 2008, 17:20    wasp Цитата(tazik @ Apr 28 2008, 21:20) Микрос... Apr 28 2008, 18:38     tazik Цитата(wasp @ Apr 29 2008, 02:38) из нее ... Apr 28 2008, 18:57      wasp Цитата(tazik @ Apr 28 2008, 22:57) Давайт... Apr 28 2008, 19:19 vank Привет!
И мне интересует этая програма. Я поку... Apr 26 2008, 06:59 vank Извините, на моя просба никто не можеть помочь? Apr 30 2008, 04:47 tazik Цитата(vank @ Apr 30 2008, 12:47) Извинит... May 1 2008, 09:25  vank Цитата(tazik @ May 1 2008, 13:25) А почем... May 1 2008, 12:20   tazik Цитата(vank @ May 1 2008, 20:20) Но мне н... May 1 2008, 12:24 wasp поставил тип переменной CMD "unsigned long in... May 1 2008, 16:04 wasp никак не получается инициализировать RFM02.
по пре... May 2 2008, 08:50 Different Вот куски кода для модулей HopeRF с немецких сайто... May 22 2008, 12:13 SashaGubov а эти модули от 5 вольт можно питать? Sep 12 2008, 10:45
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|