bhthllj

Ueb4.2

Jan 21st, 2019
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.78 KB | None | 0 0
  1. /********************************************************************/
  2. /*  Hochschule fuer Technik und Wirtschaft                          */
  3. /*  Fakultät fuer Ingenieurwissenschaften                           */
  4. /*  Labor fuer Eingebettete Systeme                                 */
  5. /*  Mikroprozessortechnik                                           */
  6. /********************************************************************/
  7. /*                                                                  */
  8. /*  C_Übung.C:                                                      */
  9. /*    Programmrumpf fuer C-Programme mit dem Keil                   */
  10. /*    Entwicklungsprogramm uVision fuer ARM-Mikrocontroller         */
  11. /*                                                                  */
  12. /********************************************************************/
  13. /*  Aufgaben-Nr.: 4.2    *                                          */
  14. /*                       *                                          */
  15. /********************************************************************/
  16. /*  Gruppen-Nr.:    12     *                                          */
  17. /*                       *                                          */
  18. /********************************************************************/
  19. /*  Name / Matrikel-Nr.: *                                          */
  20. /*  Dennis Gro§ 3777596     *                                          */
  21. /*  Klaus Luhan                  *                                              */
  22. /********************************************************************/
  23. /*  Abgabedatum:  19.01.2019*                                       */
  24. /*                       *                                          */
  25. /********************************************************************/
  26.  
  27. #include <LPC21xx.H>        /* LPC21xx Definitionen                     */
  28.  
  29. /*
  30.  * Definition der HEX Werte für die 8 LED's
  31.  */
  32. #define LED_ONE                     0x0010000
  33. #define LED_TWO                     0x0020000
  34. #define LED_THREE                   0x0040000
  35. #define LED_FOUR                    0x0080000
  36. #define LED_FIVE                    0x0100000
  37. #define LED_SIX                     0x0200000
  38. #define LED_SEVEN                   0x0400000
  39. #define LED_EIGHT                   0x0800000
  40. #define LED_OUTPUT_DEF      0xFF0000
  41. #define EXTINT2                     0x80000000
  42.  
  43. void press_btn(void) __irq; // forward declaration
  44.  
  45. /*
  46.  * setze die Grundstellung der der LED Anzeige auf die erste LED aus dem leds array.
  47.  * Die led variable muss volatile sein da der Compiler sie nach dem Durchlauf der Interrupt Service
  48.  * Routine verwerfen würde. Wir brauchen jedoch auch den Wert der led Stellung vom vorherigen Durchlauf
  49.  */
  50. static volatile int led = 0; // Grundstellung ist die erste LED Besetzung aus dem leds array
  51.  
  52. /*
  53.  * leds enthält die HEX Werte um LED 1-8 auf der Anzeige zu setzen
  54.  */
  55. unsigned long leds[8]   = {
  56.     LED_ONE,
  57.     LED_TWO,
  58.     LED_THREE,
  59.     LED_FOUR,
  60.   LED_FIVE,
  61.   LED_SIX,
  62.   LED_SEVEN,
  63.   LED_EIGHT
  64. };
  65.  
  66. int main (void){
  67.     /*
  68.      * Setze die LED Anzeige Ports (P1.16-P1.23) auf Ausgang
  69.      */
  70.     IODIR1 = 0xFF0000;
  71.    
  72.     /*
  73.      * Sende LOW-Pegel auf LED Anzeige Pins für die Grundstellung der Anzeige (alle aus).
  74.      */
  75.     IOCLR1 = 0xFF0000;
  76.    
  77.     /*
  78.      * Sende HIGH-Pegel auf LED Anzeige Pins für um die erste LED anzuschalten
  79.      */
  80.     IOSET1 = LED_ONE;
  81.    
  82.     /*
  83.      * EXTMODE entscheidet darüber ob der Interrupt Flanken oder Level Abhängig ist.
  84.      * 0x4 setzt den Interrupt auf Flankenabhängigkeit
  85.      */
  86.     EXTMODE = EXTMODE | 0x4;
  87.    
  88.     /*
  89.      * Im Fall der Flankenabhängigkeit setzt EXPOLAR auf dem Wert 0x4 die Flankenabhängigkeit
  90.      * auf fallende Flanke. Im Fall des Tasters setzt der externe Interrupt bei dem loslassen
  91.      * des Druckknops ein.
  92.      */
  93.   EXTPOLAR = EXTPOLAR | 0x4;
  94.    
  95.     /*
  96.      * Konfiguriere EINT2 für den externen Interrupt. 0x80000000 entspricht binär 10....0. Bit 32-31
  97.      * Sind für die Konfiguration von Port EINT2, not 32-31 auf 10 setzt den Port auf Externer Interrupt
  98.      *
  99.      * Die Veroderung erhält andere Port Belegungen und stellt sicher das EINT2 auf Externer Interrupt
  100.      * gesetzt ist.
  101.      */
  102.     PINSEL0 = PINSEL0 | 0x80000000;
  103.    
  104.     /*
  105.      * VICVectCnt10 bildet das Kontroll-Element für IRQ und FIQ. In den Bits 0-4 wird die Kanal Nummer
  106.      * angegeben, Bit 5 aktiviert den Eintrag wenn es auf 1 gesetzt ist.
  107.      *
  108.      * Für uns ergibt 0x30 den binärtstring 0...110000
  109.      * Bit 0-4 10000 ergibt die Zahl 16 in binär Darstellung da wir Kanal 16 verwenden möchten
  110.      * Bit 5 ist 1 um den Eintrag zu aktivieren
  111.      */
  112.     VICVectCntl0 = 0x30;
  113.    
  114.     /*
  115.      * VICIntEnable legt fest ob die Peripherie-Einheit einen Interrupt auslösen kann.
  116.      *
  117.      * 0x10000 ergibt in binär die Zahl 16 um den Interrupt auf Kanal 16 zu erlauben.
  118.      */
  119.     VICIntEnable = 0x10000;
  120.    
  121.     /*
  122.      * Setzt die Addresse für die Service Interrupt Routine, in unserem Fall die press_btn Prozedur, für
  123.      * den externen Interrupt.
  124.      */
  125.     VICVectAddr0 = (unsigned long) press_btn;
  126.    
  127.     /*
  128.      * main loop
  129.      */
  130.     while (1) {
  131.         ;
  132.     }
  133. }
  134.  
  135. /*
  136.  * Service Interrupt Routine
  137.  * __irg deklariert die Interrupt Routine als IRQ
  138.  */
  139. void press_btn(void) __irq {
  140.         /*
  141.          * Sende LOW Pegel auf Alle 8 LED's um sie auf Grundstellung zu setzen (LED aus)
  142.          */
  143.         IOCLR1 = 0xFF0000;
  144.    
  145.         /*
  146.          * Incrementiere LED Stellung auf die nächste LED und entnehme das korrekte Bit Muster
  147.          * aus dem leds Array. Sende einen HIGH - Pregel in IOSET1 mit dem entsprechenden
  148.          * Bit Muster für die nächste LED.
  149.        */
  150.     IOSET1 = leds[led++];
  151.    
  152.         /*
  153.          * Wenn wir bei der letzten LED angekommen sind (array Position 8) müssen wir die Position wieder auf
  154.          * 0 setzen damit wir im nächsten Durchlauf wieder mit der ersten LED anfangen.
  155.          */
  156.     if (led == 8) {
  157.       led = 0;
  158.     }
  159.    
  160.         /*
  161.          * Quitieren von EINT2 wird benötigt um weitere Interrupts zuzulassen
  162.          */
  163.         EXTINT = 0x04;
  164.        
  165.         /*
  166.          * Reset Addresse für Service Interrupt Routine
  167.          */
  168.         VICVectAddr = 0x00;
  169.     }
Add Comment
Please, Sign In to add comment