мда, до 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;
}