~toykeeper/flashlight-firmware/trunk

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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/*
 * 7135x8 2.8A Nanjg 105C LED Driver
 *
 * Created: 23.01.2012 20:52:39
 * Last modified: 26.07.2013 02:57:00
 *
 * FIRMWARE VERSION: 2.6.5
 *
 * Fcpu = 4.8MHz
 *
 * This code is distributed under the GNU Public License
 * which can be found at http://www.gnu.org/licenses/gpl.txt
 *
 *  Author: Tamagotchi http://tamagotchi-007.livejournal.com/
 *                     http://avr.tamatronix.com
 *  Optimization: DooMmen http://doommen.blogspot.com/
 *				  vdavid http://forum.fonarevka.ru/member.php?u=20922
 *
 *  Download current version: http://109.87.62.61/uploads/LD_7135_v_2.6.5.zip
 *
 */

#define F_CPU 4800000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>

#define MAX_MODES				3			// îò 0 äî 3 ïîëó÷àåì 4 ðåæèìà
#define START_MODE				0			// íîìåð ðåæèìà, ñ êîòîðîãî ñòàðòóåò äðàéâåð (çàâèñèò îò REVERSE_SW)
#define REVERSE_SW							// ïðåðåêëþ÷åíèå ðåæèìîâ îò ìèíèìóìà äî ìàñèìóìà DOWNTOUP
//#define NOMEM								// âàðèàíò áåç ïàìÿòè.
#define WEAR_LEWELING						// òåõíîëîãèÿ ïðîäëåíèÿ ðåñóðñà ïàìÿòè
#define MODE_SET_LEVEL						// íàñòðàèâàåìàÿ ÿðêîñòü â äîï. ðåæèìàõ
#define	RST_LEV_MOON						// ñáðîñ ÿðêîñòè ïðè âûõîäå èç ìóíëàéòà (â ðåæèìå NOMEM - ïîóìîë÷àíèþ âêëþ÷åí)
#define	FLASH_OFF							// îòêëþ÷åíèå èíäèêàöèè âñïûøêàìè (çàïèñü òåðìîêîíòðîëÿ)
//#define FREQMOON_OFF						// îòêëþ÷àåì ïîíèæåíèå ÷àñòîòû â ñâåòëÿêå (ïîëó÷àåì ìåíüøóþ ÿðêîñòü ïðè òîì-æå ïîòðåáëåíèè)
#define ONECLICKMOON						// âûõîä èç MODELINECHG ïî îäèíàðíîìó êëèêó
//#define CAPACITOR							// êîíäåíñàòîð íà reset (çàêîìåíòèðîâàòü åñëè íåò)
//#define THERMVD								// ðàcêîììåíòèðîâàòü åñëè ïàðàëëåëüíî òåðìîðåçèñòîðó ñòîèò äèîä

//#define TURBO_TIME 				120		    // îòêëþ÷åíèå ìàêñèìàëüíîãî ðåæèìà ïî òàéìåðó â ñåêóíäàõ MAX=500 (îòêëþ÷àåò òåðìîêîíòðîëü)

#define THEMPERATURE_CONTROL				// âêëþ÷èòü òåðìîêîíòðîëü
#define CALIBRATE_CLICKS		12			// êîëè÷åñòâî êëèêîâ äëÿ âõîäà â ðåæèì òåðìîêàëèáðîâêè

#define BATTERY_CLICKS			4			// êîëè÷åñòâî êëèêîâ äëÿ âõîäà â ðåæèì èíäèêàöèè áàòàðåè

#define MODELINECHG
#define MODELINECHG_CLICKS		3

#define RAMPING
#define RAMPING_CLICKS			8

#define POLICE_MODE
#define POLICE_MODE_CLICKS		5			//

#define SLOW_PULSE_MODE
#define SLOW_PULSE_MODE_CLICKS	6			//

#define SOS_MODE
#define SOS_MODE_CLICKS			7			//

//#define PULSE_MODE
#define PULSE_MODE_CLICKS		8			//


//#define ALPINE_MODE
#define ALPINE_MODE_CLICKS		8			//


//#define VELO_STROBE
#define VELO_STROBE_CLICKS		8			//


#ifdef	NOMEM
	#define	RST_LEV_MOON
#endif

#ifdef TURBO_TIME
	#undef	THEMPERATURE_CONTROL
	#if ((TURBO_TIME<16) || (TURBO_TIME>500))
	//	#undef	TURBO_TIME
		#define	TURBO_TIME 120
		#warning "Invalid value for TURBO_TIME. Set default value is 120"
	#endif
#endif

/*Íàñòðîéêà óðîâíÿ ÿðêîñòè â ðåæèìàõ (îòêëþ÷àåòñÿ ïðè MODE_SET_LEVEL)*/
#define PulseMod		2
#define SlowPulseMod	1
#define AlpineMod		2
#define PoliceMod		2
#define SOSMod			2
/*Íàñòðîéêà óðîâíÿ ÿðêîñòè â ðåæèìàõ (íå îòêëþ÷àåòñÿ ïðè MODE_SET_LEVEL)*/
#define VeloMod			0
#define VeloPulse		MAX_MODES
/*Âðåìÿ ïàóçû â âåëî ñòðîáå*/
#define	VeloOFF			2					// 1 = 1 sec


/*Íàñòðàèâàåì âðåìÿ äëÿ ìåäëåííîãî ïóëüñà*/
#define PULSE_ON			125				// 1 = 2mc
#define PULSE_OFF			1				// 1 = 1 sec

#define CFG_CURRENTMODE		0x3A			// òåêóùèé ðåæèì ðàáîòû ôîíàðÿ
#define CFG_MOONMODE		0x3B			// ñþäà çàïèñûâàåì âêëþ÷åííûé ðåæèì 0- ñëàáîòî÷êà 1- îáû÷íûé
#define CFG_CALIBRATE		0x3D			// ñþäà çàïèñûâàåì òåìïåðàòóðó êàëèáðîâêè
#define CFG_RAMPING			0x3F			// ñþäà çàïèñûâàåì çíà÷åíèå ðàìïèíãà

//Óðîâíè íàïðÿæåíèé èíäèêàöèè
//val = ((V_bat - V_diode) * R2 * 255) / ((R1 + R2) * V_ref)
//V_diode = 0.28V; R1 = 19.1k; R2 = 4.7k
#define U1					0x98			// 3.6
#define U2 					0xA0			// 3.7
#define U3					0xA4			// 3.8
#define U4					0xAB			// 3.95
#define OFF_VOLTAGE			0x7D			// 2.90V ;3.00V = 7F

#define PB_CONFIG			0x30;			// PB4, PB5 ïîäòÿãèâàåì ê +
#define DDRB_CONFIG			0x0B;			// PB0, PB1, PB3 - âûõîäû

//#define MoonMod	do {leds_off(); set_moon_mode();} while (0);
#define Mod0001	do {leds_off(); OCR0A  = 0x01;} while (0);
#define Mod0020	do {leds_off(); OCR0A  = 0x12;} while (0);
#define Mod0035	do {leds_off(); OCR0A  = 0x20;} while (0);
#define Mod0050	do {leds_off(); OCR0A  = 0x40;} while (0);
#define Mod0075	do {leds_off(); OCR0A  = 0x55;} while (0);
#define Mod0130	do {leds_off(); OCR0A  = 0x64;} while (0);
#define Mod0175	do {leds_off(); OCR0A  = 0x80;} while (0);
#define Mod0350	do {leds_off(); OCR0A  = 0xFF;} while (0);
#define Mod0700	do {LED_PORT = LED_MASK_2 | PB_CONFIG; OCR0A  = 0x00;} while (0);
#define Mod1050	do {LED_PORT = LED_MASK_2 | PB_CONFIG; OCR0A  = 0xFF;} while (0);
#define Mod1750	do {LED_PORT = LED_MASK_5 | PB_CONFIG; OCR0A  = 0x00;} while (0);
#define Mod2100	do {LED_PORT = LED_MASK_5 | PB_CONFIG; OCR0A  = 0xFF;} while (0);
#define Mod2450	do {LED_PORT = LED_MASK_5 | LED_MASK_2 | PB_CONFIG; OCR0A  = 0x00;} while (0);
#define Mod2800	do {LED_PORT = LED_MASK_5 | LED_MASK_2 | PB_CONFIG; OCR0A  = 0xFF;} while (0);

#ifdef REVERSE_SW
#define SetMod0()	Mod0075
#define SetMod1()	Mod0350
#define SetMod2()	Mod1050
#define SetMod3()	Mod2800
#define SetMod4()	Mod2800		// 5-é ðåæèì
#else
#define SetMod0()	Mod2800
#define SetMod1()	Mod1050
#define SetMod2()	Mod0350
#define SetMod3()	Mod0075
#define SetMod4()	Mod0075		// 5-é ðåæèì
#endif

#define LED_PORT		PORTB
#define LED_MASK_5		(1<<1)				// ãðóïïà èç 5-òè 7135
#define LED_MASK_2		(1<<3)				// ãðóïïà èç 2-õ  7135

#define EEMPE		0x02
#define EEPE		0x01

#define WDTO_120MS	0x03
#define WDTO_250MS	0x04
#define WDTO_500MS	0x05
#define WDTO_1S		0x06
#define WDTO_2S		0x07
#define WDTO_4S		0x08
#define WDTO_8S		0x09
#define wdt_reset() asm volatile("wdr")

#define SIZE				0x20
#define	CMODE				0x00
#define CMODE_ADR			CMODE * SIZE

//#define all_off()	do {LED_PORT = PB_CONFIG; OCR0A  = 0x00;} while (0); 	// Âûêëþ÷àåì âîîáùå âñå
#define leds_off()	do {LED_PORT = PB_CONFIG;} while (0); 					// Âûêëþ÷àåì âñå íå ØÈÌ âûõîäû
#define adc_off()	do {ADCSRA &=~ (1<<ADIE | (1<<ADSC));} while (0);		// îòêëþ÷àåì ïðåðûâàíèÿ, èçìåðåíèÿ
#define adc_on()	do {ADCSRA |= (1<<ADIE | (1<<ADSC));} while (0);		// çàïóñêàåì ïðåðûâàíèÿ, èçìåðåíèÿ

#define OS_MAIN		__attribute__((OS_main))
#define INLINE		inline __attribute__((__always_inline__))
#define NOINLINE	__attribute__((__noinline__))


/* Îïðåäåëÿåì áèòîâûé ìàêðîñ */
#define SETBIT(x,y)		(x |= (y))		/* óñòàíîâêà áèòà y â áàéòå x	*/
#define CLEARBIT(x,y)	(x &= (~y))		/* ñáðîñ áèòà y â áàéòå x		*/
#define CHECKBIT(x,y)	(x & (y))		/* ïðîâåðêà áèòà y â áàéòå x	*/

/* Îïðåäåëÿåì ìàñêè */
#define FLAG_MEASURE	_BV(0)			/* ðàçðÿä 0 : */
#define FLAG_NEW_MOD	_BV(1)			/* ðàçðÿä 1 : */
#define FLAG_OFF_MOD	_BV(2)			/* ðàçðÿä 2 : */
//		00000000		flags register
//		     |||
//		     |||______ measure_mode åñëè 1 - èçìåðÿåì òåìïåðàòóðó åñëè 0- íàïðóãó
//		     ||_______ newmode		åñëè 1 - áûëî êîðîòêîå ïðåðûâàíèå ïèòàíèÿ, åñëè 0 - äëèííîå
//		     |________ offmode		óñëè 1 - àêêóìóëÿòîð ðàçðÿæåí

#define ClearFlags()		flag_reg = 0

#define SetMeasureThemp()	SETBIT(flag_reg, FLAG_MEASURE)
#define SetMeasureVolt()	CLEARBIT(flag_reg, FLAG_MEASURE)
#define IsMeasureThemp()	CHECKBIT(flag_reg, FLAG_MEASURE)
#define InvMeasureMode()	flag_reg ^= FLAG_MEASURE

#define SetNewMode()		SETBIT(flag_reg, FLAG_NEW_MOD)
#define ClearNewMode()		CLEARBIT(flag_reg, FLAG_NEW_MOD)
#define IsNewMode()			CHECKBIT(flag_reg, FLAG_NEW_MOD)

#define SetOffMode()		SETBIT(flag_reg, FLAG_OFF_MOD)
#define ClearOffMode()		CLEARBIT(flag_reg, FLAG_OFF_MOD)
#define IsOffMode()			CHECKBIT(flag_reg, FLAG_OFF_MOD)