Вот что нашёл на этот автомат.

Внимание! Прошивать МК нужно без впаянных светодиодов.

На фото вместо датчика Холла вы видите геркон, и это тоже верно. Его надо включать вместо ножек 1 и 2 SS441
Проект для ICC AVR: http://avrhobby.ru/files/Part1-ICCAVR.rar, там же схема и печатная плата для Proteus 7.5 sp3 и печатная плата для SprintLayout5 (немножко другая).
Печатная плата Proteus выглядит так:
Займемся программой.Подключаем нужные заголовочные файлы
Определяем константы, соответствующие разрядам
PORTB. Красный светодиод объединен с управлением тиристора потому, что они всегда работают вместе, т.к. этот светодиод индицирует включение нагрузки.
Кроме того будут нужны 2 переменные, которые должны быть видны из любого места программы, поэтому объявляем их как глобальные. Напоминаю, что таймер у нас настроен на частоту 10Гц, т.е. срабатывает и вызывает прерывание 10 раз в секунду, поэтому для измерения времени в секундах надо реагировать на таймер только каждый десятый раз, за что и отвечает переменная
count, а
sec - это наш счетчик секунд.
Код: Выделить всё
01.//ICC-AVR application builder : 21.01.2007 10:53:01
02.// Target : T13
03.// Crystal: 1.2Mhz
04.
05.#include <iot13v.h>
06.#include <macros.h>
07.
08.//Красный светодиод
09.#define LED_R 0b000010
10.//Зеленый светодиод и управление тиристором
11.#define LED_G 0b010100
12.//Датчик Холла (или геркон)
13.#define Key 0b001000
14.
15.unsigned char count;
16.int sec;
Инициализируем
PORTB, где все выводы (кроме
PB3) сконфигурированны как выходные, (
PB3) - как входной.
Настройку таймера
timer0_init () и функцию
init_devices() нам забубенил сам
ICC AVR. Здесь производится настройка внутренних регистров и всякого разного нужного.
Код: Выделить всё
18.void port_init(void)
19.{
20. PORTB = 0x08;
21. DDRB = 0x37;
22.}
23.
24.//TIMER0 initialize - prescale:1024
25.// WGM: Normal
26.// desired value: 10Hz
27.// actual value: 10,016Hz (0,2%)
28.void timer0_init(void)
29.{
30. TCCR0B = 0x00; //stop
31. OCR0A = 0x75;
32. OCR0B = 0x75;
33. TCNT0 = 0x8B; //set count
34. TCCR0A = 0x00;
35. TCCR0B = 0x05; //start timer
36.}
37.
38.//call this routine to initialize all peripherals
39.void init_devices(void)
40.{
41. //stop errant interrupts until set up
42. CLI(); //disable all interrupts
43. port_init();
44. timer0_init();
45.
46. MCUCR = 0x00;
47. TIMSK0 = 0x02; //timer interrupt sources
48. GIMSK = 0x00; //interrupt sources
49. SEI(); //re-enable interrupts
50. //all peripherals are now initialized
51.}
Далее имеем функцию
timer0_ovf_isr(), которая вызывается по прерыванию таймера (10 раз в секунду), в которой каждый 10-й вызов увеличиваем значение переменной
sec на 1. Кроме того присутствует функция
Sleep(), которая нужна для осуществления небольшой задержки (256 тактов МК).
Код: Выделить всё
53.#pragma interrupt_handler timer0_ovf_isr:4
54.void timer0_ovf_isr(void)
55.{
56. count++;
57. if (count==9) {
58. sec++;
59. count=0;
60. }
61. TCNT0 = 0x8B; //reload counter value
62.}
63.
64.void Sleep(){
65.unsigned char a,b;
66. for (a = 1; a; a++);
67.}
Ну собственно, и сама программа.
Здесь в цикле считывается состояние датчика Холла (операция
& Key нужна, для того, чтобы сразу исключить из рассмотрения все разряды кроме
PB3). Далее идет анализ состояния датчика и в зависимости от этого включается или выключается свет.
Код: Выделить всё
070.void main(void)
071.{
072.unsigned char state,old_state,ovf;
073.
074. sec=0;
075. ovf=0;
076. old_state=0;
077.
078. init_devices();
079.
080. while(1){
081. //считать состояние датчика
082. state = PINB & Key;
083. //немножко притормозить, что бы переждать дребезг контактов у геркона
084. Sleep();
085.
086.
087. //********************
088. // кусок кода до следующих звездочек нужен для отсчета
089. // истечения времени в 10с при открытой двери
090. if (state==old_state) {//если статус не менялся, т.е. нет изменения от геркона
091. if (!state) {
092. //********* в эту секцию мы попадаем всегда при закрытой двери и выключенном свете, т.е. в режиме ожидания
093. //если дверь закрыта - счетчик секунд сбросить
094. sec=0;
095. PORTB &= ~LED_R; //выключить RED
096. ovf=0;
097. }
098. else {
099. //********* в эту секцию мы попадаем при долго открытой двери
100. //если дверь открыта, надо считать секунды
101. if (sec>10) {
102. //если свет оставался включенным более 10 с и дверь открыта, то свет выключить
103. PORTB |= LED_R; //включить RED
104. if (!ovf) ovf=1;
105. }
106. }
107. continue;
108. }
109. //*****************
110.
111. old_state=state;
112.
113. //проверка PB3, если контакт разомкнут - там 1 (дверь открыта), замкнут - там 0 (дверь закрыта)
114. if ( state ) { //=1
115. //открыли дверь ?
116. PORTB ^= LED_G; //переключить свет (если вкл->выкл и наоборот)
117. }
118. else{ //=0
119. //закрыли дверь ?
120. if (ovf) { //если интервал времени открытой двери >10с то выключить свет
121. PORTB &= ~LED_G;
122. ovf=0;
123. }
124. //иначе не реагировать
125. }
126.
127. }//while
128.
129.}//main
Взято с сайта
http://avrhobby.ru/index.php?option=com_content&view=article&id=49:wcautomat&catid=34:projectsmk&Itemid=53Сижу перевариваю теперь если кто то есть головастый прошу слёзно помощи. ну очень хотца его собрать Мяу..D1 – зеленый,D2 – красный, датчик Холла обозначенный как SS400 (общее название серии) типа SS441A. Симистор может быть любого типа, главное что бы выдерживал 400В и ток нагрузки. Естественно при больших токах - на радиатор его!