Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
microcontrollertechnik:6_wuerfel_und_zufall [2020/10/13 04:22]
tfischer
microcontrollertechnik:6_wuerfel_und_zufall [2024/01/22 13:45] (aktuell)
mexleadmin
Zeile 1: Zeile 1:
-====== 6Würfel und Zufall ======+====== 6 Würfel und Zufall ======
  
 ==== Ziele ==== ==== Ziele ====
Zeile 11: Zeile 11:
 --> I. Vorarbeiten # --> I. Vorarbeiten #
   - Laden Sie folgende Datei herunter:    - Laden Sie folgende Datei herunter: 
-    - {{microcontrollertechnik:6_mexle_cast.simu}} +    - {{microcontrollertechnik:6Wuerfel und Zufall.sim1}} 
-    - {{microcontrollertechnik:6_mexle_cast.hex}}+    - {{microcontrollertechnik:6. Wuerfel und Zufall.hex}}
     - {{microcontrollertechnik:lcd_lib_de.h}}     - {{microcontrollertechnik:lcd_lib_de.h}}
  
Zeile 18: Zeile 18:
 --> II. Analyse des fertigen Programms # --> II. Analyse des fertigen Programms #
   - Initialisieren des Programms    - Initialisieren des Programms 
-    - Öffnen Sie SimulIDE und öffnen Sie dort mittels {{microcontrollertechnik:simulide_open.jpg?25}} die Datei ''6_mexle_cast.simu''  +    - Öffnen Sie SimulIDE und öffnen Sie dort mittels {{microcontrollertechnik:simulide_open.jpg?25}} die Datei ''6Wuerfel und Zufall.sim1''  
-    - Laden Sie ''6_mexle_cast.hex'' als firmware auf den 328 Chip+    - Laden Sie ''6. Wuerfel und Zufall.hex'' als firmware auf den 88 Chip
     - Zunächst wird eine Startanzeige mit dem Namen des Programms dargestellt.     - Zunächst wird eine Startanzeige mit dem Namen des Programms dargestellt.
-    - Als nächstes ist im Display ein Menu zu sehen. Durch Tastendruck ein Würfel gestartet (Druch auf Taste ''1'') oder gestoppt (''4'') werden kann. Die Augenzahl des Würfels ist in der Mitte der unteren Zeile dargestellt. +    - Als nächstes ist im Display ein Menu zu sehen. Durch Tastendruck kann ein Würfel gestartet (Druch auf Taste ''1'') oder gestoppt (''4'') werden. Die Augenzahl des Würfels ist in der Mitte der unteren Zeile dargestellt. 
   - Das Programm zu diesem Hexfile soll nun erstellt werden   - Das Programm zu diesem Hexfile soll nun erstellt werden
  
 <-- <--
  
---> III. Eingabe in Atmel Studio #+--> III. Eingabe in Microchip Studio #
 <WRAP group><WRAP column 40%><sxh c; first-line: 1> <WRAP group><WRAP column 40%><sxh c; first-line: 1>
  
 /*============================================================================= /*=============================================================================
- +  
-Experiment 6: MEXLEcast Elektronischer Wuerfel auf MiniMEXLE  +Experiment 6:   MEXLEcast Elektronischer Wuerfel auf dem MEXLE  
-============= ============================================== +=============   ============================================== 
- +  
-Dateiname: MEXLEcast_de.c +Dateiname:      MEXLEcast_de.c 
- +  
-Autoren: Peter Blinzinger +Autoren:        Peter Blinzinger 
- Prof. G. Gruhler (Hochschule Heilbronn) +                Prof. G. Gruhler (Hochschule Heilbronn) 
- D. Chilachava  (Georgische Technische Universitaet) +                D. Chilachava    (Georgische Technische Universitaet) 
- +  
-Version: 1.2 vom 30.04.2020 +Version:        1.2 vom 30.04.2020 
- +  
-Hardware: MEXLE2020 Ver. 1.0 oder höher +Hardware:       MEXLE2020 Ver. 1.0 oder höher 
- AVR-USB-PROGI Ver. 2.0 +                AVR-USB-PROGI Ver. 2.0 
- +  
-Software: Entwicklungsumgebung: AtmelStudio 7.0 +Software:       Entwicklungsumgebung: AtmelStudio 7.0 
- C-Compiler: AVR/GNU C Compiler 5.4.0 +                C-Compiler: AVR/GNU C Compiler 5.4.0 
- +  
-Funktion: Es wird ein elektronischer Wuerfel mit Anzeige auf dem Display +Funktion:       Es wird ein elektronischer Wuerfel mit Anzeige auf dem Display 
- realisiert. Mit zwei Tasten S1 = Start und S4 = Stop wird der  +                realisiert. Mit zwei Tasten S1 = Start und S4 = Stop wird der  
- Wuerfel gesteuert. Der Wuerfel wird mit 10ms-Takt gezaehlt. Die +                Wuerfel gesteuert. Der Wuerfel wird mit 10ms-Takt gezaehlt. Die 
- Anzeige erfolgt als Ziffer im 100ms-Takt. +                Anzeige erfolgt als Ziffer im 100ms-Takt. 
- +  
-Displayanzeige: Start (fuer 2s): Betrieb: +Displayanzeige: Start (fuer 2s):        Betrieb: 
- +----------------+ +----------------+ +                +----------------+      +----------------+ 
- |- Experiment 6 -| |Electronic Cast | +                |- Experiment 6 -|      |Electronic Cast | 
- |Electronic Cast | |Start  1   Stop | +                |Electronic Cast |      |Start  1   Stop | 
- +----------------+ +----------------+ +                +----------------+      +----------------+ 
- +  
-Tastenfunktion: S1: Start (Set-Funktion Flip-Flop) +Tastenfunktion: S1: Start (Set-Funktion Flip-Flop) 
- S4: Stop (Reset-Funktion Flip-Flop) +                S4: Stop (Reset-Funktion Flip-Flop) 
- +  
-Jumperstellung: keine Auswirkung +Jumperstellung: keine Auswirkung 
- +  
-Fuses im uC: CKDIV8: Aus (keine generelle Vorteilung des Takts) +Fuses im uC:    CKDIV8: Aus (keine generelle Vorteilung des Takts) 
- +  
-Header-Files: lcd_lib_de.h (Library zur Ansteuerung LCD-Display Ver. 1.3) +Header-Files:   lcd_lib_de.h    (Library zur Ansteuerung LCD-Display Ver. 1.3) 
 + 
 =============================================================================*/ =============================================================================*/
 + 
 // Deklarationen ============================================================== // Deklarationen ==============================================================
 + 
 // Festlegung der Quarzfrequenz // Festlegung der Quarzfrequenz
-#ifndef F_CPU // optional definieren +#ifndef F_CPU                   // optional definieren 
-#define F_CPU 12288000UL // MiniMEXLE mit 12,288 MHz Quarz +#define F_CPU 18432000UL        // ATmega 88 mit 18,432 MHz Quarz 
-#endif  +#endif                           
 + 
 // Include von Header-Dateien // Include von Header-Dateien
-#include <avr/io.h> // I/O-Konfiguration (intern weitere Dateien) +#include <avr/io.h>               // I/O-Konfiguration (intern weitere Dateien) 
-#include <avr/interrupt.h> // Definition von Interrupts +#include <avr/interrupt.h>        // Definition von Interrupts 
-#include <util/delay.h> // Definition von Delays (Wartezeiten) +#include <util/delay.h>           // Definition von Delays (Wartezeiten) 
-#include "lcd_lib_de.h" // Header-Datei fuer LCD-anzeige +#include "lcd_lib_de.h"         // Header-Datei fuer LCD-anzeige 
 + 
 // Makros // Makros
-#define SET_BIT(PORT, BIT) ((PORT) |=  (1 << (BIT))) // Port-Bit Setzen +#define SET_BIT(BYTE, BIT)  ((BYTE) |=  (1 << (BIT))) // Bit Zustand in Byte setzen 
-#define CLR_BIT(PORT, BIT) ((PORT) &= ~(1 << (BIT))) // Port-Bit Loeschen +#define CLR_BIT(BYTE, BIT)  ((BYTE) &= ~(1 << (BIT))) // Bit Zustand in Byte loeschen 
-#define TGL_BIT(PORT, BIT)  ((PORT) ^=  (1 << (BIT))) // Port-Bit Toggeln +#define TGL_BIT(BYTE, BIT)  ((BYTE) ^=  (1 << (BIT))) // Bit Zustand in Byte wechseln (toggle) 
 + 
 // Konstanten // Konstanten
-#define VORTEILER_WERT 60 // Faktor Vorteiler (Timerticks 0,111 ms) +#define PRESCALER_VAL       90      // Faktor Vorteiler (Timerticks 0,111 ms) 
-#define HUNDERTSTEL_WERT 10 // Faktor Hunderstel (1/100 s)+#define CYCLE10MS_MAX       10      // Faktor Hunderstel (1/100 s) 
 +  
 +#define INPUT_PIN_MASK 0b00001111 
 +#define ASC_NULL 0x30
  
 // Variable // Variable
-unsigned char vorteiler VORTEILER_WERT; // Zaehlvariable Vorteiler +unsigned char softwarePrescaler PRESCALER_VAL  // Zaehlvariable Vorteiler 
-unsigned char hundertstel HUNDERTSTEL_WERT; // Zaehlvariable Hunderstel +unsigned char cycle10msCount    CYCLE10MS_MAX; // Zaehlvariable Hunderstel 
- +  
-unsigned char castVar = 1; // Variable für Wuerfel-Zaehler +unsigned char castVar = 1;      // Variable für Wuerfel-Zaehler 
- +  
-bool timertick; // Bit-Botschaft alle 0,111ms (Timer-Interrupt) +bool cycle10msActive 0; // Bit-Botschaft alle 10ms 
-bool takt10ms; // Bit-Botschaft alle 10ms +bool cycle100msActive = 0; // Bit-Botschaft alle 100ms 
-bool takt100ms; // Bit-Botschaft alle 100ms +  
- +bool button1   = 0; // Bitspeicher fuer Taste 1 
-bool sw1; // Bitspeicher fuer Taste 1 +bool button4   = 0; // Bitspeicher fuer Taste 4 
-bool sw4; // Bitspeicher fuer Taste 4 +bool castBit = 0;               // Flip-Flop-Bit fuer Start/Stop 
-bool castBit = 0; // Flip-Flop-Bit fuer Start/Stop+  
 +uint8_t buttonState    = 0b00001111; // Bitspeicher fuer Tasten
  
 // Funktionsprototypen // Funktionsprototypen
-void init_Taster(void); // Taster initialisieren +void timerInt0(void);           // Init Zeitbasis mit Timer 0 
-void timerInt0(void); // Init Zeitbasis mit Timer 0 +void castCounting(void);        // Zaehlfunktion Wuerfel 
-void castCounting(void); // Zaehlfunktion Wuerfel +void castDisplay(void);         // Anzeige Wuerfel 
-void castDisplay(void); // Anzeige Wuerfel +void initDisplay(void);         // Initialisierung Display 
-void initDisplay(void); // Initialisierung Display + 
 // Hauptprogramm ============================================================== // Hauptprogramm ==============================================================
 int main() int main()
 { {
- // Initialisierung +    // Initialisierung 
- init_Taster(); // Taster initialisieren +    initDisplay();              // Initialisierung LCD-Anzeige 
- initDisplay(); // Initialisierung LCD-Anzeige +  
- +    TCCR0A = 0; // Timer 0 auf "Normal Mode" schalten 
- TCCR0A = 0; // Timer 0 auf "Normal Mode" schalten +    TCCR0B |= (1<<CS01); // mit Prescaler /8 betreiben 
- TCCR0B |= (1<<CS01); // mit Prescaler /8 betreiben +    TIMSK0 |= (1<<TOIE0); // Overflow-Interrupt aktivieren 
- TIMSK0 |= (1<<TOIE0); // Overflow-Interrupt aktivieren +  
- +    sei();                      // generell Interrupts einschalten 
- sei(); // generell Interrupts einschalten +      
-  +  
- +    // Hauptprogrammschleife 
- // Hauptprogrammschleife +  
- +    while(1)                    // unendliche Warteschleife 
- while(1) // unendliche Warteschleife +    
-+        if (cycle10msActive       // alle 10ms: 
- if (takt10ms) // alle 10ms: +        
- +            cycle10msActive = 0; //      Botschaft "10ms" loeschen 
- takt10ms = 0; // Botschaft "10ms" loeschen +            castCounting(); //      Tasten abfragen, Wuerfel zaehlen 
- castCounting(); // Tasten abfragen, Wuerfel zaehlen +        
- +        if (cycle100msActive      // alle 100ms:  
- +        
- if (takt100ms) // alle 100ms:  +            cycle100msActive = 0;   // Botschaft "100ms" loeschen 
- +            castDisplay(); // Wuerfelwert ausgeben 
- takt100ms = 0; // Botschaft "100ms" loeschen +        
- castDisplay(); // Wuerfelwert ausgeben +    
- +    return 0;
-+
- return 0;+
 } }
 + 
 // Interrupt-Routine ========================================================== // Interrupt-Routine ==========================================================
 ISR (TIMER0_OVF_vect) ISR (TIMER0_OVF_vect)
 /* In der Interrupt-Routine sind die Softwareteiler für die Taktbotschaften  /* In der Interrupt-Routine sind die Softwareteiler für die Taktbotschaften 
-   (10ms, 100ms) realisiert. Die Interrupts stammen von Timer (Interrupt 1) +   (10ms, 100ms) realisiert. Die Interrupts stammen von Timer (Interrupt 1) 
- +  
-   Verwendete Variable: vorteiler +   Verwendete Variable: vorteiler 
- hunderstel +                        hunderstel 
- +  
-   Ausgangsvariable: takt10ms +   Ausgangsvariable:    takt10ms 
- takt100ms+                        takt100ms
 */ */
 { {
- timertick = 1; // Botschaft 0,111ms senden + --softwarePrescaler; // Vorteiler dekrementieren 
- --vorteiler; // Vorteiler dekrementieren + if (softwarePrescaler==0) // wenn 0 erreicht: 10ms abgelaufen
- if (vorteiler==0) // wenn 0 erreicht: 10ms abgelaufen+
  {  {
- vorteiler VORTEILER_WERT; //    Vorteiler auf Startwert + softwarePrescaler PRESCALER_VAL; //    Vorteiler auf Startwert 
- takt10ms = 1; //    Botschaft 10ms senden + cycle10msActive = 1; //    Botschaft 10ms senden 
- --hundertstel; //    Hunderstelzähler dekrementieren + --cycle10msCount; //    Hunderstelzaehler dekrementieren 
- +  
- if (hundertstel==0) // wenn 0 erreicht: 100ms abgelaufen+ if (cycle10msCount==0) // wenn 0 erreicht: 100ms abgelaufen
  {  {
- hundertstel HUNDERTSTEL_WERT; // Teiler auf Startwert + cycle10msCount CYCLE10MS_MAX; // Teiler auf Startwert 
- takt100ms = 1; //    Botschaft 100ms senden+ cycle100msActive = 1; //    Botschaft 100ms senden
  }  }
  }  }
 } }
  
-// Taster initialisieren ======================================================= + 
-void init_Taster(void) +
-+
- DDRB = DDRB & 0xE1; // Port B auf Eingabe schalten +
- PORTB |= 0x1E; // Pullup-Rs eingeschaltet +
- _delay_us(10); // Wartezeit Umstellung Hardware-Signal +
-+
 // Wuerfelfunktion ============================================================ // Wuerfelfunktion ============================================================
 void castCounting(void) void castCounting(void)
 { {
- // Einlesen der Tastensignale  + DDRC = DDRC &~INPUT_PIN_MASK; // Port B auf Eingabe schalten 
- sw1 (PINB & (1 << PB1)); + PORTC |=   INPUT_PIN_MASK; // Pullup-Rs eingeschaltet 
- sw4 = (PINB (1 << PB4)); + _delay_us(1); // Wartezeit Umstellung Hardware-Signal 
-  + buttonState    = (PINC INPUT_PIN_MASK) ; // Hole den Schalterstatus von B1..B4, 0b1 ist hier offener SChalter 
- // Auswertung der Tasten+ DDRC |= INPUT_PIN_MASK; // Port B auf Ausgabe schalten
  
- if (sw1==0) // solange Taste 1 gedrueckt:  +    // Einlesen der Tastensignale    
- castBit = 1; //    Flip-Flop "Wuerfeln" Setzen +    button1 = (buttonState & (1 << PC0)); 
- +    button4 = (buttonState & (1 << PC3)); 
- if (sw4==0) // solange Taste 4 gedrueckt:  +      
- castBit = 0; //    Flip-Flop "Wuerfeln" Ruecksetzen +    // Auswertung der Tasten 
- +  
- if (castBit) // Solange Flip-Flop "Wuerfeln" gesetzt +    if (button1==0) // solange Taste 1 gedrueckt:  
- +        castBit = 1;            //    Flip-Flop "Wuerfeln" Setzen 
- castVar++; //   Wurfelwert hochzaehlen im Takt 10ms +  
- if (castVar>6) //   groesser als 6? +    if (button4==0)             // solange Taste 4 gedrueckt:  
- castVar=1; //  => auf 1 setzen +        castBit = 0;            //    Flip-Flop "Wuerfeln" Ruecksetzen 
- }+  
 +    if (castBit)                // Solange Flip-Flop "Wuerfeln" gesetzt 
 +    
 +        castVar++; //    Wurfelwert hochzaehlen im Takt 10ms 
 +        if (castVar>6) //    groesser als 6? 
 +            castVar=1; //       => auf 1 setzen 
 +    }
 } }
 + 
 // Anzeigefunktion Wuerfel ==================================================== // Anzeigefunktion Wuerfel ====================================================
 void castDisplay(void) void castDisplay(void)
 { {
- lcd_gotoxy(1,7); // Cursor auf Ausgabeposition +    lcd_gotoxy(1,7);            // Cursor auf Ausgabeposition 
- lcd_putc(castVar+0x30); // ASCII-Wert des Wuerfelzaehlers ausgeben+    lcd_putc(castVar+ASC_NULL);     // ASCII-Wert des Wuerfelzaehlers ausgeben
 } }
 + 
 // Initialisierung Display-Anzeige ============================================ // Initialisierung Display-Anzeige ============================================
-void initDisplay() // Start der Funktion+void initDisplay()              // Start der Funktion
 { {
- lcd_init(); // Initialisierungsroutine aus der lcd_lib +    lcd_init();                 // Initialisierungsroutine aus der lcd_lib 
-  +                      
- lcd_gotoxy(0,0);         // Cursor auf 1. Zeile, 1. Zeichen +    lcd_gotoxy(0,0);                // Cursor auf 1. Zeile, 1. Zeichen 
- lcd_putstr("- Experiment 6 -"); // Ausgabe Festtext: 16 Zeichen +    lcd_putstr("- Experiment 6 -"); // Ausgabe Festtext: 16 Zeichen 
- +  
- lcd_gotoxy(1,0);         // Cursor auf 2. Zeile, 1. Zeichen +    lcd_gotoxy(1,0);                // Cursor auf 2. Zeile, 1. Zeichen 
- lcd_putstr("Electronic Cast "); // Ausgabe Festtext: 16 Zeichen +    lcd_putstr("Electronic Cast "); // Ausgabe Festtext: 16 Zeichen 
- +  
- _delay_ms(2000); // Wartezeit nach Initialisierung +    _delay_ms(2000);            // Wartezeit nach Initialisierung 
- +  
- lcd_gotoxy(0,0);         // Cursor auf 1. Zeile, 1. Zeichen +    lcd_gotoxy(0,0);                // Cursor auf 1. Zeile, 1. Zeichen 
- lcd_putstr("Electronic Cast "); // Ausgabe Festtext: 16 Zeichen+    lcd_putstr("Electronic Cast "); // Ausgabe Festtext: 16 Zeichen 
 +  
 +    lcd_gotoxy(1,0);                // Cursor auf 2. Zeile, 1. Zeichen 
 +    lcd_putstr("Start  1   Stop "); // Ausgabe Festtext: 16 Zeichen 
 +}                               // Ende der Funktion
  
- lcd_gotoxy(1,0);         // Cursor auf 2. Zeile, 1. Zeichen 
- lcd_putstr("Start  1   Stop "); // Ausgabe Festtext: 16 Zeichen 
-} // Ende der Funktion 
 </sxh> </sxh>
 </WRAP><WRAP column 55%> </WRAP><WRAP column 55%>
Zeile 244: Zeile 244:
   - Die Konstanten entsprechen denen der letzten Programme. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\    - Die Konstanten entsprechen denen der letzten Programme. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ 
   - Alle Variablen außer ''castBit'' entsprechen denen der letzten Programme. ''castBit'' ist ein "Merker", bzw. Flipflop welches das Würfeln aktiviert oder deaktiviert \\ \\    - Alle Variablen außer ''castBit'' entsprechen denen der letzten Programme. ''castBit'' ist ein "Merker", bzw. Flipflop welches das Würfeln aktiviert oder deaktiviert \\ \\ 
-  - Bei den Funktionsprototypen sind einige bekannte Unterprogramme vorhanden. Details werden weiter unten erklärt. \\ \\ \\ +  - Bei den Funktionsprototypen sind einige bekannte Unterprogramme vorhanden. Details werden weiter unten erklärt. \\ \\ \\ \\ \\  
  
 ''Hauptprogramm ========================='' ''Hauptprogramm =========================''
  
-  - Das Hauptprogramm ähnelt sehr stark dem [[4._up_down_counter|Up/Down Counter]].+  - Das Hauptprogramm ähnelt sehr stark dem [[4_up_down_counter|Up/Down Counter]].
   - Zunächst werden zwei Initialisierungsroutinen aufgerufen (siehe weiter unten)   - Zunächst werden zwei Initialisierungsroutinen aufgerufen (siehe weiter unten)
   - Dann werden wieder die "__T__imer/__C__ounter __C__ontrol __R__egister" des Timers __0__ ''TCCR0A'' und ''TCCR0B'' gesetzt. Der 8-Bit Timer und auch hier im "Normal Mode" zum hochzählen genutzt. Auch hier gibt das Register ''TCCR0B'' den Prescaler an.   - Dann werden wieder die "__T__imer/__C__ounter __C__ontrol __R__egister" des Timers __0__ ''TCCR0A'' und ''TCCR0B'' gesetzt. Der 8-Bit Timer und auch hier im "Normal Mode" zum hochzählen genutzt. Auch hier gibt das Register ''TCCR0B'' den Prescaler an.
   - Auch hier wird über die "__T__imer __I__nterrupt __M__a__SK__" ''TIMSK0'' durch das Bit ''TOIE0'' ("__T__imer __O__verflow __I__nterrupt __E__nable") der Interrupt bei Überlauf aktiviert.   - Auch hier wird über die "__T__imer __I__nterrupt __M__a__SK__" ''TIMSK0'' durch das Bit ''TOIE0'' ("__T__imer __O__verflow __I__nterrupt __E__nable") der Interrupt bei Überlauf aktiviert.
   - Mit dem Befehl ''sei()'' wird die Bearbeitung von Interrupts aktiv \\ \\ \\    - Mit dem Befehl ''sei()'' wird die Bearbeitung von Interrupts aktiv \\ \\ \\ 
-  - In der Endlosschleife sind auf der ersten Ebene wieder nur If-Abfragen zu den Flags $10ms$ und $100ms$ zu finden. \\ \\ +  - In der Endlosschleife sind auf der ersten Ebene wieder nur If-Abfragen zu den Flags ''takt10ms'' und ''takt100ms'' zu finden. \\ \\ 
-    - Alle $10ms$ (bzw. wenn das entsprechende Flag gesetzt wird) wird das Flag zurückgesetzt und das Unterprogramm ''castCounting()'' aufgerufen \\ \\ \\  +    - Alle $10~\rm ms$ (bzw. wenn das entsprechende Flag gesetzt wird) wird das Flag zurückgesetzt und das Unterprogramm ''castCounting()'' aufgerufen \\ \\ \\  
-    - Alle $100ms$ (bzw. wenn das entsprechende Flag gesetzt wird) wird das Flag zurückgesetzt und das Unterprogramm ''castDisplay()'' aufgerufen \\ \\ \\ \\ \\ \\ +    - Alle $100~\rm ms$ (bzw. wenn das entsprechende Flag gesetzt wird) wird das Flag zurückgesetzt und das Unterprogramm ''castDisplay()'' aufgerufen \\ \\ \\ \\ \\ 
 ''Interrupt Routine ========================='' ''Interrupt Routine =========================''
-  - Mit dem Befehl ''ISR()'' wird eine Interrupt Service Routine für den  __OV__er__F__low Interrupt für __TIMER2__ angelegt.  +  - Mit dem Befehl ''ISR()'' wird eine Interrupt Service Routine für den  __OV__er__F__low Interrupt für __TIMER0__ angelegt.  
-  - Der Überlauf-Interrupt durch den Timer2 wird erst bei Überlauf des 8-Bit Wert ausgeführt. Auch hier ergibt sich durch den Prescaler und Modus (''TCCR2A'' und ''TCCR2B'') eine Periode von $T_{ISR}= 0,16\bar{6}ms$. +  - Der Überlauf-Interrupt durch den Timer0 wird erst bei Überlauf des 8-Bit Wert ausgeführt. Auch hier ergibt sich durch den Prescaler und Modus (''TCCR0A'' und ''TCCR0B'') eine Periode von $T_{\rm ISR}= 0,16\bar{6}~\rm ms$. 
-  - Die Ermittlung von ''Timertick'', ''vorteiler'', ''takt10ms'', ''hundertstel'' und ''takt100ms'' ist hier wieder gleich dem im [[4._up_down_counter|Up/Down Counter]].  +  - Die Ermittlung von ''Timertick'', ''vorteiler'', ''takt10ms'', ''hundertstel'' und ''takt100ms'' ist hier wieder gleich dem im [[4_up_down_counter|Up/Down Counter]].  
-  - Eine große Änderung ist, dass bereits im Interrupt alle 10ms die Unterfunktion ''readButton()'' aufgerufen wird.  \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\  +  - Eine große Änderung ist, dass bereits im Interrupt alle 10ms die Unterfunktion ''readButton()'' aufgerufen wird.  \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
-''Taster initialisieren =============='' +
-  - Das Einstellen des Data Direction Registers und der Pullups wurde bereits in vorherigen Programmen erklärt. \\ \\ \\ +
-'' Funktion Tasten einlesen ==============''+
 \\ \\ \\ \\ \\ \\
-  - In dieser Funktion werden zunächst die Stellungen aller Taster eingelesen (vgl. ''counterCounting(void)'' bei [[4._up_down_counter|Up/down Counter]]). \\ \\ \\ +'' Funktion Tasten einlesen =============='' 
-  - Neu hier ist, dass über ''if ( (sw1_neu==0) & (sw1_alt==1) )'' die positive Flanke (=aufsteigende Flanke) erkannt wird und dies im Flag ''sw1_slope'' gespeichert wird. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\+\\ \\ \\ \\ \\  
 +  - In dieser Funktion werden zunächst die Stellungen aller Taster eingelesen (vgl. ''counterCounting(void)'' bei [[4_up_down_counter|Up/down Counter]]). \\ \\ \\ 
 +  - Neu hier ist, dass die Bedienung der Schalter nur das Flag ''castBit'' setzen. Falls dieses gesetzt ist, wird die Variable ''castVar'' hochgezählt. Falls diese 6 überschreitet wird sie auf 1 zurückgesetzt \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
  
 ''Anzeigefunktion Wuerfel ========================='' ''Anzeigefunktion Wuerfel =========================''
- \\ \\ \\ \\+  - Hierüber wird die Augenzahl in der zweiten Zeile an Position 7 ausgegeben. 
 + \\ \\
  
 ''Initialisierung Display-Anzeige ========================='' ''Initialisierung Display-Anzeige =========================''
Zeile 293: Zeile 293:
  
   - Darstellung des Augenwerts ändern    - Darstellung des Augenwerts ändern 
-    - Laden Sie folgende Dateien herunter: {{microcontrollertechnik:6a_mexlecast_extern.simu}}, {{microcontrollertechnik:6a_mexlecast_extern.hex}}+    - Laden Sie folgende Dateien herunter: {{microcontrollertechnik:6_mexle_cast_extern.sim1}}, {{microcontrollertechnik:6a_mexlecast_extern.hex}}
     - Simulieren Sie die Schaltung mit der beigefügten hex-Datei     - Simulieren Sie die Schaltung mit der beigefügten hex-Datei
-    - Ändern Sie das bisherige Programm so, dass Sie das gleiche Ergebnis erhalten.+    - Ändern Sie das bisherige Programm so, dass Sie das gleiche Ergebnis erhalten, bzw. zumindest die Ansteuerung der LEDs.
  
 <-- <--
-