wasp 0 29 апреля, 2008 Опубликовано 29 апреля, 2008 · Жалоба мда, до 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 120 29 апреля, 2008 Опубликовано 29 апреля, 2008 · Жалоба вот код программки, может кому что в глаза бросится, буду премного благодаренСкачал описание модуля по ссылке из первого поста. Не нашел в нем команд 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, посмотрите, что творится на ногах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vank 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба Извините, на моя просба никто не можеть помочь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tazik 0 1 мая, 2008 Опубликовано 1 мая, 2008 (изменено) · Жалоба Извините, на моя просба никто не можеть помочь? А почему бы Вам самим не скомпилировать пример? Никаких трудностей при этом не было. Да и Вам должно быть удобней, чем лазить по asm+C тексту В файлах код для передатчика с разными уровнями оптимизации для AVR. vank.rar Может быть, я чего-то просто-напросто не понимаю? Изменено 1 мая, 2008 пользователем tazik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wasp 0 1 мая, 2008 Опубликовано 1 мая, 2008 · Жалоба Скачал описание модуля по ссылке из первого поста. Не нашел в нем команд 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vank 0 1 мая, 2008 Опубликовано 1 мая, 2008 · Жалоба А почему бы Вам самим не скомпилировать пример? Никаких трудностей при этом не было. Да и Вам должно быть удобней, чем лазить по asm+C тексту В файлах код для передатчика с разными уровнями оптимизации для AVR. Спасибо "tazik"! Но мне необходим код для PIC-a. А я не знаю C и поетому не могу скомпилировать пример. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tazik 0 1 мая, 2008 Опубликовано 1 мая, 2008 · Жалоба Но мне необходим код для PIC-a. А я не знаю C и поетому не могу скомпилировать пример. Пожалуйста, только для PIC`а у меня ничего нет (. Для AVR`а пример скомпилировался с 1-го раза без всяких замечаний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wasp 0 1 мая, 2008 Опубликовано 1 мая, 2008 · Жалоба поставил тип переменной CMD "unsigned long int" вместо "unsigned int" - все пошло. я озадачен :05: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wasp 0 2 мая, 2008 Опубликовано 2 мая, 2008 · Жалоба никак не получается инициализировать RFM02. по прежнему после инициализации нет импульсов на выходе nIRQ и не меняется частота CLK (настраиваемый выход клоксигнала) хотя когда гоняю в цикле команду CC00 (read status registor) выдает такой пакет (значит команды в принципе проходят) : а что это значит? в даташите об этом только это: помогите советом. :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
different 0 22 мая, 2008 Опубликовано 22 мая, 2008 · Жалоба Вот куски кода для модулей HopeRF с немецких сайтов. Может кому чего в них пригодится. Ссылки дали сами китайцы... :a14: rfm01.zip rfm02.zip rfm12.zip RFM12_RX_TX.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SashaGubov 0 12 сентября, 2008 Опубликовано 12 сентября, 2008 · Жалоба а эти модули от 5 вольт можно питать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться