дипломный проект подачи звонков на ATMega16

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Сообщение PlagueDoctor »

Проект подачи звонков. Подскажите пожалуйста, как настроить подачу сигнала, нужно, чтобы 3 секунды сигнал шёл(звонок звенел), после чего сбрасывался. И при нажатии кнопки запоминалось определённое расписание. Т.е. это будет будний день, суббота или праздничный день.

Код: Выделить всё

#include <io.h>

// Alphanumeric LCD functions
#include <alcd.h>
#include <delay.h>
#asm
   .equ __ds1302_port=0x18 ;PORTB
   .equ __ds1302_io=2
   .equ __ds1302_sclk=1
   .equ __ds1302_rst=0
#endasm
#include <ds1302.h>
// Declare your global variables here
unsigned char second, minute, hour, date, month, year, dzntime;
bit menu = 0;
bit viwe = 1;
int editCount = 0;    
 
 //---------Вывод времени--------------------------------------------
void timeOut (void)
{      
  lcd_gotoxy(0,1);
  lcd_putchar(hour/10+0x30);
  lcd_putchar(hour%10+0x30);
  lcd_putchar(':'); 
  lcd_putchar(minute/10+0x30);
  lcd_putchar(minute%10+0x30);       
  lcd_putchar(':');
  lcd_putchar(second/10+0x30);
  lcd_putchar(second%10+0x30);                       
}
//---------Вывод времени конец--------------------------------------------
  //-------------функция отрисовки месяца-----------------------  
void monthOut (void){
 switch (month) {
    case 1:
    lcd_puts("JAN");
    break;
    case 2:
    lcd_puts("FEB");
    break;
    case 3:
    lcd_puts("MAR");
    break;
    case 4:
    lcd_puts("APR");
    break;
    case 5:
    lcd_puts("MAY");
    break;
    case 6:
    lcd_puts("JUN");
    break;
    case 7:
    lcd_puts("JUL");
    break;
    case 8:
    lcd_puts("AUG");
    break;
    case 9:
    lcd_puts("SEP");
    break;
    case 10:
    lcd_puts("OCT");
    break;
    case 11:
    lcd_puts("NOV");
    break;
    case 12:
    lcd_puts("DEC");
    break;
    }; 
}
//-------------конец функции отрисовки месяца-----------------------

//---------Вывод даты--------------------------------------------
void dateout (void)
{      
  lcd_gotoxy(3,0);
  lcd_putchar(date/10+0x30);
  lcd_putchar(date%10+0x30);
  lcd_putchar(' '); 
  monthOut();  
  lcd_putchar(' ');
  lcd_putchar(year/10+0x30);
  lcd_putchar(year%10+0x30);                       
}
//---------Вывод даты конец--------------------------------------------
//---------------------------меню--------------------------------------
void menuView (void){

while (menu){

switch (editCount){

case 0: //настраиваем часы
if (PINC.1 == 0){
delay_ms(20);
hour++;
if (hour > 23) {
    hour = 0;
    } 

}
if (PINC.0 == 0) { 
    editCount++;
    viwe = 1;
    delay_ms(800);
    }
    
lcd_gotoxy(0,1);
if (viwe == 1){
lcd_putchar(hour/10+0x30);
lcd_putchar(hour%10+0x30);
viwe = 0;
} else {
lcd_putchar(0b100000);
lcd_putchar(0b100000);
viwe = 1;
}
break;

case 1: //настраиваем минуты
if (PINC.1 == 0){
delay_ms(20);
minute++;

if (minute > 59) {
    minute = 0;
    } 
}
if (PINC.0 == 0) { 
    editCount++;
    viwe = 1;
    rtc_set_time(hour, minute, 0); //сохраняем часы и минуты, секунды сбрасываем в ноль
    delay_ms(800);
    }
    
lcd_gotoxy(3,1);
if (viwe == 1){
lcd_putchar(minute/10+0x30);
lcd_putchar(minute%10+0x30);
viwe = 0;
} else {
lcd_putchar(0b100000);
lcd_putchar(0b100000);
viwe = 1;
}
break;

case 2: //настраиваем день
if (PINC.1 == 0){
delay_ms(20);
date++;
if (date > 31) {
    date = 1;
    } 

}
if (PINC.0 == 0) { 
    editCount++;
    viwe = 1;
    delay_ms(800);
    }
    
lcd_gotoxy(3,0);
if (viwe == 1){
lcd_putchar(date/10+0x30);
lcd_putchar(date%10+0x30);
viwe = 0;
} else {
lcd_putchar(0b100000);
lcd_putchar(0b100000);
viwe = 1;
}
break;

case 3: //настраиваем месяц
if (PINC.1 == 0){
delay_ms(20);
month++;
if (month > 12) {
    month = 1;
    } 

}
if (PINC.0 == 0) { 
    editCount++;
    viwe = 1;
    delay_ms(800);
    }
    
lcd_gotoxy(6,0);
if (viwe == 1){
monthOut();
viwe = 0;
} else {
lcd_putchar(0b100000);
lcd_putchar(0b100000);
lcd_putchar(0b100000);
viwe = 1;
}
break;

case 4: //настраиваем год
if (PINC.1 == 0){
delay_ms(20);
year++;
if (year > 25) {
    year = 15;
    } 

}
if (PINC.0 == 0) { 
    editCount++;
    viwe = 1; 
    rtc_set_date(date, month, year);
    delay_ms(800);
    }
    
lcd_gotoxy(10,0);
if (viwe == 1){
lcd_putchar(year/10+0x30);
lcd_putchar(year%10+0x30); 
viwe = 0;
} else {
lcd_putchar(0b100000);
lcd_putchar(0b100000);
viwe = 1;
}

if (editCount !=4){
    lcd_clear();
    }
break;
};
delay_ms(300);
}
}
//----------------------------конец меню-------------------------------
//расписание звонков
void dzn (void){
switch (dzntime){
case 0: //будни
if (hour==8 && minute==30) {PORTD.6=1;}
if (hour==9 && minute==15) {PORTD.6=1;}
if (hour==9 && minute==20) {PORTD.6=1;}
if (hour==10 && minute==00) {PORTD.6=1;}
if (hour==10 && minute==15) {PORTD.6=1;}
if (hour==11 && minute==00) {PORTD.6=1;}
if (hour==11 && minute==05) {PORTD.6=1;}
if (hour==11 && minute==50) {PORTD.6=1;}
if (hour==12 && minute==30) {PORTD.6=1;}
if (hour==13 && minute==15) {PORTD.6=1;}
if (hour==13 && minute==20) {PORTD.6=1;}
if (hour==14 && minute==05) {PORTD.6=1;}
if (hour==15 && minute==00) {PORTD.6=1;}
if (hour==15 && minute==05) {PORTD.6=1;}
if (hour==15 && minute==50) {PORTD.6=1;}
if (hour==16 && minute==00) {PORTD.6=1;}
if (hour==16 && minute==45) {PORTD.6=1;}
if (hour==16 && minute==50) {PORTD.6=1;}
if (hour==17 && minute==35) {PORTD.6=1;}
if (hour==17 && minute==45) {PORTD.6=1;}
if (hour==18 && minute==30) {PORTD.6=1;}
if (hour==18 && minute==35) {PORTD.6=1;}
if (hour==19 && minute==20) {PORTD.6=1;}
break;
case 1: //суббота
if (hour==8 && minute==30) {PORTD.6=1;}
if (hour==9 && minute==15) {PORTD.6=1;}
if (hour==9 && minute==20) {PORTD.6=1;}
if (hour==10 && minute==00) {PORTD.6=1;}
if (hour==10 && minute==15) {PORTD.6=1;}
if (hour==11 && minute==00) {PORTD.6=1;}
if (hour==11 && minute==05) {PORTD.6=1;}
if (hour==11 && minute==50) {PORTD.6=1;}
if (hour==12 && minute==00) {PORTD.6=1;}
if (hour==12 && minute==45) {PORTD.6=1;}
if (hour==12 && minute==50) {PORTD.6=1;}
if (hour==13 && minute==35) {PORTD.6=1;}
if (hour==13 && minute==45) {PORTD.6=1;}
if (hour==14 && minute==30) {PORTD.6=1;}
if (hour==14 && minute==40) {PORTD.6=1;}
if (hour==15 && minute==25) {PORTD.6=1;}
break;
case 2: //праздники
if (hour== && minute==) {PORTD.6=1;}
break;
}
//конец расписания

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (1<<PORTB0);

// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (1<<PORTC1) | (1<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=(0<<DDD7) | (1<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 8

rtc_init(0,0,0);
lcd_init(16);

#asm("sei")

while (1){ 
     rtc_get_time(&hour,&minute,&second);//Достаю время
     rtc_get_date(&date,&month,&year);//Достаю дату
     timeOut();
     dateout();
     dzn();     
     if (PINC.0 == 0) { //активация функции меню
     menu = 1;
     delay_ms(800);
     }
     menuView();  
      
}
}



Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Что это такое?:

Код: Выделить всё

hour== && minute==
По вопросу: делаем таймер. Запуск - выдержка 3 сек - останов.
По второму: в RTC есть память. Очень удобно ее использовать для запоминания. Она же энергонезависимая.
Docendo discimus
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Сообщение PlagueDoctor »

То, я ещё не знаю расписания звонков на праздники. :)
Про таймер я понял, я не могу понять, как его реализовать...
И по второму я тоже не знаю, что с этим делать.
С часами первый раз сталкиваюсь.
Подскажите примерами, если не трудно.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

можно взять 1 в 1 мой проект и радоваться :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Сообщение PlagueDoctor »

Почитал, пока для меня сложновато такое восприятие. Но, спасибо, в свободное время попробую поразбираться, может, чего дополню. :)
Я бы попросил помощи в доработке моего кода, потому что с меня спросят же, а если я ничего не отвечу, то накроется мой диплом медным тазом. :)
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

PlagueDoctor писал(а):накроется мой диплом медным тазом
может, так и лучше было бы? ;)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

PlagueDoctor писал(а):Подскажите пожалуйста, как настроить подачу сигнала, нужно, чтобы 3 секунды сигнал шёл(звонок звенел), после чего сбрасывался.
если звонок начинает звенеть в хх(час):хх(мин):00(сек) , то выключается в хх(час):хх(мин):03(сек), т.е достаточно проверить чтобы значение секунд было > 3-х. Расписание лучше держать в таблице, а не строить лес из CASE

.. а вообще сей "шедевр" лучше переписать - стыдно такое показывать на дипломе
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

PlagueDoctor писал(а):потому что с меня спросят же, а если я ничего не отвечу, то накроется мой диплом медным тазом. :)
А если кто-то доработет Ваш код, то с Вас не спросят ? Или Вы будете знать что ответить ? :)
Или "доаботка" ещё в себя включает и полное разжёвывание материала, вплоть до обучения программированию ? :)
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Сообщение PlagueDoctor »

Уважаемый, ARV, я соглашусь, но в нашей стране, без бумажки мы букашки, поэтому сию бумажку нужно получить, плюс красный же диплом, хоть и техникума. :)

ChipKiller, я понимаю, просто нас обучали программировать на делфи, а программировать микроконтроллеры я сам учусь и выступал с куратором на выставках, вот и озадачили на этом писать диплом. А что за таблица? Не могли бы рассказать? Что к чему и как?
Для диплома код можно предоставить и в таком виде, ругать не будут. Задумка не сложная, получается, я нажимаю кнопку, которая подписана "будни", к примеру, горит зелёный диод, звонок звенит по будничному расписанию, после, приходит вахтёрша в субботу, нажмёт на кнопку подписанная "суббота", загорится жёлтый диод и звонок звенит по субботнему расписанию, ну и на праздники так же. Я понял, что через CASE, но как сделать, чтобы диод постоянно горел и были звонки определённых дней, я не знаю. Прошу помощи.

Аlex, обучение не сильно требуется, самообучаюсь, многих элементов не знаю, вот и спрашиваю. Полное разжёвывание не надо, может, некоторые комментарии, а в чём не разобрался бы, я бы спросил.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

функция отрисовки месяца c применением таблицы

Код: Выделить всё

 flash char tab_month[12*4]={
'J','A','N',0
'F','E','B',0
....
'D','E','C',0
};
void monthOut (void){
    lcd_puts(&tab_month[(month-1)*4]);
} 
.. а вообще почитайте книжку Лебедева -"CodeVisionAVR Пособие для начинающих"
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

PlagueDoctor писал(а):я нажимаю кнопку, которая подписана "будни", к примеру, горит зелёный диод, звонок звенит по будничному расписанию, после, приходит вахтёрша в субботу, нажмёт на кнопку подписанная "суббота", загорится жёлтый диод и звонок звенит по субботнему расписанию,
Не понял. По сути, то, что Вы делаете, есть разновидность часов с чуть усложненным будильником. Зачем жать кнопки в будни и в субботы? Нормально спроектированные часы сами должны знать, будний сегодня день или суббота.
Нестандартное расписание может быть только в праздники, ибо у нас их, порой переносят для оптимизации на другие дни.
Но даже и праздники можно учесть, если в начале года, имея производственный календарь, внести в память несколько дат, в которые нужно делать нестандартные звонки.

P.S. И этого достаточно для диплома? Я в универе часы с будильником делал в качестве курсового по предмету "Микропроцессорные комплекты".
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Сообщение PlagueDoctor »

Alkul, озадачили сделать для техникума и включили в диплом, сказали, что им этого хватит. :)
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

PlagueDoctor писал(а):сказали, что им этого хватит. :)
Это ладно, а что с кнопками? Зачем кнопки "будни" и "суббота", если все это можно автоматически учитывать?
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Сообщение PlagueDoctor »

С часами я сталкиваюсь впервые, поэтому не знаю всех возможностей. Какая идея в голову пришла, ту и предложил. Мне дали часовую микросхему ds1302 и кварц к ней. С ATMega16 я работал, с ней и решил продолжить, вот и пытаюсь делать. Расскажите об этих возможностях.
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

PlagueDoctor писал(а):Мне дали часовую микросхему ds1302 и кварц к ней. С ATMega16 я работал, с ней и решил продолжить, вот и пытаюсь делать. Расскажите об этих возможностях.
То, о чем я говорю, это не возможности часовой микросхемы DS1302, это нужно реализовывать в программе МК. В часах хранятся данные не только о времени, но и о дате, о дне недели. МК, выполнив запрос, определит день недели (1-5 - будни, 6 - суббота, 7 - воскресенье) и примет решение о том, по какому расписанию давать звонки.
Это более красивое и верное решение, нежели бабка-вахтерша, нажимающая кнопки "будни" и "суббота". Бабка-то может и забыть, и заболеть. А МК не "забудет", если его правильно запрограммировать.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

По сути, вам надо всего лишь собрать часы с календарем и с восемью будильниками/день (кроме выходных). И все тут. :) Вместо будильников включаете нагрузку - звонок. А сработку будильников ставите всего лишь на 3 секунды, а не до "пока не выключат".
Часы реального времени RTC, которые вам дали с кварцем и батарейкой вполне себе имеют на борту и сами часы и календарь. Осталось только реализовать связь с ними (по протоколу IIC) все просто там и примеров много. Часы могут считать долго, даже високосные годы учитывают.
А в МК задаете таблицу звонков и просто постоянно ее сравниваете с показаниями часов. Типа того. Или даже в МК считать и часы тоже и сравнивать, а с RTC только раз в сутки коррекцию проводить, чтобы точность хода не страдала.

Эх. Мне бы такой дипломный проект...

З.Ы. по поводу I2C есть готовые библиотеки для МК (в том числе и АВР). Просто ее подключаете и пользуетесь, а преподам говорите, что протокол давно известный и не хотелось изобретать велосипед на пустом месте и просто воспользовались готовой. :)))
Станислав
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Сообщение PlagueDoctor »

Календарь и время я уже реализовал, код выложил же. Подача звонков по определённому расписанию в определённые дни, вот вся и задача. :)
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Ну, так вам выше и ответили уже. Читаете с RTC день недели, если это не выходные, значит звонки подаете. )))) Или если это выходные, то звонки все равно подает, но выход (вывод) на звонок отключили...
Станислав
Ответить

Вернуться в «AVR»