SHARE
TWEET

Untitled

a guest Jun 20th, 2019 76 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top