Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.54 KB | None | 0 0
  1.  
  2.  
  3. #include "SPIbus.h"
  4.  
  5. //Konstanten____________________________________________
  6.  
  7. const uint8_t Letter_T[7][10] =
  8. {
  9. 0,0,0,0,1,1,0,0,0,0,
  10. 0,0,0,0,1,1,0,0,0,0,
  11. 0,0,0,0,1,1,0,0,0,0,
  12. 0,0,0,0,1,1,0,0,0,0,
  13. 0,0,0,0,1,1,0,0,0,0,
  14. 1,1,1,1,1,1,1,1,1,1,
  15. 1,1,1,1,1,1,1,1,1,1
  16. };
  17.  
  18.  
  19. const uint8_t Letter_I[7][10] =
  20. {
  21. 0,0,0,0,1,1,0,0,0,0,
  22. 0,0,0,0,1,1,0,0,0,0,
  23. 0,0,0,0,1,1,0,0,0,0,
  24. 0,0,0,0,1,1,0,0,0,0,
  25. 0,0,0,0,1,1,0,0,0,0,
  26. 0,0,0,0,1,1,0,0,0,0,
  27. 0,0,0,0,1,1,0,0,0,0
  28. };
  29.  
  30.  
  31. const uint8_t Letter_M[7][10] =
  32. {
  33. 1,0,0,0,0,0,0,0,1,
  34. 1,0,0,0,0,0,0,0,1,
  35. 1,0,0,0,0,0,0,0,1,
  36. 1,0,0,0,1,0,0,0,1,
  37. 1,0,0,1,0,1,0,0,1,
  38. 1,0,1,0,0,0,1,0,1,
  39. 1,1,0,0,0,0,0,1,1
  40. };
  41.  
  42. const uint8_t Letter_Y[7][10] =
  43. {
  44. 1,1,0,0,0,0,0,0,1,1,
  45. 0,1,1,0,0,0,0,1,1,0,
  46. 0,0,1,1,0,0,1,1,0,0,
  47. 0,0,0,1,1,1,1,0,0,0,
  48. 0,0,0,0,0,1,0,0,0,0,
  49. 0,0,0,0,0,1,0,0,0,0,
  50. 0,0,0,0,0,1,0,0,0,0
  51. };
  52.  
  53. const uint8_t Letter_A[7][10] =
  54. {
  55. 1,1,1,1,1,1,1,1,1,1,
  56. 1,1,0,0,0,0,0,0,1,1,
  57. 1,1,0,0,0,0,0,0,1,1,
  58. 1,1,1,1,1,1,1,1,1,1,
  59. 1,1,1,1,1,1,1,1,1,1,
  60. 1,1,0,0,0,0,0,0,1,1,
  61. 1,1,0,0,0,0,0,0,1,1
  62. };
  63.  
  64. const uint8_t Letter_N[7][10] =
  65. {
  66. 1,1,0,0,0,0,0,0,1,1,
  67. 1,1,0,0,0,0,0,1,1,1,
  68. 1,1,0,0,0,0,1,0,1,1,
  69. 1,1,0,0,0,1,0,0,1,1,
  70. 1,1,0,0,1,0,0,0,1,1,
  71. 1,1,0,1,0,0,0,0,1,1,
  72. 1,1,1,0,0,0,0,0,1,1
  73. };
  74.  
  75. const uint8_t Letter_R[7][8] =
  76. {
  77. 0,0,1,1,1,1,0,0,
  78. 0,0,1,0,0,1,0,0,
  79. 0,0,1,0,0,1,0,0,
  80. 0,0,1,1,1,1,0,0,
  81. 0,0,0,0,1,1,0,0,
  82. 0,0,0,1,0,1,0,0,
  83. 0,0,1,0,0,1,0,0
  84. };
  85.  
  86. const uint8_t Letter_P[7][4] =
  87. {
  88. 1,1,1,1,
  89. 1,0,0,1,
  90. 1,0,0,1,
  91. 1,1,1,1,
  92. 0,0,0,1,
  93. 0,0,0,1,
  94. 0,0,0,1
  95. };
  96.  
  97.  
  98. const uint8_t Stamm[12][6] =
  99. {
  100. 0, 0, 0, 1, 0, 0,
  101. 0, 0, 1, 1, 0, 0,
  102. 0, 0, 1, 1, 0, 0,
  103. 0, 0, 1, 1, 0, 0,
  104. 0, 0, 1, 1, 0, 0,
  105. 0, 0, 1, 1, 0, 0,
  106. 0, 0, 1, 1, 0, 0,
  107. 0, 0, 1, 1, 0, 0,
  108. 0, 0, 1, 1, 0, 0,
  109. 0, 0, 1, 1, 0, 0,
  110. 0, 1, 1, 1, 1, 0,
  111. 0, 1, 1, 1, 1, 0
  112. };
  113.  
  114. const uint8_t Fluegel[12][6] =
  115. {
  116. 0, 0, 1, 1, 0, 0,
  117. 0, 0, 1, 1, 0, 0,
  118. 0, 0, 1, 1, 0, 0,
  119. 0, 0, 1, 1, 0, 0,
  120. 0, 0, 1, 1, 0, 0,
  121. 0, 0, 1, 1, 0, 0,
  122. 0, 0, 1, 1, 0, 0,
  123. 0, 0, 1, 1, 0, 0,
  124. 0, 0, 1, 1, 0, 0,
  125. 0, 0, 0, 1, 0, 0,
  126. 0, 0, 0, 1, 0, 0
  127. };
  128.  
  129. const uint8_t Zahl_9[6][6] =
  130. {
  131. 1,1,1,1,1,1,
  132. 1,0,0,0,0,0,
  133. 1,0,0,0,0,0,
  134. 1,1,1,1,1,1,
  135. 1,0,0,0,0,1,
  136. 1,1,1,1,1,1
  137. };
  138.  
  139. const uint8_t Zahl_8[9][6] =
  140. {
  141. 1,1,1,1,1,1,
  142. 1,0,0,0,0,1,
  143. 1,0,0,0,0,1,
  144. 1,0,0,0,0,1,
  145. 1,1,1,1,1,1,
  146. 1,0,0,0,0,1,
  147. 1,0,0,0,0,1,
  148. 1,0,0,0,0,1,
  149. 1,1,1,1,1,1
  150. };
  151.  
  152. const uint8_t Zahl_7[9][6] =
  153. {
  154. 0,0,0,0,0,1,
  155. 0,0,0,0,0,1,
  156. 0,0,0,0,0,1,
  157. 0,0,0,0,0,1,
  158. 0,0,0,0,0,1,
  159. 0,0,0,0,0,1,
  160. 0,0,0,0,0,1,
  161. 0,0,0,0,0,1,
  162. 1,1,1,1,1,1
  163. };
  164.  
  165. const uint8_t Zahl_6[9][6] =
  166. {
  167. 1,1,1,1,1,1,
  168. 1,0,0,0,0,1,
  169. 1,0,0,0,0,1,
  170. 1,0,0,0,0,1,
  171. 1,1,1,1,1,1,
  172. 0,0,0,0,0,1,
  173. 0,0,0,0,0,1,
  174. 0,0,0,0,0,1,
  175. 1,1,1,1,1,1
  176. };
  177.  
  178. const uint8_t Zahl_5[9][6] =
  179. {
  180. 1,1,1,1,1,1,
  181. 1,0,0,0,0,0,
  182. 1,0,0,0,0,0,
  183. 1,0,0,0,0,0,
  184. 1,1,1,1,1,1,
  185. 0,0,0,0,0,1,
  186. 0,0,0,0,0,1,
  187. 0,0,0,0,0,1,
  188. 1,1,1,1,1,1
  189. };
  190.  
  191. const uint8_t Zahl_4[9][6] =
  192. {
  193. 0,0,0,0,0,1,
  194. 0,0,0,0,0,1,
  195. 0,0,0,0,0,1,
  196. 0,0,0,0,0,1,
  197. 1,1,1,1,1,1,
  198. 1,0,0,0,0,1,
  199. 1,0,0,0,0,1,
  200. 1,0,0,0,0,1,
  201. 1,0,0,0,0,1
  202. };
  203.  
  204. const uint8_t Zahl_3[9][6] =
  205. {
  206. 1,1,1,1,1,1,
  207. 0,0,0,0,0,1,
  208. 0,0,0,0,0,1,
  209. 0,0,0,0,0,1,
  210. 1,1,1,1,1,1,
  211. 0,0,0,0,0,1,
  212. 0,0,0,0,0,1,
  213. 0,0,0,0,0,1,
  214. 1,1,1,1,1,1
  215. };
  216.  
  217. const uint8_t Zahl_2[9][6] =
  218. {
  219. 1,1,1,1,1,1,
  220. 1,0,0,0,0,0,
  221. 0,1,0,0,0,0,
  222. 0,0,1,0,0,0,
  223. 0,0,0,1,0,0,
  224. 0,0,0,0,1,0,
  225. 0,0,0,0,1,0,
  226. 1,0,0,0,0,1,
  227. 0,1,1,1,1,0
  228. };
  229.  
  230. const uint8_t Zahl_1[9][6] =
  231. {
  232. 0,0,0,1,0,0,
  233. 0,0,0,1,0,0,
  234. 0,0,0,1,0,0,
  235. 0,0,0,1,0,0,
  236. 0,0,0,1,0,0,
  237. 0,0,0,1,0,0,
  238. 1,0,0,1,0,0,
  239. 0,1,0,1,0,0,
  240. 0,0,1,1,0,0
  241. };
  242.  
  243. const uint8_t Zahl_0[9][6] =
  244. {
  245. 1,1,1,1,1,1,
  246. 1,0,0,0,0,1,
  247. 1,0,0,0,0,1,
  248. 1,0,0,0,0,1,
  249. 1,0,0,0,0,1,
  250. 1,0,0,0,0,1,
  251. 1,0,0,0,0,1,
  252. 1,0,0,0,0,1,
  253. 1,1,1,1,1,1
  254. };
  255.  
  256. //____________________________________________________________________
  257.  
  258. //Variablen
  259. volatile uint16_t Timer = 0; //volatile: es wird immer auf dem tatsächlichen in der Hardware vorhandenen Wert zugegriffen
  260. uint8_t tempArray[9][6];
  261. unsigned int SegmentCounter = 0;
  262. float CurrentRPM = 0.0;
  263. uint8_t flag;
  264. uint8_t status;
  265. unsigned int Timer_01 = 0;
  266. unsigned int Zeit_Sek = 0;
  267. unsigned int Zeit_Min = 0;
  268. unsigned int Tausender = 0;
  269. unsigned int Hunderter = 0;
  270. unsigned int Zehner = 0;
  271. unsigned int Einer = 0;
  272.  
  273. //Deklaration der Methoden
  274. void Main_Setup();
  275. void TimerSetup();
  276. void Umdrehung_Minute();
  277. void InitHallInterrupt();
  278. void setup_umdrehungBin();
  279. void setup_Namen();
  280. void Init_Segmente();
  281. void Show_Namen();
  282. void Show_Windmuehle();
  283. void setup_Windmuehle();
  284. void Show_Sanduhr();
  285. void Setup_DecOutput();
  286. void getStellen();
  287. void Show_UmdrehungDez();
  288. void setNumberToArray(int, int, int);
  289. void getZahl(int);
  290.  
  291. int main( void )
  292. {
  293. flag = 5; //Flag wird einem Wert zugewiesen, welcher Redundant ist
  294.  
  295. Main_Setup();
  296. TimerSetup();
  297.  
  298. while (1)
  299. {
  300. if (!(PINC & (1 << PC0))) //Gehe in Abfrage, wenn der DIP-Switch auf '1' steht
  301. {
  302. flag = 0; //Setzte Flag = 0 --> Funktionsaufruf im Hall-Sensor-Interrupt
  303. }
  304. else if (!(PINC & (1 << PC1))) //siehe case 0
  305. {
  306. flag = 1;
  307. Show_Namen();
  308. }
  309. else if(!(PINC & (1 << PC2))) //siehe case 0
  310. {
  311. flag = 2;
  312. Show_Windmuehle();
  313. }
  314. else if(!(PINC & (1 << PC3))) //siehe case 0
  315. {
  316. flag = 3;
  317. Show_Sanduhr();
  318. }
  319. else //wenn kein DIP-Switch geschaltet ist
  320. {
  321. flag = 4;
  322. getStellen();
  323. }
  324. }
  325. }
  326.  
  327.  
  328. void Main_Setup()
  329. {
  330. SPI_MasterInit();
  331. initarray();
  332. InitHallInterrupt();
  333.  
  334. //set LED0
  335. DDRB |= (1 << PB0); //LED0 wird angeschaltet
  336.  
  337. //Initiallisiere den DIP-Switch
  338. DDRC = 0xF0;
  339. PORTC |= (1 << PC0 | (1 << PC1) | (1 << PC2) | (1 << PC3));
  340.  
  341. //Initiallisiere den Hall-Sensor
  342. DDRD = 0x00;
  343. PORTD |= (1 << PD2);
  344. }
  345.  
  346.  
  347. void TimerSetup()
  348. {
  349.  
  350. // Initialize TIMER1
  351. TCCR1A = 0x00;
  352. TCCR1B = 0x04;
  353. OCR1AH = 0x38;
  354. OCR1AL = 0x3F;
  355. TIMSK1 = 0x02;
  356. TCNT1 = 0x00;
  357. TCCR0B = 0x04;
  358. OCR1A = 0x00;
  359. OCR1B = 0x00;
  360.  
  361. //init TIMER0
  362. TCCR0A = 0x02;
  363. TCCR0B = 0x04; //Prescalerwert = 256
  364. TIMSK0 = 0x02;
  365.  
  366. //init TIMER2
  367. TCCR2A = 0x00;
  368. TCCR2B = 0x07; //prescaler = 1024
  369. TIMSK2 = 0x01;
  370.  
  371. //Globale Freigabe, alle Interupts sollen beginnen
  372. sei();
  373. }
  374.  
  375.  
  376. void Umdrehung_Minute()
  377. {
  378. Timer = TCNT1; //globaler Variable "Timer" den Wert aus dem Zählerregister TCNT1 zuweisen
  379. CurrentRPM = (60.0 * 14745600.0)/(256 * (float)Timer); //Umdrehung pro Minute berechnen und den Wert der Variable "CurrentRPM" zuweisen
  380. unsigned int TempInt; //Deklaration Placeholder Variable (Temporärer Integer)
  381. int zaehler; //lokale Variable "zaehler" deklariert
  382.  
  383. for (int i = 0; i < 12; i++)
  384. {
  385. zaehler = (unsigned int)CurrentRPM & (1 << i); //Wert der Variable currentrpm wird zu einem unsigned Integer umgewandelt (gecasted), beim Umwandeln kommt es zu Rundungsfehlern, da der Datentyp Integer nur ganze Zahlen speichern kann.
  386. //eine '1' wird bei jeden Durchlauf um x Stellen nach links verschoben und mit dem Wert der Variable UND-Verknüpft
  387. TempInt = zaehler & (1 << i); //siehe eine Zeile höher
  388. TempInt >>= i; //'1' o. '0' wird an den Anfang der Bitfolge verschoben und so der Binärwert ermittelt
  389. setLed(i, 0x02*TempInt, 0,0,100); //Binärwert den LED's zuweisen
  390. }
  391.  
  392. sendframe(); //Binärwert an LEDs übergeben und anzeigen
  393. TCNT1 = 0x00; //Timer wieder auf 0 Stellen
  394. }
  395.  
  396.  
  397. void Init_Segmente()
  398. {
  399. Timer = TCNT1 / 100; //Rot. Display wird in 100 Segmente eingeteilt
  400. OCR0A = Timer; //Timer Wert wird als Compare Wert festgelegt
  401.  
  402. TCNT1 = 0x00; //Timer 1 und Timer 2 werden auf 0 zurückgesetzt
  403. TCNT2 = 0x00;
  404. SegmentCounter = 0; //SegmentCounter wird auf 0 gesetzt
  405. }
  406.  
  407.  
  408. void Show_Namen()
  409. {
  410.  
  411. if (SegmentCounter < 11) for (int i = 5; i < 12; i++) setLed(i, 0x0F*Letter_T[i - 5][SegmentCounter] , 0, 0, 200); //In den Segmenten unter 47 werden die Buchstaben "T", "I" und "M" angezeigt
  412. else if (SegmentCounter < 25 && SegmentCounter > 14) for (int i = 5; i < 12; i++) setLed(i, 0x0F*Letter_I[i - 5][SegmentCounter - 15], 0, 0, 200);
  413. else if (SegmentCounter < 47 && SegmentCounter > 29) for (int i = 5; i < 12; i++) setLed(i, 0x0F*Letter_M[i - 5][SegmentCounter - 30], 0, 0, 200);
  414. else if (SegmentCounter < 61 && SegmentCounter > 50) for (int i = 5; i < 12; i++) setLed(i, 0x0F*Letter_N[i - 5][SegmentCounter - 51], 0, 200, 0); //In den Segmenten von 51 - 88 werden die Buchstaben "Y", "A" und "N" angezeigt
  415. else if (SegmentCounter < 75 && SegmentCounter > 64) for (int i = 5; i < 12; i++) setLed(i, 0x0F*Letter_A[i - 5][SegmentCounter - 65], 0, 200, 0);
  416. else if (SegmentCounter < 89 && SegmentCounter > 78) for (int i = 5; i < 12; i++) setLed(i, 0x0F*Letter_Y[i - 5][SegmentCounter - 79], 0, 200, 0);
  417. else initarray(); //in den nicht definierten Segmenten, werden die LEDs nicht angezeigt
  418.  
  419. sendframe(); //Sende Muster an LEDs
  420. }
  421.  
  422.  
  423. void Show_Windmuehle()
  424. {
  425. //alle 33 Segmente wird ein Flügel angezeigt
  426.  
  427. switch (Zeit_Sek) //Jede Sekunde wird ein Case ausgeführt
  428. {
  429. case 0: //Sekunde 0
  430. if (SegmentCounter < 6) for (int i = 0; i < 12; i++) setLed(i, 0x0F*Stamm[i][SegmentCounter], 0, 0, 255); //Zeige den Stamm der Windmühle in rot
  431. else if (SegmentCounter < 23 && SegmentCounter > 16) for (int i = 1; i < 12; i++) setLed(i, 0x0F*Fluegel[i][SegmentCounter - 17], 255, 0, 0); //Flügel 1 wird in der Farbe Blau angezeigt
  432. else if (SegmentCounter < 56 && SegmentCounter > 49) for (int i = 1; i < 12; i++) setLed(i, 0x0F*Fluegel[i][SegmentCounter - 50], 255, 0, 0); //Flügel 2
  433. else if (SegmentCounter < 89 && SegmentCounter > 82) for (int i = 1; i < 12; i++) setLed(i, 0x0F*Fluegel[i][SegmentCounter - 83], 255, 0, 0); //Flügel 3
  434. else initarray();
  435. break;
  436.  
  437. //Flügel werden um 11 Segmente verschoben, Stamm bleibt an fixer Position
  438. case 1:
  439. if (SegmentCounter < 6) for (int i = 0; i < 12; i++) setLed(i, 0x0F*Stamm[i][SegmentCounter], 0, 0, 255);
  440. else if (SegmentCounter < 34 && SegmentCounter > 27) for (int i = 1; i < 12; i++) setLed(i, 0x0F*Fluegel[i][SegmentCounter - 28], 255, 0, 0);
  441. else if (SegmentCounter < 67 && SegmentCounter > 60) for (int i = 1; i < 12; i++) setLed(i, 0x0F*Fluegel[i][SegmentCounter - 61], 255, 0, 0);
  442. else if (SegmentCounter < 100 && SegmentCounter > 93) for (int i = 1; i < 12; i++) setLed(i, 0x0F*Fluegel[i][SegmentCounter - 94], 255, 0, 0);
  443. else initarray();
  444. break;
  445.  
  446. //siehe über case 1
  447. case 2:
  448. if (SegmentCounter < 6) for (int i = 0; i < 12; i++) setLed(i, 0x0F*Stamm[i][SegmentCounter], 0, 0, 255);
  449. else if (SegmentCounter < 45 && SegmentCounter > 38) for (int i = 1; i < 12; i++) setLed(i, 0x0F*Fluegel[i][SegmentCounter - 39], 255, 0, 0);
  450. else if (SegmentCounter < 78 && SegmentCounter > 71) for (int i = 1; i < 12; i++) setLed(i, 0x0F*Fluegel[i][SegmentCounter - 70], 255, 0, 0);
  451. else if (SegmentCounter < 11 && SegmentCounter > 3) for (int i = 1; i < 12; i++) setLed(i, 0x0F*Fluegel[i][SegmentCounter - 4], 255, 0, 0);
  452. else initarray();
  453. break;
  454.  
  455. case 3:
  456. Zeit_Sek = 0; //Switch-Case beginnt wieder bei case 0
  457. break;
  458.  
  459. default:
  460. initarray();
  461. break;
  462.  
  463. }
  464.  
  465. sendframe();
  466. }
  467.  
  468.  
  469. void Show_Sanduhr()
  470. {
  471. int j = SegmentCounter;
  472. //RGB(244, 235, 66) == "gelb"
  473.  
  474. switch (Zeit_Sek)
  475. {
  476. case 0:
  477. if (j == 0) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255); //Zeichne den äußeren Rand des oberen Teils der Sanduhr
  478. else if (j > 0 && j < 15) for (int i = 1; i < 12; i++) if(i < 7) setLed(i, 0x0F, 244, 235, 66); else setLed(i, 0x00, 0, 0 ,0); //oberer Teil ist mit Sand gefüllt
  479. else if (j == 15) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255); //Zeichne den äußeren Rand des oberen Teils der Sanduhr
  480. else if (j == 50) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255); //Zeichne den äußeren Rand des unteren Teils der Sanduhr
  481. else if (j == 58) for (int i = 1; i < 12; i++) setLed(i, 0x0F, 244, 235, 66); //Sandstrahl läuft von oben nach unten
  482. else if (j == 65) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255); //Zeichne den äußeren Rand des unteren Teils der Sanduhr
  483. else initarray();
  484.  
  485. break;
  486.  
  487. case 1: //Nächstes Bild nach einer Sekunde
  488. if (j == 0) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255); //Rand 1 oben
  489. else if (j > 0 && j < 15) for (int i = 1; i < 12; i++) if(i < 5) setLed(i, 0x0F, 244, 235, 66); else setLed(i, 0x00, 0, 0, 0); //Sand oben sinkt um 2 Segmente
  490. else if (j == 15) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255); //Rand 2 oben
  491. else if (j == 50) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255); //Rand 1 unten
  492. else if (j == 58) for (int i = 1; i < 12; i++) setLed(i, 0x0F, 244, 235, 66); //Sandstrahl läuft von oben nach unten
  493. else if (j > 50 && j < 65) for (int i = 0; i < 12; i++) if (i < 10) setLed(i, 0x00, 0, 0, 0); else setLed(i, 0x0F, 244, 235, 66); //Sand steigt im unteren Teil um 2 Segmente
  494. else if (j == 65) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255); //Rand 2 unten
  495. else initarray();
  496.  
  497. break;
  498.  
  499. case 2: //nach 2 Sekunden
  500. if (j == 0) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  501. else if (j > 0 && j < 15) for (int i = 1; i < 12; i++) if (i < 3) setLed(i, 0x0F, 244, 235, 66); else setLed(i, 0x00,0,0,0); //Sand oben noch 2 Segmente hoch
  502. else if (j == 15) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  503. else if (j == 50) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  504. else if (j == 58) for (int i = 1; i < 12; i++) setLed(i, 0x0F, 244, 235, 66); //Sandstrahl läuft weiter runter
  505. else if (j > 50 && j < 65) for (int i = 0; i < 12; i++) if (i < 8) setLed(i, 0x00, 0, 0, 0); else setLed(i, 0x0F, 244, 235, 66); //Sand unten 4 Segmente hoch
  506. else if (j == 65) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  507. else initarray();
  508.  
  509. break;
  510.  
  511. case 3: case 4: //Nach 3 und 4 Sekunden --> Sanduhr läuft voll
  512. if (j == 0) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  513. else if (j == 15) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  514. else if (j == 50) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  515. else if (j == 58 && Zeit_Sek == 3) for (int i = 1; i < 12; i++) setLed(i, 0x0F, 244, 235, 66); //Restsand läuft nach unten, bei Sekunde 4 ist der gesamte Sand unten angekommen
  516. else if (j > 50 && j < 65) for (int i = 0; i < 12; i++) if (i < 6) setLed(i, 0x00, 0, 0, 0); else setLed(i, 0x0F, 244, 235, 66);
  517. else if (j == 65) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  518. else initarray();
  519.  
  520. break;
  521.  
  522. case 5: //Sanduhr dreht sich um 15 Segmente im Uhrzeigersinn
  523. if (j == 15) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  524. else if (j == 30) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  525. else if (j == 65) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  526. else if (j > 65 && j < 75) for (int i = 0; i < 12; i++) if (i < 4) setLed(i, 0x00, 0, 0, 0); else setLed(i, 0x0F, 244, 235, 66); //Sand fällt während der Drehung
  527. else if (j == 80) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  528. else initarray();
  529.  
  530. break;
  531.  
  532. case 6: //Sanduhr dreht sich um weitere 15 Segmente
  533. if (j == 30) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  534. else if (j == 45) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  535. else if (j == 80) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  536. else if (j > 80 && j < 88) for (int i = 1; i < 12; i++) setLed(i, 0x0F, 244, 235, 66); //Sand fällt mit der Drehung
  537. else if (j == 95) for (int i = 0; i < 12; i++) setLed(i, 0x0F, 0, 0, 255);
  538. else initarray();
  539.  
  540. break;
  541.  
  542. case 7:
  543. initarray();
  544. Zeit_Sek = 0; //Sanduhr beginnt wieder von vorne
  545. break;
  546.  
  547. default:
  548. initarray();
  549. break;
  550. }
  551.  
  552. sendframe();
  553. }
  554.  
  555.  
  556.  
  557. void InitHallInterrupt()
  558. {
  559. // Initialize ISR-INT0 (external interrupt - hall sensor)
  560. EICRA = 0x02; //Internal Interrupt Control Register A --> Bei fallender Flanke von INT0 wird eine interrupt-Anfrage ausgelöst
  561. EIMSK = 0x01; //Externes Interrupt-Masken-Register
  562.  
  563. sei();
  564. }
  565.  
  566.  
  567. ISR(INT0_vect) //Hall_Sensor_Interrupt
  568. {
  569. if (flag == 0)
  570. {
  571. Umdrehung_Minute();
  572. }
  573. else if (flag > 0)
  574. {
  575. Init_Segmente();
  576. }
  577. }
  578.  
  579.  
  580. ISR(TIMER0_COMPA_vect) //Timer0_CompareWert_Interrupt
  581. {
  582. SegmentCounter++;
  583. }
  584.  
  585.  
  586. ISR(TIMER2_OVF_vect) // Timer2_Overflow_Interrupt
  587. {
  588. if(flag == 2 || flag == 3)
  589. {
  590. Timer_01++;
  591. if(Timer_01 > 56)
  592. {
  593. Zeit_Sek += 1;
  594. Timer_01 = 0;
  595. }
  596. }
  597. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement