[an error occurred while processing this directive]
У меня несколько вопросов. Прочитайте, помогите, пожалуйста
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Елена 14 июня 2006 г. 20:01

Уважаемые специалисти. Вот написала программу, не полностью ещё, но начало есть. Она сначала проверяет, есть ли устройства, есл инет, то требует подклбчить Мастер-Ключ. Запоминает его. Мастер отключается, требует подсоединить Шину с датчиками (всеми, которые будут использоваться), Ждёт, пока не будут нажаты две кнопки клавиатуры, потом начинается основной цикл, в котором выводится температура датчиков (всех, которые есть!). Если потом будет подсоединён ещё датчик, то система сравнит его с Мастер-Ключом, и если успешно, то потом что-то сделает(пока только выводит надпись), если будет убран датчик, поднимится тревога.
Вот у меня такие вопросы. Нужно же как-то чтобы датчики выдавали температуру места, где они стоят (то есть Зал-20 градусов, кухня 25 градусов), а вот как это в программе запрограмировать - не знаю. И ещё как выводить температуру только датчиков 1820 и 18В20, а то на датчиках DS1993 выводится температура -9999.
Вообще система будет пожарную охрану осуществлять, освещени измерять (залез вор с фонариком) и влажность мерить(чтобы никто сверху не затопил, или кран не остался включённым). Как пожарные датчики, датчики освещённости и датчики влажности сделать на основе MicroLAN кто-нибудь знает?
Привожу код программы и постараюсь приложить рисунок системы.
Пожалуйста, помогите, кто чем может. Может какие-нибудь идеи интересные у кого-то появятся, может огрехи кто-нибудь найдёт в программе и в системе вообщем (как например только сегодня сталкнулась с проблеммой о локализации датчиков и о их запоминании)

/* Multipoint thermometer with LCD display
using the Dallas Semiconductor DS1820/18S20
1 Wire bus temperature sensors

CodeVisionAVR C Compiler
(C) 2000-2003 HP InfoTech S.R.L.
www.hpinfotech.ro

Chip: AT90S8515
Memory Model: SMALL
Data Stack Size: 128 bytes

THE AT90S8515 CLOCK FREQUENCY MUST BE 3.6864 MHz

The DS1820/18S20 sensors are connected to
bit 6 of PORTA of the AT90S8515 as follows:

[DS1820/18S20] [STK500 PORTA HEADER]
1 GND - 9 GND
2 DQ - 7 PA6
3 VDD - 10 +5V

All the temperature sensors must be connected
in parallel

AN 4.7k PULLUP RESISTOR MUST BE CONNECTED
BETWEEN DQ (PA6) AND +5V !
*/
#asm
.equ __w1_port=0x1b
.equ __w1_bit=6
#endasm

/* Use an 2x16 alphanumeric LCD connected
to PORTC as follows:

[LCD] [STK500 PORTC HEADER]
1 GND- 9 GND
2 +5V- 10 VCC
3 VLC- LCD contrast control voltage 0..1V
4 RS - 1 PC0
5 RD - 2 PC1
6 EN - 3 PC2
11 D4 - 5 PC4
12 D5 - 6 PC5
13 D6 - 7 PC6
14 D7 - 8 PC7
*/

#asm
.equ __lcd_port=0x15
#endasm

#include // LCD driver routines
#include
#include
#include
#include <90s8515.h>

char lcd_buffer[33];


/* maximum number of DS1820/DS18S20 connected to the 1 Wire bus */
#define MAX_DEVICES 8

/* Dallas Cmd. Codes */
#define DS_SRAROM 0xEC /* Search alarm ROM */
#define DS_SRROM 0xF0 /* Search ROM */
#define DS_RDROM 0x33 /* Read ROM */
#define DS_SKROM 0xcc /* Skip ROM */
#define DS_MTROM 0x55 /* Match ROM */
#define DS_CONVT 0x44 /* Convert T */
#define DS_RDSPAD 0xbe /* Read Scratchpad */
#define DS_RDPSS 0xb4 /* Read Power Supply */
#define DS_RECE2 0xb8 /* Recall E2 */
#define DS_CHNAC 0xf5 /* Channel Access For DS2407 */
#define DS_RMCRC 0xa5 /* Read Memory with CRC */
#define DS_RDMEM 0xf0 /* Read Memory */
#define DS_WRSPAD 0x0f /* Write Scratchpad */
#define DS_CPSPAD 0x55 /* Copy Scratchpad */
#define DS_CLRMEM 0x3c /* Clear Memory */
#define DS_RMCNT 0xa5 /* Read Memory + Counter */

/* DS1820/DS18S20 devices ROM code storage area */
unsigned char rom_code[MAX_DEVICES,9];
unsigned char cod_mas[MAX_DEVICES,9];

main()
{
unsigned char i,j,devices;
int temp,all,a,cik,ec,no1;

lcd_init(16);
lcd_putsf("Diplom v1.1");
delay_ms(300);
lcd_clear();
devices=w1_search(DS_SRROM,rom_code);
if (!devices) //если устройств не обнаружено, вывести "Устройств не обнаружено"
{
sprintf(lcd_buffer,"No device detected",devices);
lcd_puts(lcd_buffer);
delay_ms(300);
}
else //если хоть одно устройство обнаружено, вывести количество устройств
{
sprintf(lcd_buffer,"%u device detected",devices);
lcd_puts(lcd_buffer);
delay_ms(300);
goto lb1; //перейти к основному циклу
}
if (!devices) //проверяет, если нет устройств, то после подключения первого, запомниьт его как мастера
{
lcd_clear();
sprintf(lcd_buffer,"Insert master-key");
lcd_puts(lcd_buffer);
}
while (!devices) devices=w1_search(DS_SRROM,rom_code); //пока нет датчиков, искать их, после этого завершить цикл
lcd_clear();
for (j=0;j<8;j++)
{
cod_mas[0,j]=rom_code[0,j];
}

sprintf(lcd_buffer,"Master-key saved!",devices);
lcd_puts(lcd_buffer);
delay_ms(300);
for (i=0;i {
sprintf(lcd_buffer,"Master-code is:",i+1);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(300);
lcd_clear();
for (j=0;j<8;j++)
{
sprintf(lcd_buffer,"%02X ",rom_code[i,j]);
lcd_puts(lcd_buffer);
if (j==3) lcd_gotoxy(0,1);
}
delay_ms(1000);
}
while (devices) //пока датчик присутствует, проверять наличие датчиков
{
devices=w1_search(DS_SRROM,rom_code);
sprintf(lcd_buffer,"Take out Master-key"); //после того, как номер мастера сохранён, его можно извлечь
lcd_clear();
lcd_puts(lcd_buffer);
}
lcd_clear();
sprintf(lcd_buffer,"Master-key is disconect!");
lcd_puts(lcd_buffer);
delay_ms(700);

lcd_clear();
sprintf(lcd_buffer,"Conect LAN and press 0&1 bits");
lcd_puts(lcd_buffer);

PORTD=0xff;
DDRD=0x00;

while(PIND.0 || PIND.1) //пока не нажаты одновременно первый и второй бит, не выходить из цикла
{
}
lb1:devices=w1_search(DS_SRROM,rom_code);
cik=devices;
lcd_clear();
sprintf(lcd_buffer,"LAN is connected"); //вывести "Lan conect"
lcd_puts(lcd_buffer);
delay_ms(300);

/* measure and display the temperature(s) */

//---------------------------бесконечный цикл--------------------------
while (1)
{
ec=0;
devices=w1_search(DS_SRROM,rom_code);
if (devices==cik)
{
for (i=0;i {
temp=ds1820_temperature_10(&rom_code[i,0]);
j='+';
if (temp<0)
{
j='-';
temp=-temp;
};
sprintf(lcd_buffer,"t%u=%c%i.%u\xdfC",++i,j,temp/10,temp%10);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(300);
}
}
if (devices>cik) //если появилось новое устройство, вывести надпись и его номер
{
lcd_clear();
sprintf(lcd_buffer,"New Device!");
lcd_puts(lcd_buffer);
delay_ms(300);
lcd_clear();

for (j=0;j<8;j++)
{
if (rom_code[devices-1,j]==cod_mas[0,j])
{
a=a+1;
}
}
if (a==8)
{
sprintf(lcd_buffer,"Access allowed!");
}
lcd_puts(lcd_buffer);
delay_ms(300);
a=0;
}

if (devices {
lcd_clear();
sprintf(lcd_buffer,"ALARM!");
lcd_puts(lcd_buffer);
delay_ms(300);
lcd_clear();
}
}
}

/* {
lcd_clear();
sprintf(lcd_buffer,"Cikl",); //вывести "Lan conect"
lcd_puts(lcd_buffer);
delay_ms(200);

//--------------сравнение ключа-------------------------
/*devices=w1_search(DS_SRROM,rom_code);
if ((rom_code[0,0]!=cod_mas[0,0])&&(rom_code[0,1]!=cod_mas[0,1]))
{
lcd_clear();
sprintf(lcd_buffer,"!!!!!!!!!!!!!!!",devices);
lcd_puts(lcd_buffer);
delay_ms(700);
}
*/
//----------------------------------------------
/* devices=w1_search(DS_SRROM,rom_code);
a=0;
for (i=0;i {
sprintf(lcd_buffer,"LOOK!");
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(300);
lcd_clear();
for (j=0;j<8;j++)
{
if (rom_code[i,j]==cod_mas[0,j])
{
a=a+1;
}
lcd_clear();
}
if (a!=7)
sprintf(lcd_buffer,"==7");
if (a!=6)
sprintf(lcd_buffer,"==6");
if (a!=8)
sprintf(lcd_buffer,"==8");
lcd_puts(lcd_buffer);
//if (j==3) lcd_gotoxy(0,1);
delay_ms(300);
//if (a>8)
}
//---------------------------------------------------

// for (i=0;i // {
sprintf(lcd_buffer,"masrer-code is:");
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(300);
lcd_clear();
for (j=0;j<8;j++)
{
//sprintf(lcd_buffer,"%02X ",cod_mas[3,j]);
sprintf(lcd_buffer,"%02X ",cod_mas[0,j]);
lcd_puts(lcd_buffer);
if (j==3) lcd_gotoxy(0,1);
}
delay_ms(1000);
// }

devices=w1_search(DS_SRROM,rom_code);
all=devices; //запомнить количество датчиков
for (i=0;i {
temp=ds1820_temperature_10(&rom_code[i,0]); //сохранить значение температуры i-го датчика
j='+';
if (temp<0) //если температура минусовая, поставить перед ней "-"
{
j='-';
temp=-temp;
};
sprintf(lcd_buffer,"t%u=%c%i.%u\xdfC",++i,j,temp/10,temp%10);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(700);
// mas_look(cod_mas);


devices=w1_search(DS_SRROM,rom_code);
if (all>devices) //если датчиков стало меньше, чем было, то поднять тревогу
{
lcd_clear();
sprintf(lcd_buffer,"Alarm!!!",devices);
lcd_puts(lcd_buffer);
delay_ms(800);
}
/* if (d {
lcd_clear();
sprintf(lcd_buffer,"Master",devices);
lcd_puts(lcd_buffer);
//PORTB.1=1;
DDRB = 0x1;
/*set PORTB as output
Записать число 11111111 в регистр МК DDRB (этот регистр определяет направление работы выводов МК: "0" - вход "1" - выход").
A в сочетании со значением в регистре PORTB определяет включение "подтяжки" ножки МК к + питания. об этом ниже...
Мы установили этой строчкой направление работы порта B на "выход" т.е. все биты DDRB "1" и соответствующие выводы МК (ножки микросхемы) стали выходами.
Запись "0" в какой либо бит DDRx означает что соответствующая ножка МК будет входом. */

//PINB.1 = 1; PINх - регистр содержит значения физических (т.е. реальных, тех которые мы получим измерив вольтметром и преобразовав в 1 или 0) уровней сигнала на соотв. ножках МК.

/* delay_ms(1000);
DDRB = 0x00;
}
else {} */

// };
// };

//}

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru