fork download
  1. #define F_CPU 8000000
  2.  
  3.  
  4. #include <avr/interrupt.h>
  5. #include <avr/pgmspace.h>
  6. #include <util/delay.h>
  7. #include <avr/io.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "logo.h"
  11.  
  12. #include "i2c.h"
  13. #include "pcd8544.h"
  14.  
  15. #define LM75_ADDRIN 0b1001000
  16. #define LM75_ADDROUT 0b1001111
  17. #define LM75_REG_TEMP 0x00
  18.  
  19.  
  20.  
  21. unsigned char i,j,x,c,t;
  22. int32_t voltread,v;
  23. unsigned int temp;
  24. char temp_H,temp_L,dst[2]; //I2C stuff buffer.
  25.  
  26. //////////////////////////////////////////////////////////////////////////////////////////
  27.  
  28.  
  29.  
  30. int i2c_write(char i2c_addr, char reg_addr, unsigned char *dat, char len) //Write data to I2C
  31. {
  32. unsigned char tmp[len+1];
  33. tmp[0] = reg_addr & 0x1F;
  34. memcpy(&tmp[1], dat, len);
  35. return i2c_transaction(i2c_addr, len + 1, tmp, 0, NULL);
  36. }
  37.  
  38. int i2c_read(char i2c_addr, char reg_addr, unsigned char *dst, char len) //Read data from I2C
  39. {
  40. unsigned char tmp;
  41. tmp = reg_addr & 0x1F;
  42. return i2c_transaction(i2c_addr, 1, &tmp, len, dst);
  43. }
  44.  
  45.  
  46.  
  47.  
  48. void error(void)
  49. {
  50. LcdStr(1,"ERROR");
  51. _delay_ms(4);
  52. LcdClear();
  53.  
  54. }
  55.  
  56.  
  57.  
  58. void clearscreen(void)
  59. {
  60. LcdClear();
  61. }
  62.  
  63.  
  64.  
  65. void LcdNumber(unsigned int font_size, char c) {
  66. char str[100];
  67. int a;
  68. itoa(c, (char *)str, 10);
  69. for(a=0; a<strlen(str); a++)
  70. {
  71. LcdChr(1, str[a] );
  72. }
  73. }
  74.  
  75.  
  76.  
  77. void initHW(void)
  78. {
  79. LcdInit();
  80. i2c_init();
  81. // ADC config
  82. //REFS1 REFS0 ADLAR – MUX3 MUX2 MUX1 MUX0
  83. ADMUX = 0b01000000; //AVCC with external capacitor at AREF pin, ADC0= iejimas
  84. //ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0
  85. ADCSRA = 0b10000111; //ADC Enable, Free Running Select,Prescaler 128
  86. DDRD=225;
  87.  
  88.  
  89. MCUCR = 8; //ExtInterrupt0 triggered with external falling edge on INT0
  90. GICR = 128; //Enable ExtInterrupt0 "interruption"
  91.  
  92. }
  93.  
  94.  
  95. int adcread(void) // ADC nuskaitymo funkcija
  96. {
  97. ADCSRA |= (1 << ADSC); // Daroma pirmas nuskaitymas bet neisvedamas
  98. while (ADCSRA & (1 << ADSC)); // Laukiama kol nuskaitys
  99. ADCSRA |= (1 << ADSC); // Daromas nuskaitymas
  100. while (ADCSRA & (1 << ADSC)); // Laukiama kol nuskaitys
  101. return ADC; // Grazinama ADC reiksme (10 bit) nuo 0 iki 1024
  102. }
  103.  
  104.  
  105.  
  106. void showlogo(void)
  107. {
  108. LcdClear();
  109. LcdImage(waitImage);
  110. LcdUpdate();
  111. }
  112.  
  113. void color(unsigned char color)
  114. {
  115. switch(color)
  116. {
  117. case 0:PORTD=192; break; //Raudona
  118. case 1:PORTD=128; break; //Geltona
  119. case 2:PORTD=160; break; //Zalia
  120. case 3:PORTD=32; break; //Zydra
  121. case 4:PORTD=96; break; //Melyna
  122. case 5:PORTD=64; break; //Violetine
  123. case 6:PORTD=0; break; //Balta
  124. case 7:PORTD=224; break; //OFF
  125. }
  126. }
  127.  
  128. void drawframe(void)
  129. {
  130. for(i=0;i<9;i++)
  131. {
  132. for(j=0;j<83;j++)
  133. {
  134. LcdPixel(j,i,2);
  135. }
  136. }
  137.  
  138. for(i=24;i<33;i++)
  139. {
  140. for(j=0;j<83;j++)
  141. {
  142. LcdPixel(j,i,2);
  143. LcdPixel(j,47,2);
  144. }
  145. }
  146.  
  147. for(i=0;i<48;i++)
  148. {
  149. LcdPixel(0,i,1);
  150. LcdPixel(83,i,1);
  151. }
  152. }
  153.  
  154.  
  155. int main(void)
  156. {
  157. initHW();
  158. color(2);
  159. showlogo();
  160. _delay_ms(200);
  161. clearscreen();
  162.  
  163. sei();
  164.  
  165.  
  166. while(1)
  167. {
  168. dst[0]=0;
  169. dst[1]=0;
  170. x = i2c_read(LM75_ADDRIN, LM75_REG_TEMP, &dst[0], 2);
  171. if (x==0)
  172. {
  173. temp_H = dst[0];
  174. temp_L = dst[1];
  175. temp = (temp_H<<8)|temp_L;
  176. temp = temp>>7;
  177. LcdGotoXYFont(1,1);
  178. LcdFStr(1, PSTR(" TEMPERATURE "));
  179. LcdGotoXYFont(1,2);
  180. LcdFStr(1, PSTR(" IN:"));
  181. if(temp&0x100) //tikrinam ar neigiama temp
  182. {
  183. temp=(512-temp)>>1;
  184. LcdFStr(1, PSTR("-"));
  185. LcdNumber(1,temp);
  186. if(temp_L&0x80) //tikrinam kas po kablelio
  187. {
  188. LcdFStr(1, PSTR("."));
  189. LcdNumber(1,5);
  190. LcdChr(1, 0x7B);
  191. LcdFStr(1, PSTR("C"));
  192. }
  193. else
  194. {
  195. LcdFStr(1, PSTR("."));
  196. LcdNumber(1,0);
  197. LcdChr(1, 0x7B);
  198. LcdFStr(1, PSTR("C"));
  199. }
  200. }
  201. else
  202. {
  203. LcdNumber(1,temp_H);
  204. if(temp_L & 0x80)
  205. {
  206. LcdFStr(1, PSTR("."));
  207. LcdNumber(1,5);
  208. LcdChr(1, 0x7B);
  209. LcdFStr(1, PSTR("C"));
  210. }
  211. else
  212. {
  213. LcdFStr(1, PSTR("."));
  214. LcdNumber(1,0);
  215. LcdChr(1, 0x7B);
  216. LcdFStr(1, PSTR("C"));
  217. }
  218. }
  219. }
  220. else
  221. {
  222. LcdFStr(FONT_1X, PSTR("ERROR"));
  223. }
  224. for (x=0;x<10;x++)
  225. {
  226. _delay_ms(20);
  227. }
  228.  
  229.  
  230. x = i2c_read(LM75_ADDROUT, LM75_REG_TEMP, &dst[0], 2);
  231. if (x==0)
  232. {
  233. LcdGotoXYFont(1,3);
  234. LcdFStr(FONT_1X, PSTR(" OUT:"));
  235. temp_H = dst[0];
  236. temp_L = dst[1];
  237. temp = (temp_H<<8)|temp_L;
  238. temp = temp>>7;
  239. if(temp&0x100)
  240. {
  241. temp=(512-temp)>>1;
  242. LcdFStr(1, PSTR("-"));
  243. LcdNumber(1,temp);
  244. if(temp_L&0x80)
  245. {
  246. LcdFStr(1, PSTR("."));
  247. LcdNumber(1,5);
  248. LcdChr(1, 0x7B);
  249. LcdFStr(1, PSTR("C"));
  250. }
  251. else
  252. {
  253. LcdFStr(1, PSTR("."));
  254. LcdNumber(1,0);
  255. LcdChr(1, 0x7B);
  256. LcdFStr(1, PSTR("C"));
  257. }
  258. }
  259. else
  260. {
  261. LcdNumber(1,temp_H);
  262. if(temp_L & 0x80)
  263. {
  264. LcdFStr(1, PSTR("."));
  265. LcdNumber(1,5);
  266. LcdChr(1, 0x7B);
  267. LcdFStr(1, PSTR("C"));
  268. }
  269. else
  270. {
  271. LcdFStr(1, PSTR("."));
  272. LcdNumber(1,0);
  273. LcdChr(1, 0x7B);
  274. LcdFStr(1, PSTR("C"));
  275. }
  276. }
  277. }
  278. else
  279. {
  280. LcdFStr(FONT_1X, PSTR("i2c_error"));
  281. }
  282. for (x=0;x<10;x++)
  283. {
  284. _delay_ms(20);
  285. }
  286. LcdGotoXYFont(1,4);
  287. LcdFStr(FONT_1X, PSTR(" BATTERY "));
  288.  
  289. voltread = adcread();
  290. voltread = (voltread*2000)/1023;
  291.  
  292.  
  293. if(voltread<1000)
  294. {
  295. LcdGotoXYFont(2,5);
  296. LcdNumber(1,voltread/100);
  297. LcdFStr(FONT_1X, PSTR("."));
  298. LcdNumber(1,voltread/10%10);
  299. LcdNumber(1,voltread%10);
  300. LcdFStr(FONT_1X, PSTR("V"));
  301. }
  302. else
  303. {
  304. LcdGotoXYFont(2,5);
  305. LcdNumber(1,voltread/1000);
  306. LcdNumber(1,voltread/100%10);
  307. LcdFStr(FONT_1X, PSTR("."));
  308. LcdNumber(1,voltread/10%10);
  309. LcdNumber(1,voltread%10);
  310. LcdFStr(FONT_1X, PSTR("V"));
  311. }
  312. //LcdGotoXYFont(2,5);
  313. //LcdNumber(1,voltread/100);
  314. //LcdFStr(FONT_1X, PSTR("."));
  315. //LcdNumber(1,voltread/10%10);
  316. //LcdNumber(1,voltread%10);
  317. //LcdFStr(FONT_1X, PSTR("V"));
  318.  
  319. drawframe();
  320. LcdUpdate();
  321. _delay_ms(50);
  322. clearscreen();
  323. }
  324. return 0;
  325. }
  326.  
  327.  
  328. ISR(INT1_vect)
  329. {
  330. cli();
  331. _delay_ms(50);
  332. while(!(PIND&PD5)){}
  333. color(c);
  334. c++;
  335. c %= 8;
  336. sei();
  337. }
  338.  
  339.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:4:27: fatal error: avr/interrupt.h: No such file or directory
compilation terminated.
stdout
Standard output is empty