forked from dominikanez/Kenwood_GX806EF2_ATTiny13
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain_Kenwood_GX806EF2.c
125 lines (115 loc) · 2.99 KB
/
main_Kenwood_GX806EF2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#define CLOCK 9600000
#include <inavr.h>
__regvar __no_init unsigned char mode @15; // режим работы, 0: не перехватываем i2c
__regvar __no_init unsigned char xxx @14; // временная переменная для поиска START последовательности
unsigned char check1(void)
{
GIFR|=(1<<INTF0);
while (!(GIFR&(1<<INTF0)));
GIFR|=(1<<INTF0);
if ((PINB&(1<<PB0))==0x00) {xxx=PINB; return 1;}
return 0;
}
unsigned char check0(void)
{
GIFR|=(1<<INTF0);
while (!(GIFR&(1<<INTF0)));
GIFR|=(1<<INTF0);
if ((PINB&(1<<PB0))!=0x00) {xxx=PINB; return 1;}
return 0;
}
void main(void)
{
mode=0;
DDRB=0x00; // все ноги входы
PORTB=0xFE; // с подтяжками к питанию
MCUCR|=0x03; // прерывание
GIMSK=(1<<INT0); // по переднему фронту на INT0 (PB1, SCL)
xxx=PINB;
while(1)
{
waiting_for_start:
// нажата ли кнопка?
if ((PINB&(1<<PB3))==0x00)
{
__delay_cycles(CLOCK/1000*300);
if (mode) mode=0; else mode=1;
}
if (mode)
{
if (xxx!=PINB)
{
if (((PINB&0x03)==0x02)&&(xxx&0x01))
{
goto capturing_data;
}
xxx=PINB;
}
}
goto waiting_for_start;
capturing_data:
// 1
if (check1()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 1
if (check1()) goto waiting_for_start;
// 1
if (check1()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 1
if (check1()) goto waiting_for_start;
// 1
if (check1()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 0
if (check0()) goto waiting_for_start;
// 1
if (check1()) goto waiting_for_start;
// перенастраиваем INT0 за задний фронт
MCUCR&=~0x03;
MCUCR|=0x02;
// ждём 2 задних фронта
GIFR|=(1<<INTF0);
while (!(GIFR&(1<<INTF0)));
// давим SDA
PORTB&=~(1<<PB0);DDRB|=(1<<PB0);
// на один такт
GIFR|=(1<<INTF0);
while (!(GIFR&(1<<INTF0)));
GIFR|=(1<<INTF0);
MCUCR|=0x03;
// отпускаем SDA
DDRB&=~(1<<PB0);
// идём ждать старта следующей посылки
goto waiting_for_start;
}
}