Код
/*****************************************************
Chip type : ATmega8535
Program type : Application
Clock frequency : 7,372800 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
*****************************************************/
#include <mega8535.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x18;PORTB
.equ __w1_bit=0
#endasm
#include <1wire.h>
#include <delay.h> // стандартная функция задержек
#include <stdio.h> // Standard Input/Output functions
#include <string.h>
#define LED PORTB.1 // выход на индикатор чтения
#define BEEP PORTB.2 // выход BEEP
#define ALARM PORTB.3 // выход ALARM
#define MAX_DEVICES 1 //определяем максимальное количество устройств на шине
unsigned char rom_code[MAX_DEVICES][9]; //выделяет память (9 бит умноженное на кол-во устройств)
unsigned char my_code_1[9]={0x01,0x1E,0x06,0xCA,0x0C,0x00,0x00,0x70,0x01};
unsigned char my_code_2[9]={0x01,0xFD,0xE2,0xCC,0x0C,0x00,0x00,0xCC,0x01};
//функция инициализации микроконтроллера
void initialization(void)
{
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x0F;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// USART initialization
// USART Baud rate: 115200
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
UBRRL=0x03;
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x03;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// 1 Wire Bus initialization
w1_init();
#asm("wdr")
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
#pragma optsize-
WDTCR=0x1F;
WDTCR=0x0F;
#asm("wdr")
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
}
void test_key(void) //проверка кода ключа
{
if(memcmp(rom_code,my_code_1,9)==0)
printf("CodeOK\n\r");
else
printf("CodeError\n\r");
}
//функция звукового сигнала BEEP
void beep(void)
{
unsigned char a=0;
unsigned char b=0;
for (b=0;b<2;b++)
{
for(a=0;a<150;a++)
{
BEEP=1;
delay_us(377);
BEEP=0;
delay_us(377);
};
delay_ms(100);
};
}
//oбработка прерывания по переполнению таймера TIMER1
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
unsigned char i,j,devices;
TCCR1B=0x00; //останавливаем таймер TIMER1
LED=1; //моргаем светодиодом
delay_ms(10);
LED=0;
//ищем устройство командой 0xf0, в rom_codes ложится 9 байт (family-1,serial-6,CRC8-1,некоторые устройства возвращают 9 байт)
devices=w1_search(0xf0,rom_code);
printf("%-u DEVICE DETECTED\r",devices); //вывод через UART количества найденных устройств
for (j=0;j<9;j++) //задаем, какую часть кода выводить
{
printf("0x%02X ",rom_code[i][j]);
}
printf("\r");
test_key();
TCCR1B=0x03; //запускаем таймер TIMER1
}
void main(void)
{
initialization();
beep();
#asm("sei") // Разрешение прерываний
TCCR1B=0x03; // запуск счетчика TIMER1
{
begin:
#asm("wdr")
goto begin;
}
}
Chip type : ATmega8535
Program type : Application
Clock frequency : 7,372800 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
*****************************************************/
#include <mega8535.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x18;PORTB
.equ __w1_bit=0
#endasm
#include <1wire.h>
#include <delay.h> // стандартная функция задержек
#include <stdio.h> // Standard Input/Output functions
#include <string.h>
#define LED PORTB.1 // выход на индикатор чтения
#define BEEP PORTB.2 // выход BEEP
#define ALARM PORTB.3 // выход ALARM
#define MAX_DEVICES 1 //определяем максимальное количество устройств на шине
unsigned char rom_code[MAX_DEVICES][9]; //выделяет память (9 бит умноженное на кол-во устройств)
unsigned char my_code_1[9]={0x01,0x1E,0x06,0xCA,0x0C,0x00,0x00,0x70,0x01};
unsigned char my_code_2[9]={0x01,0xFD,0xE2,0xCC,0x0C,0x00,0x00,0xCC,0x01};
//функция инициализации микроконтроллера
void initialization(void)
{
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x0F;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// USART initialization
// USART Baud rate: 115200
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
UBRRL=0x03;
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x03;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// 1 Wire Bus initialization
w1_init();
#asm("wdr")
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
#pragma optsize-
WDTCR=0x1F;
WDTCR=0x0F;
#asm("wdr")
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
}
void test_key(void) //проверка кода ключа
{
if(memcmp(rom_code,my_code_1,9)==0)
printf("CodeOK\n\r");
else
printf("CodeError\n\r");
}
//функция звукового сигнала BEEP
void beep(void)
{
unsigned char a=0;
unsigned char b=0;
for (b=0;b<2;b++)
{
for(a=0;a<150;a++)
{
BEEP=1;
delay_us(377);
BEEP=0;
delay_us(377);
};
delay_ms(100);
};
}
//oбработка прерывания по переполнению таймера TIMER1
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
unsigned char i,j,devices;
TCCR1B=0x00; //останавливаем таймер TIMER1
LED=1; //моргаем светодиодом
delay_ms(10);
LED=0;
//ищем устройство командой 0xf0, в rom_codes ложится 9 байт (family-1,serial-6,CRC8-1,некоторые устройства возвращают 9 байт)
devices=w1_search(0xf0,rom_code);
printf("%-u DEVICE DETECTED\r",devices); //вывод через UART количества найденных устройств
for (j=0;j<9;j++) //задаем, какую часть кода выводить
{
printf("0x%02X ",rom_code[i][j]);
}
printf("\r");
test_key();
TCCR1B=0x03; //запускаем таймер TIMER1
}
void main(void)
{
initialization();
beep();
#asm("sei") // Разрешение прерываний
TCCR1B=0x03; // запуск счетчика TIMER1
{
begin:
#asm("wdr")
goto begin;
}
}
Он подразумевает, что считывается DS1990 каждые ~0,5с, и выводит на СОМ следующее:
1 DEVICE DETECTED
0x01,0x1E,0x06,0xCA,0x0C,0x00,0x00,0x70,0x01 //номер ключа
CodeOK
Вот теперь вопрос, иногда вместо реального номера ключа пишет:
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
хотя устройство на шине определяется и выводится Code OK.
иногда вместо нулей выводится неправильный код, сразу после включения (мусор в ОЗУ?))
Иногда работает как часы...
Вчера пару часов пытался выяснить закономерность, неполучилось.
Подразумеваю, что проблема в железе, сегодня буду бится дальше.
P.S. Mega шилась раз 50 - 100, может здесь засада?