Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /********************************************************************/
- /* Hochschule fuer Technik und Wirtschaft */
- /* Fakultät fuer Ingenieurwissenschaften */
- /* Labor fuer Eingebettete Systeme */
- /* Mikroprozessortechnik */
- /********************************************************************/
- /* */
- /* C_Übung.C: */
- /* Programmrumpf fuer C-Programme mit dem Keil */
- /* Entwicklungsprogramm uVision fuer ARM-Mikrocontroller */
- /* */
- /********************************************************************/
- /* Aufgaben-Nr.: 4.2 * */
- /* * */
- /********************************************************************/
- /* Gruppen-Nr.: 12 * */
- /* * */
- /********************************************************************/
- /* Name / Matrikel-Nr.: * */
- /* Dennis Gro§ 3777596 * */
- /* Klaus Luhan * */
- /********************************************************************/
- /* Abgabedatum: 19.01.2019* */
- /* * */
- /********************************************************************/
- #include <LPC21xx.H> /* LPC21xx Definitionen */
- /*
- * Definition der HEX Werte für die 8 LED's
- */
- #define LED_ONE 0x0010000
- #define LED_TWO 0x0020000
- #define LED_THREE 0x0040000
- #define LED_FOUR 0x0080000
- #define LED_FIVE 0x0100000
- #define LED_SIX 0x0200000
- #define LED_SEVEN 0x0400000
- #define LED_EIGHT 0x0800000
- #define LED_OUTPUT_DEF 0xFF0000
- #define EXTINT2 0x80000000
- void press_btn(void) __irq; // forward declaration
- /*
- * setze die Grundstellung der der LED Anzeige auf die erste LED aus dem leds array.
- * Die led variable muss volatile sein da der Compiler sie nach dem Durchlauf der Interrupt Service
- * Routine verwerfen würde. Wir brauchen jedoch auch den Wert der led Stellung vom vorherigen Durchlauf
- */
- static volatile int led = 0; // Grundstellung ist die erste LED Besetzung aus dem leds array
- /*
- * leds enthält die HEX Werte um LED 1-8 auf der Anzeige zu setzen
- */
- unsigned long leds[8] = {
- LED_ONE,
- LED_TWO,
- LED_THREE,
- LED_FOUR,
- LED_FIVE,
- LED_SIX,
- LED_SEVEN,
- LED_EIGHT
- };
- int main (void){
- /*
- * Setze die LED Anzeige Ports (P1.16-P1.23) auf Ausgang
- */
- IODIR1 = 0xFF0000;
- /*
- * Sende LOW-Pegel auf LED Anzeige Pins für die Grundstellung der Anzeige (alle aus).
- */
- IOCLR1 = 0xFF0000;
- /*
- * Sende HIGH-Pegel auf LED Anzeige Pins für um die erste LED anzuschalten
- */
- IOSET1 = LED_ONE;
- /*
- * EXTMODE entscheidet darüber ob der Interrupt Flanken oder Level Abhängig ist.
- * 0x4 setzt den Interrupt auf Flankenabhängigkeit
- */
- EXTMODE = EXTMODE | 0x4;
- /*
- * Im Fall der Flankenabhängigkeit setzt EXPOLAR auf dem Wert 0x4 die Flankenabhängigkeit
- * auf fallende Flanke. Im Fall des Tasters setzt der externe Interrupt bei dem loslassen
- * des Druckknops ein.
- */
- EXTPOLAR = EXTPOLAR | 0x4;
- /*
- * Konfiguriere EINT2 für den externen Interrupt. 0x80000000 entspricht binär 10....0. Bit 32-31
- * Sind für die Konfiguration von Port EINT2, not 32-31 auf 10 setzt den Port auf Externer Interrupt
- *
- * Die Veroderung erhält andere Port Belegungen und stellt sicher das EINT2 auf Externer Interrupt
- * gesetzt ist.
- */
- PINSEL0 = PINSEL0 | 0x80000000;
- /*
- * VICVectCnt10 bildet das Kontroll-Element für IRQ und FIQ. In den Bits 0-4 wird die Kanal Nummer
- * angegeben, Bit 5 aktiviert den Eintrag wenn es auf 1 gesetzt ist.
- *
- * Für uns ergibt 0x30 den binärtstring 0...110000
- * Bit 0-4 10000 ergibt die Zahl 16 in binär Darstellung da wir Kanal 16 verwenden möchten
- * Bit 5 ist 1 um den Eintrag zu aktivieren
- */
- VICVectCntl0 = 0x30;
- /*
- * VICIntEnable legt fest ob die Peripherie-Einheit einen Interrupt auslösen kann.
- *
- * 0x10000 ergibt in binär die Zahl 16 um den Interrupt auf Kanal 16 zu erlauben.
- */
- VICIntEnable = 0x10000;
- /*
- * Setzt die Addresse für die Service Interrupt Routine, in unserem Fall die press_btn Prozedur, für
- * den externen Interrupt.
- */
- VICVectAddr0 = (unsigned long) press_btn;
- /*
- * main loop
- */
- while (1) {
- ;
- }
- }
- /*
- * Service Interrupt Routine
- * __irg deklariert die Interrupt Routine als IRQ
- */
- void press_btn(void) __irq {
- /*
- * Sende LOW Pegel auf Alle 8 LED's um sie auf Grundstellung zu setzen (LED aus)
- */
- IOCLR1 = 0xFF0000;
- /*
- * Incrementiere LED Stellung auf die nächste LED und entnehme das korrekte Bit Muster
- * aus dem leds Array. Sende einen HIGH - Pregel in IOSET1 mit dem entsprechenden
- * Bit Muster für die nächste LED.
- */
- IOSET1 = leds[led++];
- /*
- * Wenn wir bei der letzten LED angekommen sind (array Position 8) müssen wir die Position wieder auf
- * 0 setzen damit wir im nächsten Durchlauf wieder mit der ersten LED anfangen.
- */
- if (led == 8) {
- led = 0;
- }
- /*
- * Quitieren von EINT2 wird benötigt um weitere Interrupts zuzulassen
- */
- EXTINT = 0x04;
- /*
- * Reset Addresse für Service Interrupt Routine
- */
- VICVectAddr = 0x00;
- }
Add Comment
Please, Sign In to add comment