Advertisement
bhthllj

Ueb.4.3

Jan 21st, 2019
600
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.92 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.: 2.1                   *                                   */
  14. /*                                      *                                   */
  15. /********************************************************************/
  16. /*  Gruppen-Nr.: 12                     *                                   */
  17. /*                                      *                                   */
  18. /********************************************************************/
  19. /*  Name / Matrikel-Nr.:                *                                   */
  20. /*  Dennis Groß 3777596        *                                   */
  21. /*  Klaus Luhan                                 *                                   */
  22. /********************************************************************/
  23. /*  Abgabedatum: 17.01.19       *                                   */
  24. /*                                      *                                   */
  25. /********************************************************************/
  26.  
  27. #include <LPC21xx.H>        /* LPC21xx Definitionen                     */
  28.  
  29. #define D_ZERO  0x0FC0000                   // a, b, c, d, e, f         -> 0
  30. #define D_ONE   0x180000                        // b,c                                  -> 1
  31. #define D_TWO   0x16C0000                   // a, b, d, e, g                -> 2
  32. #define D_THREE 0x13C0000                   // a, b, c, d, g                -> 3
  33. #define D_FOUR  0x1980000                   // b, c, f, g                   -> 4
  34. #define D_FIVE  0x1B40000                   // a, c, d, f, g                -> 5
  35. #define D_SIX       0x1F40000                   // a, c, d, e, f, g         -> 6
  36. #define D_SEVEN 0x1C0000                        // a, b, c                          -> 7
  37. #define D_EIGHT 0x1FC0000                   // a, b, c, d, e, f, g  -> 8
  38. #define D_NINE  0x1BC0000                   // a, b, c, d, f, g         -> 9
  39.  
  40. /*
  41.  * Bitmuster für den Kippschalter
  42.  */
  43. #define FLIP 0x2000000
  44.  
  45. /*
  46.  * Forward delaration
  47.  */
  48. void flip_switcher(void) __irq;
  49.  
  50. /*
  51.  * Zählervariable
  52.  */
  53. volatile int count = 0;
  54.  
  55. /*
  56.  * digits enthälrt HEX Werte für die 7 Segment Anzeige für 0-9
  57.  */
  58. unsigned long digits[10]={
  59.     D_ZERO,
  60.     D_ONE,
  61.   D_TWO,
  62.     D_THREE,
  63.     D_FOUR,
  64.   D_FIVE,
  65.   D_SIX,
  66.   D_SEVEN,
  67.   D_EIGHT,
  68.   D_NINE
  69. };
  70.  
  71. int main(void){
  72.     /*
  73.      * IODIR0 definiert ob ein Port als Eingang oder Ausgang gesetzt ist
  74.      * 0x1FC0000 in binär 1111111000000000000000000
  75.      * Setze die 7 Segmente auf Ausgang
  76.      */
  77.   IODIR0 = 0x1FC0000;
  78.    
  79.     /*
  80.      * IOCLR0 sendet LOW Pegel
  81.      * 0x1FC0000 in binär 1111111000000000000000000
  82.      * Setze alle Segmente auf Grundstellung (aus)
  83.      */
  84.     IOCLR0 = 0x1FC0000;
  85.    
  86.     /*
  87.      * Setze den Prescalar auf einen Wert der den Takt auf eine Milisekunde festlegt
  88.      * p_clock / prescaler = Takt
  89.      * p_clock ist 12,5 MhZ / 12500 = 1 milisekunde Takt
  90.         */
  91.     T0PR = 12500; /*Prescaler einstellen */
  92.    
  93.     /*
  94.      * Reset timer auf 0
  95.      */
  96.     T0TCR = 0x02;
  97.    
  98.     /*
  99.      * Starte timer
  100.      */
  101.     T0TCR = 0x01;
  102.    
  103.     /*
  104.      * Setze folgede Matcher Bits:
  105.      * 0 - interrupt bei MR0 (Interrupt bei Gleichheit mit dem MR0-Register)
  106.      * 1 - Timer-Reset bei MR0 (Zählerstand rücksetzen bei Gleichheit mit MR0)
  107.      */
  108.     T0MCR = 0x03;
  109.    
  110.     /*
  111.      * Setze den Matcher auf jede Sekunde
  112.      * Takt nach prescaler steht auf 1 Milisekunde pro Takt,
  113.      * 1s ^= 1000 ms
  114.      */
  115.     T0MR0 = 1000;
  116.    
  117.     /*
  118.      * Setze Addresse für Service Interrupt Routine
  119.      */
  120.     VICVectAddr0 = (unsigned long) flip_switcher;
  121.    
  122.     /*
  123.      * 0x24 in binär 100100
  124.      * 00100 steht für Kanal 4 (TIMER0)
  125.      * das 5 te bit aktiviert den Kanal
  126.      */
  127.     VICVectCntl0 = 0x24;
  128.    
  129.     /*
  130.      * 0x10 in binär 10000
  131.      * Erlaube Interrupt auf Kanal 4 in dem das 5te bit auf 1 gesetzt wird
  132.      * Jedes bit entspricht einem Kanal
  133.      */
  134.     VICIntEnable = 0x10; /*erlaubt Kanal 4 einen Interrupt auszulösen*/
  135.    
  136.     /*
  137.      * main loop
  138.      */
  139.     while(1) {
  140.         ;
  141.     }
  142. }
  143.  
  144. /*
  145.  * Service Interrupt Routine
  146.  * __irg deklariert die Interrupt Routine als IRQ
  147.  */
  148. void flip_switcher(void) __irq{
  149.   if(IOPIN1 & FLIP) {
  150.         /*
  151.          * Fall Schalter gesetzt -> dekrementiere Zahlen auf der 7 Segment Anzeige
  152.          */
  153.        
  154.         /*
  155.          * Setze mit IOCLR auf Grundstellung (8 wird angezeigt)
  156.          * ICLR0 sendet LOW-Pegel
  157.          */
  158.     IOCLR0 = D_EIGHT;
  159.        
  160.         /*
  161.          * dekrementiere count um 1 und rechne mod 10 sodass das Ergebnis immer in 0 - 9 liegt
  162.          * Bekomme die entsprechende HEX Zahl vom digits array und sende einen HIGH Pegel für die
  163.          * entsprechenden bits der HEX Zahl
  164.          */
  165.     IOSET0 = digits[count-- % 10];
  166.        
  167.         /*
  168.          * wenn die erste Zahl (0) erreicht wurde beginne mit der höchsten im nächsten Durchlauf (9)
  169.          */
  170.     if(count < 0) {
  171.       count = 9;
  172.     }
  173.   } else {
  174.         /*
  175.          * Fall Schalter nicht gesetzt -> inkrementiere Zahlen auf der 7 Segment Anzeige
  176.          */
  177.        
  178.         /*
  179.          * Setze mit IOCLR auf Grundstellung (8 wird angezeigt)
  180.          * ICLR0 sendet LOW-Pegel
  181.          */
  182.     IOCLR0 = D_EIGHT;
  183.        
  184.         /*
  185.          * inkrementiere count um 1 und rechne mod 10 sodass das Ergebnis immer in 0 - 9 liegt
  186.          * Bekomme die entsprechende HEX Zahl vom digits array und sende einen HIGH Pegel für die
  187.          * entsprechenden bits der HEX Zahl
  188.          */
  189.     IOSET0 = digits[count++ % 10];
  190.        
  191.         /*
  192.          * wenn die letzte Zahl (9) erreicht wurde beginne mit der niedrigsten im nächsten Durchlauf (0)
  193.          */
  194.     if(count > 9) {
  195.       count = 0;
  196.     }
  197.   }
  198.    
  199.     /*
  200.      * Rücksetzen des Interrupt Flags
  201.      */
  202.     T0IR |= 0x10;
  203.    
  204.     /*
  205.      * Ende Interrupt Routine
  206.      */
  207.     VICVectAddr=0x00;
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement