Здравствуйте! У меня собран приёмник на базе rfm23bp и Atmega128. И с ним у меня проблемы. Я делаю новый приёмник для стандартной системы.
Никак не могу понять, почему устройство пропускает сигналы или вообще не видит передатчики. Передатчиков у меня 5 шт, из них один пульт, с ними проблем нету. Такое впечатление, что либо антенна плохо принимает (то есть сигнал каким-то образом не читается), либо nIRQ не хочет срабатывать. В каком-то определённом положении в пространстве приёмник читает передатчики, правда иногда пропускает (10/1), а в других положениях может вообще не видеть, закономерность повторяется (водил по кругу рядом с антенной приёмника). Пробовал подпаивать разной длины проводки к входу антенны, та же картина. Без антенны модуль вообще не видит передатчик на любых расстояниях. Земля антенны не подключена к общей земле модуля. Всё экранировал (обмотал фольгой и подключил к общей земле). Варьировал настройки, убирал sleep mode - не помогло. По прошивке всё вроде работает правильно, иначе бы он не читал подряд в определённых положениях. Читает и пишет регистры в буфер правильно. Питание менял с 5В до 3.15, не помогло. Менял ёмкость кондеев и тд... Пробовал вообще после каждого приёма проводить инициализацию по новой, но он и первый сигнал бывает не видит. Помогите своими догадками. Уже вторую неделю мучаюсь.
Можно, конечно, переделать плату, привязать spi через резисторы к питанию, развести нормальную антенну прямо на плате, как в оригинале, но это уже в последнюю очередь буду пробовать.
Часть кода, что относится к rfm23bp:
Код:
Chip type : ATmega128
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 1024
*******************************************************/
#include <mega128.h>
// Alphanumeric LCD functions
#include <alcd.h>
#include <io.h>
#include <delay.h>
#include <stdint.h>
#include <rfm22b-23b_registers.h>
#include <stdio.h>
#define uint8_t unsigned int
unsigned char buffer[100];
uint8_t bufferReg[100];
uint8_t bufferRead[PKTSIZE];
#define nIRQ PIND.1
#define nSEL PORTD.4
#define nSCK PORTD.5
#define nSDI PORTD.3
#define nSDO PIND.2
#define sbi(var, mask) ((var) |= (uint8_t)(1 << mask))
#define cbi(var, mask) ((var) &= (uint8_t)~(1 << mask))
#define SH PORTB.6
#define ST PORTB.5
#define DS PORTB.7
void SPI_WRITE(uint8_t Addr, uint8_t data)
{
unsigned char i=0;
Addr=Addr|0x80; // Старший бит в адресе дб равен 1!!!
nSEL=0;
nSDI=0;
nSCK=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
for (i=0; i<8; i++)
{
nSDI=(data>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
nSEL=1;
nSDI=0;
delay_us(30);
}
uint8_t SPI_READ(uint8_t Addr)
{
unsigned char i=0;
uint8_t data=0;
// Старший бит в адресе дб равен 0!!!
Addr=Addr&0x7F;
nSEL=0;
nSDI=0;
nSCK=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
for (i=0; i<8; i++)
{
nSCK=1;
delay_us(30);
data=data<<1;
data|=(nSDO);
nSCK=0;
delay_us(20);
} ;
nSEL=1;
nSDI=0;
delay_us(30); // выборка чипа
return data;
}
void RFM22B_rxMode(void)
{
SPI_WRITE(RFM22B_REGISTER_07_OPERATING_FUNCTION_CONTROL_1, (0x01 | 0x40)); // to ready mode
SPI_READ(RFM22B_REGISTER_03_INTERRUPT_STATUS_1); // read interrupt vector
SPI_READ(RFM22B_REGISTER_04_INTERRUPT_STATUS_2); // read interrupt vector
SPI_WRITE(RFM22B_REGISTER_7E_RX_FIFO_CONTROL, PKTSIZE); // set RX FIFO almost full threshold
SPI_WRITE(RFM22B_REGISTER_08_OPERATING_FUNCTION_CONTROL_2, 0x03); // clear contents of FIFO - reset FIFO
SPI_WRITE(RFM22B_REGISTER_08_OPERATING_FUNCTION_CONTROL_2, 0x00); // clear contents of FIFO - clear FIFO
SPI_WRITE(RFM22B_REGISTER_07_OPERATING_FUNCTION_CONTROL_1, (5 | 0x40)); // RX on, Ready mode
SPI_WRITE(RFM22B_REGISTER_05_INTERRUPT_ENABLE_1, 2); // Valid Packet Received interrupt enabled
}
void SPI_RFM_INIT (void)
{
SPI_WRITE(0x05, 0x00);
//4
SPI_WRITE(0x06, 0x00);
//5
SPI_WRITE(0x07, 0x01);
//6
SPI_WRITE(0x09, 0x7F);
//7
SPI_WRITE(0x0A, 0x05);
//8
SPI_WRITE(0x0B, 0xF4);
//9
SPI_WRITE(0x0C, 0xFB);
//10
SPI_WRITE(0x0D, 0xF2);
//11
SPI_WRITE(0x0E, 0x00);
//12
SPI_WRITE(0x30, 0x8C);
//13
SPI_WRITE(0x32, 0xFF);
//14
SPI_WRITE(0x33, 0x4E);
//15
SPI_WRITE(0x34, 0x0A);
//16
SPI_WRITE(0x35, 0x14);
//17
SPI_WRITE(0x36, 0xF0);
//18
SPI_WRITE(0x37, 0xA2);
//19
SPI_WRITE(0x38, 0x00);
//20
SPI_WRITE(0x39, 0x13);
//21
SPI_WRITE(0x3A, 0xFF);
//22
SPI_WRITE(0x3B, 0xFF);
//23
SPI_WRITE(0x3C, 0xFF);
//24
SPI_WRITE(0x3D, 0xFF);
//25
SPI_WRITE(0x3E, 0x04);
//26
SPI_WRITE(0x3F, 0x12);
//27
SPI_WRITE(0x40, 0x34);
//28
SPI_WRITE(0x41, 0x56);
//29
SPI_WRITE(0x42, 0x78);
//30
SPI_WRITE(0x43, 0xFF);
//31
SPI_WRITE(0x44, 0xFF);
//32
SPI_WRITE(0x45, 0xFF);
//33
SPI_WRITE(0x46, 0xFF);
//34
SPI_WRITE(0x4B, 0x04);
//35
SPI_WRITE(0x79, 0x00);
//36
SPI_WRITE(0x7a, 0x00);
//37
SPI_WRITE(0x73, 0x00);
//38
SPI_WRITE(0x74, 0x00);
//39
SPI_WRITE(0x75, 0x73);
//40
SPI_WRITE(0x76, 0x00);
//41
SPI_WRITE(0x77, 0x00);
//42
SPI_WRITE(0x6E, 0x19);
//43
SPI_WRITE(0x6F, 0x9A);
//44
SPI_WRITE(0x70, 0x0C);
//45
SPI_WRITE(0x58, 0xC0);
//46
SPI_WRITE(0x72, 0x50);
//47
SPI_WRITE(0x71, 0x23);
//48
SPI_WRITE(0x1C, 0x9A);
//49
SPI_WRITE(0x20, 0x3C);
//50
SPI_WRITE(0x21, 0x02);
//51
SPI_WRITE(0x22, 0x22);
//52
SPI_WRITE(0x23, 0x22);
//53
SPI_WRITE(0x24, 0x07);
//54
SPI_WRITE(0x25, 0xFF);
//55
SPI_WRITE(0x1D, 0x40);
//56
SPI_WRITE(0x1E, 0x0A);
//57
SPI_WRITE(0x2A, 0x48);
//58
SPI_WRITE(0x1F, 0x03);
//59
SPI_WRITE(0x69, 0x60);
RFM22B_rxMode();
}
//Сброс флаги прерывания
void SPI_RFM_INTREAD(void)
{
SPI_WRITE(0x07, 01); //
SPI_READ(0x03); //read the Interrupt Status1 register
SPI_READ(0x04);
SPI_WRITE(0x07, 05);
}
void SPI_RFM_INTREAD2(void)
{
unsigned char i=0;
uint8_t chksum, var;
for(i=0; i<PKTSIZE; i++){
var = SPI_READ(0x7F);
bufferRead[i] = var;
bufferRead[i+1] = '\0';
}
// Check that the checksum matches up:
chksum = 0;
for(i=0; i<(PKTSIZE-1); i++)
chksum += bufferRead[i];
// If checksum is good, print out what was received into the terminal
if(chksum == bufferRead[PKTSIZE-1])
{
SPI_RFM_INTREAD();
}
// otherwise reset and start listening again
else
{
RFM22B_rxMode();
}
}
void test_RFM23_2(void)
{
uint8_t reg = 0x05;
uint8_t value = 0xEE;
uint8_t val_new = 0x00;
uint8_t val_orig = 0x00;
// read register
unsigned char i = 0;
val_orig = SPI_READ(reg);
lcd_clear();
lcd_gotoxy(0, 0);
lcd_putsf("Origin -");
lcd_gotoxy(1, 1);
sprintf(buffer, "%d", val_orig);
lcd_puts(buffer);
delay_ms(1000);
// write register
SPI_WRITE(reg, value);
// read register
val_new = SPI_READ(reg);
lcd_clear();
lcd_gotoxy(0, 0);
lcd_putsf("New - ");
lcd_gotoxy(0, 1);
sprintf(buffer, "%d", val_new);
lcd_puts(buffer);
delay_ms(1000);
// set orig register value
SPI_WRITE(reg, val_orig);
// test if the written register value
// has been read
for(i=0; i<56; i++){
if(bufferReg[i]!=bufferRegConst[i]){
value = 0;
LCD_print_two_values(i, bufferReg[i]);
while(PINF.0 == 0){};
while(PINF.0 != 0){};
}
}
if (val_new == value) {
lcd_clear();
lcd_gotoxy(0, 0);
lcd_putsf("test goo");
lcd_gotoxy(0, 1);
lcd_putsf("d!");
} else {
lcd_clear();
lcd_gotoxy(0, 0);
lcd_putsf("test err");
lcd_gotoxy(0, 1);
lcd_putsf("or!");
}
delay_ms(1000);
}
void SPI_RFM_INIT_2 (void)
{
bufferReg[0] = SPI_READ(0x06); // interrupt all enable
bufferReg[1] = 0x00; // to ready mode
bufferReg[2] = SPI_READ(0x09); // cap = 12.5pf
bufferReg[3] = SPI_READ(0x0A); //clk output is 2MHz
bufferReg[4] = SPI_READ(0x0B); // GPIO Configuration 0.
bufferReg[5] = SPI_READ(0x0C); // GPIO Configuration 1.
bufferReg[6] = SPI_READ(0x0D); // GPIO2 for MCLK output
bufferReg[7] = SPI_READ(0x0E); //GPIO port use default value
bufferReg[8] = SPI_READ(0x30); // NO ADC used
bufferReg[9] = SPI_READ(0x32); //no adc used
bufferReg[10] = SPI_READ(0x33); // no temperature sensor used
bufferReg[11] = SPI_READ(0x34); // no temperature sensor used
bufferReg[12] = SPI_READ(0x35); // no mancheset code, no data whiting, data rate < 30Kbps
bufferReg[13] = SPI_READ(0x36); // IF filter bandwidth
bufferReg[14] = SPI_READ(0x37); // AFC LOOP
bufferReg[15] = SPI_READ(0x38); //AFC timing
bufferReg[16] = SPI_READ(0x39); //clock recovery
bufferReg[17] = SPI_READ(0x3A); //clock recovery
bufferReg[18] = SPI_READ(0x3B); //clock recovery
bufferReg[19] = SPI_READ(0x3C); //clock recovery
bufferReg[20] = SPI_READ(0x3D); //clock recovery timing
bufferReg[21] = SPI_READ(0x3E); //clock recovery timing
bufferReg[22] = SPI_READ(0x3F); // Tx data rate 1
bufferReg[23] = SPI_READ(0x40); // Tx data rate 0
bufferReg[24] = SPI_READ(0x41); // data access control
bufferReg[25] = SPI_READ(0x42); // header control
bufferReg[26] = SPI_READ(0x43);// // header 3, 2, 1,0 used for head length, fixed packet length, synchronize word length 3, 2,
bufferReg[27] = SPI_READ(0x44); // 64 nibble = 32byte preamble
bufferReg[28] = SPI_READ(0x45); //0x35 need to detect 20bit preamble
bufferReg[29] = SPI_READ(0x46); // synchronize word
bufferReg[30] = SPI_READ(0x4B);
bufferReg[31] = SPI_READ(0x79);
bufferReg[32] = SPI_READ(0x7A);
bufferReg[33] = SPI_READ(0x73);
bufferReg[34] = SPI_READ(0x74);
bufferReg[35] = SPI_READ(0x75);
bufferReg[36] = SPI_READ(0x76);
bufferReg[37] = SPI_READ(0x77); // total tx 1 byte
bufferReg[38] = SPI_READ(0x6E);
bufferReg[39] = SPI_READ(0x6F);
bufferReg[40] = SPI_READ(0x70);
bufferReg[41] = SPI_READ(0x58);
bufferReg[42] = SPI_READ(0x72); // all the bit to be checked
bufferReg[43] = SPI_READ(0x71); // all the bit to be checked
bufferReg[44] = SPI_READ(0x1C); // all the bit to be checked
bufferReg[45] = SPI_READ(0x20); // all the bit to be checked
bufferReg[46] = SPI_READ(0x21); // tx power to max
bufferReg[47] = SPI_READ(0x22); // no frequency hopping
bufferReg[48] = SPI_READ(0x23); // no frequency hopping
bufferReg[49] = SPI_READ(0x24); // Gfsk, fd[8] =0, no invert for Tx/Rx data, fifo mode, txclk -->gpio
bufferReg[50] = SPI_READ(0x25); // frequency deviation setting to 45k = 72*625
bufferReg[51] = SPI_READ(0x1D); // no frequency offset
bufferReg[52] = SPI_READ(0x1E); // no frequency offset
bufferReg[53] = SPI_READ(0x2A); // frequency set to 434MHz
bufferReg[54] = SPI_READ(0x1F);// frequency set to 434MHz
bufferReg[55] = SPI_READ(0x69); // fifo reset
}
void Signal(unsigned char SS){
if(SS == 1){
PORTB.4 = 1;
perm = 1;
// Timer 1 start
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
}
else {
PORTB.4 = 0;
perm = 0;
}
}
void DOWORKER(){
switch(bufferRead[0]){
case 4: { //Red cut
if(!endGame && !TimON){
startGame = 1;
if(PlusMinus)
RedCounter = RedCounter+RedKnifeCut;
else
RedCounter = RedCounter-RedKnifeCut;
}
if(!endGame && TimON){
// Разрешаем прерывание
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (1<<TOIE0);
startGame = 1;
if(PlusMinus && TimCount < TimerCounter)
RedCounter = RedCounter+RedKnifeCut;
if(!PlusMinus && TimCount < TimerCounter)
RedCounter = RedCounter-RedKnifeCut;
}
} break;
case 3: { //Red shot
if(!endGame && !TimON){
startGame = 1;
if(PlusMinus)
RedCounter = RedCounter+RedKnifeShot;
else
RedCounter = RedCounter-RedKnifeShot;
}
if(!endGame && TimON){
// Разрешаем прерывание
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (1<<TOIE0);
startGame = 1;
if(PlusMinus && TimCount < TimerCounter)
RedCounter = RedCounter+RedKnifeShot;
if(!PlusMinus && TimCount < TimerCounter)
RedCounter = RedCounter-RedKnifeShot;
}
} break;
case 8: { //Green cut
if(!endGame && !TimON){
startGame = 1;
if(PlusMinus)
GreenCounter = GreenCounter+GreenKnifeCut;
else
GreenCounter = GreenCounter-GreenKnifeCut;
}
if(!endGame && TimON){
// Разрешаем прерывание
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (1<<TOIE0);
startGame = 1;
if(PlusMinus && TimCount < TimerCounter)
GreenCounter = GreenCounter+GreenKnifeCut;
if(!PlusMinus && TimCount < TimerCounter)
GreenCounter = GreenCounter-GreenKnifeCut;
}
} break;
case 7: { //Green shot
if(!endGame && !TimON){
startGame = 1;
if(PlusMinus)
GreenCounter = GreenCounter+GreenKnifeShot;
else
GreenCounter = GreenCounter-GreenKnifeShot;
}
if(!endGame && TimON){
// Разрешаем прерывание
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (1<<TOIE0);
startGame = 1;
if(PlusMinus && TimCount < TimerCounter)
GreenCounter = GreenCounter+GreenKnifeShot;
if(!PlusMinus && TimCount < TimerCounter)
GreenCounter = GreenCounter-GreenKnifeShot;
}
} break;
case 12:{
RedCounter++;
startGame = 1;
} break;
case 13:{
RedCounter--;
startGame = 1;
} break;
case 11:{
RedWarnings++;
startGame = 1;
} break;
case 9:{
GreenCounter++;
startGame = 1;
} break;
case 10:{
GreenCounter--;
startGame = 1;
} break;
case 14:{
GreenWarnings++;
startGame = 1;
} break;
case 15:{
if(TimCount == 0){
GreenWarnings = 0;
RedWarnings = 0;
if(startGame){
GreenCounter = GreenCounterFirst;
RedCounter = RedCounterFirst;
startGame = 0;
endGame = 0;
}
else
{
GreenCounterFirst+=5;
RedCounterFirst+=5;
if(GreenCounterFirst>50){
GreenCounterFirst=0;
RedCounterFirst=0;
}
if(GreenCounterFirst>0)
PlusMinus = 0;
if(GreenCounterFirst == 0)
PlusMinus = 1;
GreenCounter = GreenCounterFirst;
RedCounter = RedCounterFirst;
}
}
else
TimCount = 0;
} break;
default: { //Red cut
goto ERROR;
} break;
}
if(GreenCounter < 0)
GreenCounter = 0;
if(GreenCounter > 99)
GreenCounter = 99;
if(RedCounter < 0)
RedCounter = 0;
if(RedCounter > 99)
RedCounter = 99;
if(RedWarnings > 2)
RedWarnings = 2;
if(GreenWarnings > 2)
GreenWarnings = 2;
if(startGame && !PlusMinus)
if(GreenCounter < 1 || RedCounter < 1){
Signal(1);
endGame = 1;
delay_ms(500);
}
//Распечатываю счётчики
LoadValuesToLED(GreenCounter, RedCounter);
LoadWarningsToLED(GreenWarnings, RedWarnings);
LCD_print_two_values(GreenCounter, RedCounter);
goto OUT;
ERROR:
LCD_print_valueI("Error", bufferRead[0]);
OUT:
}
void SPI_RFM_INTREAD3(void)
{
if (!nIRQ)
{
LCD_print_string("Read", "command");
SPI_RFM_INTREAD2();
DOWORKER();
Signal(1); //звуковой сигнал
}
}
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer1 value
TCNT1H=0xFCE0 >> 8;
TCNT1L=0xFCE0 & 0xff;
// Place your code here
SPI_RFM_INTREAD3();
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=1 Bit6=1 Bit5=1 Bit4=1 Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(1<<PORTA7) | (1<<PORTA6) | (1<<PORTA5) | (1<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// Port B initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=in Bit2=out Bit1=Out Bit0=Out
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=T Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRC=(1<<DDC7) | (1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=1 Bit2=0 Bit1=0 Bit0=0
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (1<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=In Bit1=in Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=0 Bit4=0 Bit3=0 Bit2=T Bit1=0 Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Port E initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=out Bit1=out Bit0=in
DDRE=(0<<DDE7) | (0<<DDE6) | (1<<DDE5) | (1<<DDE4) | (1<<DDE3) | (1<<DDE2) | (1<<DDE1) | (0<<DDE0);
// State: Bit7=T Bit6=T Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=T Bit0=0
PORTE=(0<<PORTE7) | (0<<PORTE6) | (0<<PORTE5) | (0<<PORTE4) | (0<<PORTE3) | (0<<PORTE2) | (0<<PORTE1) | (0<<PORTE0);
// Port F initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRF=(0<<DDF7) | (0<<DDF6) | (0<<DDF5) | (0<<DDF4) | (0<<DDF3) | (0<<DDF2) | (0<<DDF1) | (0<<DDF0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTF=(0<<PORTF7) | (0<<PORTF6) | (0<<PORTF5) | (0<<PORTF4) | (0<<PORTF3) | (0<<PORTF2) | (0<<PORTF1) | (0<<PORTF0);
// Port G initialization
// Function: Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRG=(0<<DDG4) | (0<<DDG3) | (0<<DDG2) | (0<<DDG1) | (0<<DDG0);
// State: Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTG=(0<<PORTG4) | (0<<PORTG3) | (0<<PORTG2) | (0<<PORTG1) | (0<<PORTG0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
// Timer Period: 1 ms
ASSR=0<<AS0;
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x06;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// OC1C output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 1 us
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<COM1C1) | (0<<COM1C0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0xFF;
TCNT1L=0xF8;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
TCCR2=(0<<WGM20) | (0<<COM21) | (0<<COM20) | (0<<WGM21) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer3 Stopped
// Mode: Normal top=0xFFFF
// OC3A output: Disconnected
// OC3B output: Disconnected
// OC3C output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=(0<<COM3A1) | (0<<COM3A0) | (0<<COM3B1) | (0<<COM3B0) | (0<<COM3C1) | (0<<COM3C0) | (0<<WGM31) | (0<<WGM30);
TCCR3B=(0<<ICNC3) | (0<<ICES3) | (0<<WGM33) | (0<<WGM32) | (0<<CS32) | (0<<CS31) | (0<<CS30);
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
ETIMSK=(0<<TICIE3) | (0<<OCIE3A) | (0<<OCIE3B) | (0<<TOIE3) | (0<<OCIE3C) | (0<<OCIE1C);
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=(0<<ISC31) | (0<<ISC30) | (0<<ISC21) | (0<<ISC20) | (0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EICRB=(0<<ISC71) | (0<<ISC70) | (0<<ISC61) | (0<<ISC60) | (0<<ISC51) | (0<<ISC50) | (0<<ISC41) | (0<<ISC40);
EIMSK=(0<<INT7) | (0<<INT6) | (0<<INT5) | (0<<INT4) | (0<<INT3) | (0<<INT2) | (0<<INT1) | (0<<INT0);
// USART0 initialization
// USART0 disabled
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
// USART1 initialization
// USART1 disabled
UCSR1B=(0<<RXCIE1) | (0<<TXCIE1) | (0<<UDRIE1) | (0<<RXEN1) | (0<<TXEN1) | (0<<UCSZ12) | (0<<RXB81) | (0<<TXB81);
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);
// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(20);
// Global enable interrupts
#asm("sei")
SPI_RFM_INIT();
SPI_RFM_INIT_2();
LoadValuesToLED(12, 19);
//SPI_RFM_INTREAD();
test_RFM23_2();
LoadValuesToLED(0, 0);
Signal(1);
LCD_print_string("Waiting", "command");
while (1)
{
if(perm){
TimerSignal++;
}
if(PINF.0 == 1){
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
lcd_menu_input(lcd_menu_swap());
LCD_print_string("Waiting", "command");
Signal(1); //звуковой сигнал
}
if(TimerSignal > 30000){
Signal(0);
TimerSignal=0;
}
};
}