Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
microcontrollertechnik:5_menuefuehrung [2020/05/14 01:04] tfischer |
microcontrollertechnik:5_menuefuehrung [2024/03/29 20:24] (aktuell) mexleadmin |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== 5. Menüführung ====== | + | ====== 5 Menüführung ====== |
- | + | ||
- | <panel type=" | + | |
- | {{fa> | + | |
- | </ | + | |
==== Ziele ==== | ==== Ziele ==== | ||
Zeile 15: | Zeile 11: | ||
--> I. Vorarbeiten # | --> I. Vorarbeiten # | ||
- Laden Sie folgende Datei herunter: | - Laden Sie folgende Datei herunter: | ||
- | - {{microcontrollertechnik: | + | - {{microcontrollertechnik: |
- | - {{microcontrollertechnik: | + | - {{microcontrollertechnik: |
- {{microcontrollertechnik: | - {{microcontrollertechnik: | ||
Zeile 22: | 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: | + | - Öffnen Sie SimulIDE und öffnen Sie dort mittels {{microcontrollertechnik: |
- | - Laden Sie '' | + | - Laden Sie '' |
- 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, in dem verschiedene Programme P1 ... P4 durch Tastendruck auswählbar ist. Dadurch sind die bisherigen Programme auswählbar. Im Unterprogramm ermöglicht der Schalter S1 das Zurückspringen ins Menu. | - Als nächstes ist im Display ein Menu zu sehen, in dem verschiedene Programme P1 ... P4 durch Tastendruck auswählbar ist. Dadurch sind die bisherigen Programme auswählbar. Im Unterprogramm ermöglicht der Schalter S1 das Zurückspringen ins Menu. | ||
Zeile 29: | Zeile 25: | ||
<-- | <-- | ||
- | --> III. Eingabe in Atmel Studio # | + | --> III. Eingabe in Microchip |
<WRAP group>< | <WRAP group>< | ||
/ | / | ||
+ | | ||
+ | Experiment 5: | ||
+ | ============= | ||
- | Experiment 5: | + | Dateiname: |
- | ============= ============= | + | |
- | + | ||
- | Dateiname: Program_Menu.c | + | |
Autoren: | Autoren: | ||
Prof. G. Gruhler (Hochschule Heilbronn) | Prof. G. Gruhler (Hochschule Heilbronn) | ||
- | D. Chilachava (Georgische Technische Universitaet) | + | D. Chilachava (Georgische Technische Universitaet) |
+ | |||
Version: | Version: | ||
- | + | | |
- | 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: | + | Software: Entwicklungsumgebung: |
C-Compiler: | C-Compiler: | ||
- | + | | |
- | Funktion: Unter einer gemeinsamen Programmoberflaeche werden vier Teil- | + | Funktion: Unter einer gemeinsamen Programmoberflaeche werden vier Teil- |
programme verwaltet. Dies sind: | programme verwaltet. Dies sind: | ||
P1: Blinking LED | P1: Blinking LED | ||
Zeile 59: | Zeile 55: | ||
tasten. Nach dem Abbruch eines Teilprogramms (immer mit S1) | tasten. Nach dem Abbruch eines Teilprogramms (immer mit S1) | ||
wird wieder die Programmauswahl gestartet. | wird wieder die Programmauswahl gestartet. | ||
- | + | | |
- | Displayanzeige: | + | Displayanzeige: |
- | +----------------+ +----------------+ | + | +----------------+ |
- | |- Experiment 5 -| | Main Level | | + | |- Experiment 5 -| |
- | | Program Menu | | P1 P2 P3 P4 | | + | | Program Menu | |
- | +----------------+ +----------------+ | + | +----------------+ |
+ | |||
Anzeige fuer Teilprogramme siehe bei einzelnen Programmen | Anzeige fuer Teilprogramme siehe bei einzelnen Programmen | ||
- | + | | |
- | Tastenfunktion: | + | Tastenfunktion: |
Im Teilprogramm ist die Funktion unterschiedlich (siehe dort) | Im Teilprogramm ist die Funktion unterschiedlich (siehe dort) | ||
- | + | | |
- | Jumperstellung: | + | Jumperstellung: |
Schalter muss fuer des Buzzer zwischen geschlossen sein | Schalter muss fuer des Buzzer zwischen geschlossen sein | ||
- | + | | |
- | Fuses im uC: CKDIV8: Aus (keine generelle Vorteilung des Takts) | + | Fuses im uC: CKDIV8: Aus (keine generelle Vorteilung des Takts) |
- | + | ||
- | Header-Files: | + | Header-Files: |
+ | |||
=============================================================================*/ | =============================================================================*/ | ||
- | + | | |
+ | |||
// Deklarationen ============================================================== | // Deklarationen ============================================================== | ||
+ | | ||
// Festlegung der Quarzfrequenz | // Festlegung der Quarzfrequenz | ||
- | #ifndef F_CPU // optional definieren | + | #ifndef F_CPU // optional definieren |
- | #define F_CPU 12288000UL // MiniMEXLE | + | #define F_CPU 18432000UL // ATmega 88 mit 18,432 MHz Quarz |
- | #endif | + | #endif |
- | + | ||
+ | |||
// Include von Header-Dateien | // Include von Header-Dateien | ||
- | #include < | + | #include < |
- | #include < | + | #include < |
#include < | #include < | ||
- | #include < | + | #include < |
- | #include " | + | #include " |
- | + | ||
+ | |||
// Makros | // Makros | ||
- | # | + | #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) |
- | + | #define GET_BIT(BYTE, | |
+ | |||
// Konstanten | // Konstanten | ||
- | #define VORTEILER_WERT | + | #define VORTEILER_WERT 90 |
- | #define HUNDERTSTEL_WERT | + | #define HUNDERTSTEL_WERT 10 |
- | #define ZEHNTEL_WERT 10 // Faktor Zehntel = 10 | + | #define ZEHNTEL_WERT 10 // Faktor Zehntel = 10 |
- | + | ||
- | #define ON_TIME 100 // " | + | #define ON_TIME 100 // " |
- | #define OFF_TIME 100 // " | + | #define OFF_TIME 100 // " |
- | + | ||
- | #define MIN_PER 59 // minimale Periodendauer in " | + | #define MIN_PER 143 // minimale Periodendauer in " |
- | #define MAX_PER 255 // maximale Periodendauer in " | + | #define MAX_PER 239 // maximale Periodendauer in " |
- | # | + | # |
- | + | #define WAIT_LED 1000// | |
- | # | + | |
- | # | + | # |
- | + | # | |
+ | |||
+ | |||
// Variable | // Variable | ||
- | unsigned char vorteiler | + | unsigned char vorteiler |
- | unsigned char hundertstel | + | unsigned char hundertstel = HUNDERTSTEL_WERT; |
- | unsigned char modus = 0; // Programmmodus | + | unsigned char modus |
- | + | ||
- | int counter = 0000; // Variable fuer Zaehler | + | int counter = 0000; // Variable fuer Zaehler |
- | + | ||
- | bool timertick; // Bit-Botschaft alle 0,111ms (Timer-Interrupt) | + | bool timertick; // Bit-Botschaft alle 0,111ms (Timer-Interrupt) |
- | bool takt10ms; // Bit-Botschaft alle 10ms | + | bool takt10ms; |
- | bool takt100ms; // Bit-Botschaft alle 100ms | + | bool takt100ms; // Bit-Botschaft alle 100ms |
- | + | ||
- | bool sw1_neu = 1; // Bitspeicher fuer Taste 1 | + | bool sw1_neu = 1; // Bitspeicher fuer Taste 1 |
- | bool sw2_neu = 1; // Bitspeicher fuer Taste 2 | + | bool sw2_neu = 1; // Bitspeicher fuer Taste 2 |
- | bool sw3_neu = 1; // Bitspeicher fuer Taste 3 | + | bool sw3_neu = 1; // Bitspeicher fuer Taste 3 |
- | bool sw4_neu = 1; // Bitspeicher fuer Taste 4 | + | bool sw4_neu = 1; // Bitspeicher fuer Taste 4 |
- | + | ||
- | bool sw1_alt = 1; // alter Wert von Taste 1 | + | bool sw1_alt = 1; // alter Wert von Taste 1 |
- | bool sw2_alt = 1; // alter Wert von Taste 2 | + | bool sw2_alt = 1; // alter Wert von Taste 2 |
- | bool sw3_alt = 1; // alter Wert von Taste 3 | + | bool sw3_alt = 1; // alter Wert von Taste 3 |
- | bool sw4_alt = 1; // alter Wert von Taste 4 | + | bool sw4_alt = 1; // alter Wert von Taste 4 |
- | + | ||
- | bool sw1_slop | + | bool sw1_slope |
- | bool sw2_slop | + | bool sw2_slope |
- | bool sw3_slop | + | bool sw3_slope |
- | bool sw4_slop | + | bool sw4_slope |
- | + | ||
+ | |||
// Funktionsprototypen | // Funktionsprototypen | ||
- | void initTaster(void); | + | void initTimer0(void); |
- | void initTimer0(void); | + | void initDisplay(void); |
- | void initDisplay(void); | + | |
- | void readButton(void); | + | void readButton(void); |
- | void mainMenu(void); // Hauptmenu bearbeiten | + | void getChoiceInMainMenu(void); // Hauptmenu bearbeiten |
- | void mainDisplay(void); // Anzeige des Hauptmenus | + | void showMainDisplay(void); // Anzeige des Hauptmenus |
- | + | ||
- | void blinkingLED(void); // Teilprogramm 1: Blinkende LED | + | void doBlinkingLed(void); // Teilprogramm 1: Blinkende LED |
- | void blinkingLED_Display(void); // Anzeige zu Teilprogramm 1 | + | void showBlinkingLedDisplay(void); // Anzeige zu Teilprogramm 1 |
- | + | ||
- | void sound(void); // Teilprogramm 2: Soundgenerierung | + | void doSound(void); // Teilprogramm 2: Soundgenerierung |
- | void sound_Display(void); // Anzeige zu Teilprogramm 2 | + | void showSoundDisplay(void); // Anzeige zu Teilprogramm 2 |
- | + | ||
- | void logicFunctions(void); // Teilprogramm 3: Logische Funktionen | + | void doLogicFunctions(void); // Teilprogramm 3: Logische Funktionen |
- | void logic_Display(void); // Anzeige zu Teilprogramm 3 | + | void showLogicDisplay(void); // Anzeige zu Teilprogramm 3 |
- | + | ||
- | void counterProg(void); // Teilprogramm 4: Zaehler | + | void doCounterProg(void); // Teilprogramm 4: Zaehler |
- | void counter_Display(void); // Anzeige zu Teilprogramm 4 | + | void showCounterDisplay(void); |
+ | |||
// Hauptprogramm ============================================================== | // Hauptprogramm ============================================================== | ||
+ | | ||
int main() | int main() | ||
- | { | + | { |
- | initTaster(); | + | |
initDisplay(); | initDisplay(); | ||
- | + | | |
TCCR2A = 0; // Timer 2 auf " | TCCR2A = 0; // Timer 2 auf " | ||
TCCR2B |= (1<< | TCCR2B |= (1<< | ||
TIMSK2 |= (1<< | TIMSK2 |= (1<< | ||
+ | | ||
sei(); | sei(); | ||
+ | | ||
while(1) // | while(1) // | ||
{ | { | ||
switch(modus) // | switch(modus) // | ||
{ | { | ||
- | case 0: // Modus 0: Hauptmenu | + | case 0: // Modus 0: Hauptmenu |
- | mainMenu(); | + | showMainDisplay(); |
+ | getChoiceInMainMenu(); | ||
break; | break; | ||
+ | | ||
case 1: // Modus 1: Blinkende LED | case 1: // Modus 1: Blinkende LED | ||
- | blinkingLED(); // Programm laeuft bis zum Abbruch | + | doBlinkingLed(); // Programm laeuft bis zum Abbruch |
modus = 0; // danach auf Hauptmenu zurueckschalten | modus = 0; // danach auf Hauptmenu zurueckschalten | ||
- | mainDisplay(); | ||
break; | break; | ||
+ | | ||
case 2: // Modus 2: Soundgenerierung | case 2: // Modus 2: Soundgenerierung | ||
- | sound(); // Programm laeuft bis zum Abbruch | + | doSound(); // Programm laeuft bis zum Abbruch |
modus = 0; // danach auf Hauptmenu zurueckschalten | modus = 0; // danach auf Hauptmenu zurueckschalten | ||
- | mainDisplay(); | ||
break; | break; | ||
+ | | ||
case 3: // Modus 3: Logische Funktionen | case 3: // Modus 3: Logische Funktionen | ||
- | logicFunctions(); // Programm laeuft bis zum Abbruch | + | doLogicFunctions(); // Programm laeuft bis zum Abbruch |
modus = 0; // danach auf Hauptmenu zurueckschalten | modus = 0; // danach auf Hauptmenu zurueckschalten | ||
- | mainDisplay(); | ||
break; | break; | ||
- | + | | |
case 4: // Modus 4: Up-Down-Counter | case 4: // Modus 4: Up-Down-Counter | ||
- | counterProg(); // Programm laeuft bis zum Abbruch | + | doCounterProg(); // Programm laeuft bis zum Abbruch |
modus = 0; // danach auf Hauptmenu zurueckschalten | modus = 0; // danach auf Hauptmenu zurueckschalten | ||
- | mainDisplay(); | ||
break; | break; | ||
} | } | ||
Zeile 214: | Zeile 207: | ||
return 0; | return 0; | ||
} | } | ||
- | + | | |
+ | |||
// Interrupt-Routine ========================================================== | // Interrupt-Routine ========================================================== | ||
ISR(TIMER2_OVF_vect) | ISR(TIMER2_OVF_vect) | ||
+ | | ||
// In der Interrupt-Routine sind die Softwareteiler realisiert, durch die Takt- | // In der Interrupt-Routine sind die Softwareteiler realisiert, durch die Takt- | ||
// botschaften (10ms, 100ms) erzeugt werden. Die Interrupts werden von Timer 2 | // botschaften (10ms, 100ms) erzeugt werden. Die Interrupts werden von Timer 2 | ||
// ausgeloest. | // ausgeloest. | ||
+ | | ||
{ | { | ||
timertick = 1; // Botschaft 0,166ms senden | timertick = 1; // Botschaft 0,166ms senden | ||
Zeile 228: | Zeile 221: | ||
if (vorteiler==0) // | if (vorteiler==0) // | ||
{ | { | ||
- | vorteiler = VORTEILER_WERT; | + | vorteiler = VORTEILER_WERT; |
- | takt10ms = 1; | + | takt10ms = 1; |
readButton(); | readButton(); | ||
- | --hundertstel; | + | --hundertstel; |
- | + | | |
- | if (hundertstel==0) // wenn 0 erreicht: 100ms abgelaufen | + | if (hundertstel==0) // wenn 0 erreicht: 100ms abgelaufen |
{ | { | ||
hundertstel = HUNDERTSTEL_WERT; | hundertstel = HUNDERTSTEL_WERT; | ||
- | takt100ms = 1; | + | takt100ms = 1; |
- | + | | |
- | } | + | } |
} | } | ||
} | } | ||
- | // Taster initialisieren ======================================================= | + | |
- | void initTaster(void) | + | |
- | { | + | |
- | DDRB = DDRB & 0xE1; // Port B auf Eingabe schalten | + | |
- | PORTB |= 0x1E; | + | |
- | _delay_us(10); | + | |
- | } | + | |
// Funktion Tasten einlesen =================================================== | // Funktion Tasten einlesen =================================================== | ||
void readButton(void) | void readButton(void) | ||
{ | { | ||
+ | // | ||
+ | // | ||
+ | DDRC = DDRC & | ||
+ | PORTC = 0b00001111; | ||
+ | _delay_us(1); | ||
+ | |||
// Einlesen der 4 Tastensignale | // Einlesen der 4 Tastensignale | ||
- | sw1_neu = (PINB & (1 << | + | sw1_neu = (PINC & (1 << |
- | sw2_neu = (PINB & (1 << | + | sw2_neu = (PINC & (1 << |
- | sw3_neu = (PINB & (1 << | + | sw3_neu = (PINC & (1 << |
- | sw4_neu = (PINB & (1 << | + | sw4_neu = (PINC & (1 << |
+ | |||
+ | DDRC = DDRC | 0b00001111; | ||
// Auswerten der Flanken beim Druecken | // Auswerten der Flanken beim Druecken | ||
- | + | | |
- | if ((sw1_neu==0)& | + | if ((sw1_neu==0)& |
- | sw1_slope = 1; | + | sw1_slope = 1; |
- | + | ||
- | if ((sw2_neu==0)& | + | if ((sw2_neu==0)& |
- | sw2_slope = 1; | + | sw2_slope = 1; |
- | + | | |
- | if ((sw3_neu==0)& | + | if ((sw3_neu==0)& |
- | sw3_slope = 1; | + | sw3_slope = 1; |
- | + | | |
- | if ((sw4_neu==0)& | + | if ((sw4_neu==0)& |
- | sw4_slope = 1; | + | sw4_slope = 1; |
- | + | ||
- | // Zwischenspeichern aktuelle Tastenwerte | + | // Zwischenspeichern aktuelle Tastenwerte |
sw1_alt = sw1_neu; | sw1_alt = sw1_neu; | ||
- | sw2_alt = sw2_neu; | + | sw2_alt = sw2_neu; |
sw3_alt = sw3_neu; | sw3_alt = sw3_neu; | ||
- | sw4_alt = sw4_neu; | + | sw4_alt = sw4_neu; |
} | } | ||
- | + | | |
// Initialisierung Display-Anzeige ============================================ | // Initialisierung Display-Anzeige ============================================ | ||
- | void initDisplay() // Start der Funktion | + | void initDisplay() |
{ | { | ||
- | lcd_init(); | + | lcd_init(); |
- | + | | |
- | lcd_gotoxy(0, | + | lcd_gotoxy(0, |
lcd_putstr(" | lcd_putstr(" | ||
- | + | | |
- | lcd_gotoxy(1, | + | lcd_gotoxy(1, |
- | lcd_putstr(" | + | lcd_putstr(" |
+ | |||
_delay_ms(2000); | _delay_ms(2000); | ||
- | + | | |
- | mainDisplay(); | + | showMainDisplay(); |
} | } | ||
- | + | | |
+ | |||
// Anzeige Hauptmenu ========================================================== | // Anzeige Hauptmenu ========================================================== | ||
- | void mainDisplay() | + | void showMainDisplay() |
{ | { | ||
- | lcd_gotoxy(0, | + | lcd_gotoxy(0, |
lcd_putstr(" | lcd_putstr(" | ||
- | + | | |
- | lcd_gotoxy(1, | + | lcd_gotoxy(1, |
- | lcd_putstr(" | + | lcd_putstr(" |
- | + | ||
- | } // Ende der Funktion | + | } |
- | + | ||
- | + | ||
/* Teilprogramm 1: Blinkende LED ============================================== | /* Teilprogramm 1: Blinkende LED ============================================== | ||
- | + | | |
- | Funktion: Die gelbe LED (LED 3) auf dem MiniMEXLE-Board | + | Funktion: Die gelbe LED (LED 3) in der Schaltung |
Periodendauer von 2 Sekunden (1 s ein, 1 s aus). Auf dem LCD- | Periodendauer von 2 Sekunden (1 s ein, 1 s aus). Auf dem LCD- | ||
Display wird rechts unten der Wert der LED (" | Display wird rechts unten der Wert der LED (" | ||
Zahl dargestellt. Abbruch mit Taste S1 nach voller Periode. | Zahl dargestellt. Abbruch mit Taste S1 nach voller Periode. | ||
- | + | | |
- | Displayanzeige: | + | Displayanzeige: |
|P1: Blinking LED| | |P1: Blinking LED| | ||
- | |Home | + | |Home 1| |
+----------------+ | +----------------+ | ||
- | + | | |
- | Tastenfunktion: | + | Tastenfunktion: |
+ | |||
============================================================================ */ | ============================================================================ */ | ||
- | void blinkingLED() | + | void doBlinkingLed() |
{ | { | ||
- | + | | |
- | blinkingLED_Display(); // Initialisierung Display | + | showBlinkingLedDisplay(); |
- | SET_BIT(DDRB, | + | SET_BIT(DDRB, |
- | + | | |
- | while(!sw1_slope) | + | while(!sw1_slope) // unendliche Schleife |
{ | { | ||
- | SET_BIT(PORTB, | + | SET_BIT(PORTB, |
lcd_gotoxy(1, | lcd_gotoxy(1, | ||
- | lcd_putc(EINS); // Anzeige LED-Wert " | + | lcd_putc(ASC_ONE); // Anzeige LED-Wert " |
- | + | ||
- | _delay_ms(1000); | + | _delay_ms(WAIT_LED); |
- | + | ||
- | CLR_BIT(PORTB, | + | CLR_BIT(PORTB, |
lcd_gotoxy(1, | lcd_gotoxy(1, | ||
- | lcd_putc(NULL); // Anzeige LED-Wert " | + | lcd_putc(ASC_ZERO); // Anzeige LED-Wert " |
- | + | ||
- | _delay_ms(1000); | + | _delay_ms(WAIT_LED); |
- | + | ||
- | } // Ende der Warteschleife | + | } // Ende der Warteschleife |
- | + | ||
- | sw1_slope = 0; // Alle Flankenbits loeschen | + | sw1_slope = 0; |
sw2_slope = 0; | sw2_slope = 0; | ||
sw3_slope = 0; | sw3_slope = 0; | ||
sw4_slope = 0; | sw4_slope = 0; | ||
- | } // zurück zur Hauptschleife | + | } |
- | + | ||
+ | |||
// Anzeige zu Teilprogramm 1 | // Anzeige zu Teilprogramm 1 | ||
- | void blinkingLED_Display() // Start der Funktion | + | void showBlinkingLedDisplay() |
{ | { | ||
- | lcd_init(); | + | lcd_gotoxy(0, |
- | + | ||
- | lcd_gotoxy(0, | + | |
lcd_putstr(" | lcd_putstr(" | ||
- | + | | |
- | lcd_gotoxy(1, | + | lcd_gotoxy(1, |
- | lcd_putstr(" | + | lcd_putstr(" |
- | + | ||
- | } // Ende der Funktion | + | } |
- | + | ||
- | + | ||
- | + | ||
/* Teilprogramm 2: Soundgenerierung =========================================== | /* Teilprogramm 2: Soundgenerierung =========================================== | ||
- | + | | |
- | Funktion: Auf dem kleinen Lautsprecher | + | Funktion: Auf dem kleinen Lautsprecher (Buzzer) |
wird ein sirenenartiger Sound ausgegeben. Zwischen den auf- | wird ein sirenenartiger Sound ausgegeben. Zwischen den auf- | ||
und absteigenden Tönen bleibt die Frequenz kurz stabil. | und absteigenden Tönen bleibt die Frequenz kurz stabil. | ||
Zeile 382: | Zeile 369: | ||
Die jeweilige Periodendauer wird dreistellig in Timerticks | Die jeweilige Periodendauer wird dreistellig in Timerticks | ||
auf der Anzeige rechts unten dargestellt. | auf der Anzeige rechts unten dargestellt. | ||
- | + | | |
- | Displayanzeige: | + | Displayanzeige: |
|P2: Create Sound| | |P2: Create Sound| | ||
- | |Home | + | |Home 123| |
+----------------+ | +----------------+ | ||
- | + | | |
- | Tastenfunktion: | + | Tastenfunktion: |
gesamten Sound-Zyklus | gesamten Sound-Zyklus | ||
+ | | ||
============================================================================ */ | ============================================================================ */ | ||
- | void sound() | + | void doSound() |
{ | { | ||
- | unsigned char temp = 0; // lokale Variable | + | unsigned char temp = 0; // lokale Variable |
- | + | ||
- | sound_Display(); // Anzeige zum Programm | + | showSoundDisplay(); // Anzeige zum Programm |
+ | |||
// Ports initialisieren | // Ports initialisieren | ||
- | + | | |
- | DDRB |= (1<<DDB0); // Port B, Pin 0 (zur LED) auf Ausgang | + | DDRB |= (1<<DDB2); // Port B, Pin 0 (zur LED) auf Ausgang |
DDRD |= (1<< | DDRD |= (1<< | ||
- | + | | |
- | initTimer0(); | + | initTimer0(); |
- | + | ||
- | while(!sw1_slope) // Solange keine Flanke auf SW1: Warteschleife | + | while(!sw1_slope) // Solange keine Flanke auf SW1: Warteschleife |
{ | { | ||
for (OCR0A=MAX_PER; | for (OCR0A=MAX_PER; | ||
{ | { | ||
- | temp = OCR0A; // Anzeige des aktuellen Periodenzaehlers | + | temp = OCR0A; // Anzeige des aktuellen Periodenzaehlers |
lcd_gotoxy(1, | lcd_gotoxy(1, | ||
- | lcd_putc(temp/ | + | lcd_putc(temp/ |
temp = temp%100; | temp = temp%100; | ||
- | lcd_putc(temp/ | + | lcd_putc(temp/ |
- | lcd_putc(temp%10 + NULL); // Einer als ASCII ausgeben | + | lcd_putc(temp%10 + ASC_ZERO); |
- | + | ||
- | _delay_ms(100); | + | _delay_ms(100); |
- | + | | |
- | if(sw1_slope) // Schleifenabbruch, | + | if(sw1_slope) // Schleifenabbruch, |
{ | { | ||
- | TCCR0A = 0; // Timer 0 stoppen: Sound ausschalten | + | TCCR0A = 0; // Timer 0 stoppen: Sound ausschalten |
- | + | | |
- | sw1_slope = 0; // alle Flankenbits loeschen | + | sw1_slope = 0; |
sw2_slope = 0; | sw2_slope = 0; | ||
sw3_slope = 0; | sw3_slope = 0; | ||
sw4_slope = 0; | sw4_slope = 0; | ||
- | + | | |
return; | return; | ||
- | } | + | } |
} | } | ||
- | _delay_ms(WAIT_TIME); // Wartezeit hohe Frequenz | + | _delay_ms(WAIT_SND); |
- | + | ||
- | for (OCR0A=MIN_PER; | + | for (OCR0A=MIN_PER; |
{ | { | ||
- | temp = OCR0A; // Anzeige des aktuellen Periodenzaehlers | + | temp = OCR0A; // Anzeige des aktuellen Periodenzaehlers |
lcd_gotoxy(1, | lcd_gotoxy(1, | ||
- | lcd_putc(temp/ | + | lcd_putc(temp/ |
temp = temp%100; | temp = temp%100; | ||
- | lcd_putc(temp/ | + | lcd_putc(temp/ |
- | lcd_putc(temp%10 + NULL); // Einer als ASCII ausgeben | + | lcd_putc(temp%10 + ASC_ZERO); |
- | + | ||
- | _delay_ms(100); | + | _delay_ms(100); |
- | + | | |
- | if(sw1_slope) // Schleifenabbruch, | + | if(sw1_slope) // Schleifenabbruch, |
{ | { | ||
- | TCCR0A = 0; // Timer 0 stoppen: Sound ausschalten | + | TCCR0A = 0; // Timer 0 stoppen: Sound ausschalten |
- | + | | |
- | sw1_slope = 0; // alle Flankenbits loeschen | + | sw1_slope = 0; |
sw2_slope = 0; | sw2_slope = 0; | ||
sw3_slope = 0; | sw3_slope = 0; | ||
sw4_slope = 0; | sw4_slope = 0; | ||
- | + | | |
return; | return; | ||
} | } | ||
} | } | ||
- | _delay_ms(WAIT_TIME); // Wartezeit niedrige Frequenz | + | _delay_ms(WAIT_SND); |
- | + | ||
- | } // Ende der unendlichen Schleife | + | } // Ende der unendlichen Schleife |
- | + | | |
// Nach Erkennen der Flanke von SW1 | // Nach Erkennen der Flanke von SW1 | ||
- | + | | |
- | TCCR0A = 0; // Timer 0 stoppen: Sound ausschalten | + | TCCR0A = 0; // Timer 0 stoppen: Sound ausschalten |
- | + | ||
- | sw1_slope = 0; // alle Flankenbits loeschen | + | sw1_slope = 0; |
sw2_slope = 0; | sw2_slope = 0; | ||
sw3_slope = 0; | sw3_slope = 0; | ||
sw4_slope = 0; | sw4_slope = 0; | ||
- | } // zurück zur Hauptschleife | + | } |
+ | |||
// Intialisierung des Timers 0 fuer Sounderzeugung | // Intialisierung des Timers 0 fuer Sounderzeugung | ||
void initTimer0() | void initTimer0() | ||
{ | { | ||
- | TCCR0A = (1<< | + | TCCR0A = (1<< |
- | TCCR0B = (1<< | + | TCCR0B = (1<< |
+ | |||
OCR0A = MAX_PER; | OCR0A = MAX_PER; | ||
} | } | ||
+ | | ||
// Anzeige zu Teilprogramm 2 | // Anzeige zu Teilprogramm 2 | ||
- | void sound_Display() // Start der Funktion | + | void showSoundDisplay() // Start der Funktion |
{ | { | ||
- | lcd_gotoxy(0, | + | lcd_gotoxy(0, |
lcd_putstr(" | lcd_putstr(" | ||
- | + | | |
- | lcd_gotoxy(1, | + | lcd_gotoxy(1, |
- | lcd_putstr(" | + | lcd_putstr(" |
- | + | ||
- | } // Ende der Funktion | + | } |
+ | |||
/* Teilprogramm 3: Logische Funktionen ======================================== | /* Teilprogramm 3: Logische Funktionen ======================================== | ||
- | + | | |
- | Funktion: Auf dem Display | + | Funktion: Auf dem Display werden Ergebnisse von |
logischen Verknuepfungen (UND, ODER, NOT, XOR) dargestellt. | logischen Verknuepfungen (UND, ODER, NOT, XOR) dargestellt. | ||
Die logischen Eingangssignale werden von den Tasten S3 und S4 | Die logischen Eingangssignale werden von den Tasten S3 und S4 | ||
eingelesen. | eingelesen. | ||
- | + | | |
- | Displayanzeige: | + | Displayanzeige: |
- | +----------------+ +----------------+ | + | +----------------+ |
- | |P3: Logic Funct.| |S3& | + | |P3: Logic Funct.| |
- | |Home | + | |Home | |
- | +----------------+ +----------------+ | + | +----------------+ |
- | + | ||
- | Tastenfunktion: | + | Tastenfunktion: |
- | S3: | + | S3: Logischer Eingang (ohne Entprellung) |
S4: Logischer Eingang (ohne Entprellung) | S4: Logischer Eingang (ohne Entprellung) | ||
+ | | ||
============================================================================ */ | ============================================================================ */ | ||
- | void logicFunctions() | + | void doLogicFunctions() |
{ | { | ||
- | unsigned char temp = 0; // lokale Variable | + | unsigned char temp = 0; // lokale Variable |
- | + | ||
- | logic_Display(); // Anzeige initialisieren | + | showLogicDisplay(); // Anzeige initialisieren |
- | + | ||
- | while(!sw1_slope) | + | while(!sw1_slope) // Solange keine Flanke auf SW1: Warteschleife |
{ | { | ||
- | if ((!sw3_alt)&& | + | if ((!sw3_alt)&& |
- | else temp=NULL; | + | else temp=ASC_ZERO; |
lcd_gotoxy(0, | lcd_gotoxy(0, | ||
- | lcd_putc(temp); | + | lcd_putc(temp); |
- | + | ||
- | if ((!sw3_alt)||(!sw4_alt)) temp=EINS; // Ergebnis der ODER-Verknuepfung | + | if ((!sw3_alt)||(!sw4_alt)) temp=ASC_ONE; // Ergebnis der ODER-Verknuepfung |
- | else temp=NULL; | + | else temp=ASC_ZERO; |
lcd_gotoxy(0, | lcd_gotoxy(0, | ||
- | lcd_putc(temp); | + | lcd_putc(temp); |
- | + | ||
- | if (sw3_alt) temp=EINS; // Ergebnis der Negation | + | if (sw3_alt) temp=ASC_ONE; // Ergebnis der Negation |
- | else temp=NULL; | + | else temp=ASC_ZERO; |
lcd_gotoxy(1, | lcd_gotoxy(1, | ||
- | lcd_putc(temp); | + | lcd_putc(temp); |
- | + | ||
- | if ((!sw3_alt)^(!sw4_alt)) temp=EINS; // Ergebnis der XOR-Verknuepfung | + | if ((!sw3_alt)^(!sw4_alt)) temp=ASC_ONE; // Ergebnis der XOR-Verknuepfung |
- | else temp=NULL; | + | else temp=ASC_ZERO; |
lcd_gotoxy(1, | lcd_gotoxy(1, | ||
- | lcd_putc(temp); | + | lcd_putc(temp); |
- | + | ||
- | _delay_ms(100); | + | _delay_ms(100); |
} | } | ||
- | + | | |
- | sw1_slope = 0; // alle Flankenbits loeschen | + | sw1_slope = 0; |
sw2_slope = 0; | sw2_slope = 0; | ||
sw3_slope = 0; | sw3_slope = 0; | ||
sw4_slope = 0; | sw4_slope = 0; | ||
- | } // zurück zur Hauptschleife | + | } |
- | + | ||
+ | |||
// Anzeige zu Teilprogramm 3 | // Anzeige zu Teilprogramm 3 | ||
- | void logic_Display() | + | void showLogicDisplay() |
{ | { | ||
- | lcd_gotoxy(0, | + | lcd_gotoxy(0, |
lcd_putstr(" | lcd_putstr(" | ||
- | + | | |
- | lcd_gotoxy(1, | + | lcd_gotoxy(1, |
- | lcd_putstr(" | + | lcd_putstr(" |
+ | |||
_delay_ms(2000); | _delay_ms(2000); | ||
- | + | | |
- | lcd_gotoxy(0, | + | lcd_gotoxy(0, |
lcd_putstr(" | lcd_putstr(" | ||
- | + | | |
- | lcd_gotoxy(1, | + | lcd_gotoxy(1, |
- | lcd_putstr("/ | + | lcd_putstr("/ |
} | } | ||
- | + | | |
+ | |||
/* Teilprogramm 4: Up-Down-Counter ============================================ | /* Teilprogramm 4: Up-Down-Counter ============================================ | ||
- | + | | |
- | Funktion: Es wird ein 4-stelliger Dezimal-Zaehler (0000..9999) mit | + | Funktion: Es wird ein 4-stelliger Dezimal-Zaehler (0000..9999) mit |
Anzeige und Ueber-/ Unterlauf realisiert. Das Aufwaerts- und | Anzeige und Ueber-/ Unterlauf realisiert. Das Aufwaerts- und | ||
Abwaertszaehlen wird mit zwei Tasten (S3: +) (S4: -) gesteuert. | Abwaertszaehlen wird mit zwei Tasten (S3: +) (S4: -) gesteuert. | ||
Es werden die Flanken beim Druecken der Tasten ausgewertet. | Es werden die Flanken beim Druecken der Tasten ausgewertet. | ||
Die Taste S2 dient zum Ruecksetzen des Zaehlers auf 0000. | Die Taste S2 dient zum Ruecksetzen des Zaehlers auf 0000. | ||
- | + | | |
- | Displayanzeige: | + | Displayanzeige: |
|P4: Counter 0000| | |P4: Counter 0000| | ||
|Home RES + - | | |Home RES + - | | ||
+----------------+ | +----------------+ | ||
- | + | | |
- | Tastenfunktion: | + | Tastenfunktion: |
S2 Reset Counter (ohne Entprellung) | S2 Reset Counter (ohne Entprellung) | ||
S3 Flanke: Counter++ (mit Entprellung) | S3 Flanke: Counter++ (mit Entprellung) | ||
S4 Flanke: Counter-- (mit Entprellung) | S4 Flanke: Counter-- (mit Entprellung) | ||
+ | | ||
============================================================================ */ | ============================================================================ */ | ||
- | void counterProg() | + | void doCounterProg() |
{ | { | ||
- | int temp; // lokale Variable | + | int temp; // lokale Variable |
- | + | | |
- | counter_Display(); // Anzeige initialisieren | + | showCounterDisplay(); |
+ | |||
// Auswertung der Tasten | // Auswertung der Tasten | ||
- | + | | |
- | while(!sw1_slope) // Solange keine Flanke auf SW1: Warteschleife | + | while(!sw1_slope) // Solange keine Flanke auf SW1: Warteschleife |
{ | { | ||
- | if (sw2_alt==0) // solange Taste 1 gedrueckt: | + | if (sw2_alt==0) // solange Taste 1 gedrueckt: |
- | counter = 0000; // | + | counter = 0000; // Counter auf 0000 setzen |
- | + | ||
- | if (sw3_slope) // wenn Taste 2 eben gedrueckt wurde: | + | if (sw3_slope) |
{ | { | ||
- | sw3_slope = 0; // Flankenbit loeschen | + | sw3_slope = 0; |
- | + | ||
- | counter++; | + | counter++; |
if (counter==10000) | if (counter==10000) | ||
- | counter = 0000; // auf 0000 setzen | + | counter = 0000; // auf 0000 setzen |
} | } | ||
- | + | | |
- | if (sw4_slope) // wenn Taste 3 eben gedrueckt wurde: | + | if (sw4_slope) |
{ | { | ||
- | sw4_slope = 0; // Flankenbit loeschen | + | sw4_slope = 0; |
- | + | ||
- | counter--; | + | counter--; |
if (counter< | if (counter< | ||
- | counter = 9999; | + | counter = 9999; // auf 9999 setzen |
} | } | ||
- | + | | |
- | _delay_ms(100); | + | _delay_ms(100); |
- | + | | |
// Anzeige der Werte | // Anzeige der Werte | ||
- | + | | |
- | lcd_gotoxy(0, | + | lcd_gotoxy(0, |
- | + | | |
temp = counter; | temp = counter; | ||
- | lcd_putc(temp/ | + | lcd_putc(temp/ |
- | + | ||
- | temp = temp%1000; // Rest = Hunderter, Zehner, Einer | + | temp = temp%1000; // Rest = Hunderter, Zehner, Einer |
- | lcd_putc(temp/ | + | lcd_putc(temp/ |
+ | |||
temp = temp%100; | temp = temp%100; | ||
- | lcd_putc(temp/ | + | lcd_putc(temp/ |
- | lcd_putc(temp%10+NULL); // Einer ausgeben | + | lcd_putc(temp%10+ASC_ZERO); // Einer ausgeben |
} | } | ||
- | + | | |
- | sw1_slope = 0; // alle Flankenbits loeschen | + | sw1_slope = 0; |
sw2_slope = 0; | sw2_slope = 0; | ||
sw3_slope = 0; | sw3_slope = 0; | ||
sw4_slope = 0; | sw4_slope = 0; | ||
- | } // zurück zur Hauptschleife | + | } |
- | + | ||
+ | |||
// Anzeige zu Teilprogramm 4 | // Anzeige zu Teilprogramm 4 | ||
- | void counter_Display() | + | void showCounterDisplay() |
{ | { | ||
- | lcd_gotoxy(0, | + | lcd_gotoxy(0, |
lcd_putstr(" | lcd_putstr(" | ||
- | + | | |
- | lcd_gotoxy(1, | + | lcd_gotoxy(1, |
- | lcd_putstr(" | + | lcd_putstr(" |
} | } | ||
- | + | | |
- | // Hauptmenu | + | // Auswahl im Hauptmenu |
- | void mainMenu() | + | void getChoiceInMainMenu() |
{ | { | ||
- | if (sw1_slope) // Wenn Flanke auf Taste 1 | + | if (sw1_slope) |
{ | { | ||
- | sw1_slope=0; | + | sw1_slope=0; |
- | modus=1; | + | modus=1; |
} | } | ||
- | + | | |
- | if (sw2_slope) // Wenn Flanke auf Taste 2 | + | if (sw2_slope) |
{ | { | ||
- | sw2_slope=0; | + | sw2_slope=0; |
- | modus=2; | + | modus=2; |
} | } | ||
- | + | | |
- | if (sw3_slope) // Wenn Flanke auf Taste 3 | + | if (sw3_slope) |
{ | { | ||
- | sw3_slope=0; | + | sw3_slope=0; |
- | modus=3; | + | modus=3; |
} | } | ||
- | + | | |
- | if (sw4_slope) // Wenn Flanke auf Taste 4 | + | if (sw4_slope) |
{ | { | ||
- | sw4_slope=0; | + | sw4_slope=0; |
- | modus=4; | + | modus=4; |
} | } | ||
} | } | ||
</ | </ | ||
</ | </ | ||
+ | |||
''/ | ''/ | ||
Zeile 683: | Zeile 671: | ||
\\ \\ | \\ \\ | ||
- Hier wird wieder geprüft ob die Frequenz des Quarz bereits eingestellt wurde und - falls nicht - dessen Frequenz eingestellt. \\ \\ \\ \\ | - Hier wird wieder geprüft ob die Frequenz des Quarz bereits eingestellt wurde und - falls nicht - dessen Frequenz eingestellt. \\ \\ \\ \\ | ||
- | - Die Header-Dateien entsprechen denen der letzten Programme. | + | - Die Header-Dateien entsprechen denen der letzten Programme. \\ \\ \\ \\ \\ |
- | - Auch die Makros entsprechen denen der letzten Programme. | + | - Auch die Makros entsprechen denen der letzten Programme. \\ \\ \\ \\ \\ |
- | - Die Konstanten entsprechen denen der letzten Programme. \\ \\ \\ \\ \\ \\ | + | - Die Konstanten entsprechen denen der letzten Programme. |
- | - Auch die Variablen | + | - Auch die anfänglichen |
- | - In '' | + | - Wird die Taste S1 gedrückt, so wird '' |
- | - '' | + | - Wird eine ansteigende Flanke der Taste S1 gedrückt, so wird '' |
- | - Wird die Taste S1 gedrückt, so wird '' | + | - Bei den Funktionsprototypen sind einige bekannte Unterprogramme vorhanden. Details werden weiter unten erklärt. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ |
- | - Die Makros wurden bereits | + | |
- | - Die Funktionsprototypen zeigen wieder die kommenden Unterprogramme an \\ \\ | + | |
'' | '' | ||
- Zunächst werden zwei Initialisierungsroutinen aufgerufen (siehe weiter unten) | - Zunächst werden zwei Initialisierungsroutinen aufgerufen (siehe weiter unten) | ||
- | - Dann werden die " | + | - Dann werden die " |
- | - '' | + | - Auch hier gibt es eine " |
- | - erst mit dem Befehl '' | + | - Mit dem Befehl '' |
- | - in der Endlosschleife | + | - in der Endlosschleife |
- | - Die Abfrage der Tasten soll entprellt geschehen. Das ist durch das Abtasten / Einlesen des Signals alle $10ms$ möglich. | + | - Beim '' |
- | - Für die Textanzeige ist eine keine ruckelfreie Darstellung notwendig. Damit kann für die Darstellung | + | |
'' | '' | ||
- | - Mit dem Befehl '' | + | - Mit dem Befehl '' |
- | - Der Überlauf-Interrupt durch den Timer0 | + | - Der Überlauf-Interrupt durch den Timer2 |
- | - Als erstes wird beim Ausführen die boole-Variable '' | + | - Die Ermittlung von '' |
- | - Die Variable | + | - Eine große Änderung ist, dass bereits im Interrupt |
- | - Wenn '' | + | '' |
- | - Erreicht '' | + | |
- | - Mit dieser Methode erzeugt der Interrupt | + | |
- | '' | + | |
- | - Das Einstellen des Data Direction Registers und der Pullups wurde bereits in vorherigen Programmen erklärt. | + | |
- | '' | + | |
\\ \\ \\ | \\ \\ \\ | ||
- | - Zunächst | + | - In dieser Funktion |
- | - Für die Reaktion auf einen Tastendruck gibt es nun zwei Varianten: \\ a. immer wenn erkannt wird, dass die Taste gedrückt ist (der Schalter geschlossen ist), wird reagiert. \\b. nur beim Wechsel von 'Taster nicht gedrückt' | + | - Neu hier ist, dass über '' |
- | - Im Falle das Heraufzählens, | + | |
- | - Zum Ende dieser Funktion müssen die Schalterstellungen in die Variablen '' | + | |
- | \\ \\ | + | |
- | '' | + | |
- | - Zur Ausgabe des Zählerwerts wird eine Hilfsvariable angelegt und auf eine Position unten rechts auf dem Display gesprungen | + | |
- | - Um den Wert '' | + | |
- | - Für die Hunderterstelle von '' | + | |
'' | '' | ||
- | - Hier wird wieder die Startanzeige mit dem Namen des Programms | + | - Die Funktion '' |
+ | - Danach wird der erste Text auf den Bildschirm geschrieben und damit der Programmname dargestellt. | ||
+ | - Nach zwei Sekunden wird der Auswahlbildschirm angezeigt. | ||
+ | \\ \\ \\ \\ \\ \\ | ||
+ | |||
+ | '' | ||
+ | - Da der Auswahlbildschirm mit dem Hauptmenu nicht nur beim Start, sondern auch nach jeder Rückkehr aus Unterprogrammen dargestellt werden muss, wird der Auswahlbildschirm in einem neuen Unterprogramm angezeigt. | ||
+ | |||
+ | \\ \\ \\ \\ \\ | ||
+ | |||
+ | ''/ | ||
+ | |||
+ | Hier ist das Programm der [[1_hello_blinking_world|Blinking LED]] etwas angepasst eingefügt. | ||
+ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
+ | - Zunächst wird ein Unterprogramm zur Anzeige das Displays aufgerufen | ||
+ | - '' | ||
+ | - Die Schleife wird solange ausgeführt, | ||
+ | - Beim Aktivieren der LED wird auch auf dem Display eine '' | ||
+ | - Nach einer Sekunde wird die LED ausgeschalten und auf dem Display eine '' | ||
+ | - Nach Beendigung der Schleife werden alle Flanken gelöscht. Damit wird verhindert, dass beim Aufruf des Hauptmenus sofort ein Sprung in ein Unterprogramm ausgeführt wird. | ||
+ | |||
+ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
+ | ''/ | ||
+ | |||
+ | Hier ist das Programm [[2_sound_und_timer|Sound und Timer]] etwas angepasst eingefügt. | ||
+ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
+ | |||
+ | - Die Port Initialisierung, | ||
+ | - Hier wird Timer 0 genutzt, um das gepulste Signal an den Lautsprecher zu verändern. | ||
+ | - Die while-Schleife wird wieder abgebrochen, | ||
+ | - Neben dem Herunterzählen der Periodenlänge (über '' | ||
+ | - Da die for-Schleife zum Herunterzählen der Periodenlänge sehr lange dauert (etwa 2 Sekunden) wird auch darin der Tastendruck der Taste 1 abgefragt werden. \\ \\ \\ \\ \\ | ||
+ | - Falls die Taste 1 gedrückt wurde, wird sowohl __in der for__-Schleife, | ||
+ | - Das Heraufzählen der Frequenz gleich dem Herunterzählen, | ||
+ | |||
+ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
+ | ''/ | ||
+ | |||
+ | Hier ist das Programm [[3_logische_funktionen|Logische Funktionen]] etwas angepasst eingefügt. | ||
+ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
+ | |||
+ | - Durch den Anschluss des Tasters zwischen Port und Masse erzeugt ein geschlossener ein LOW Signal (logisch 0). Hier sollen aber nun der Tastendruck dem Wert HIGH (logisch 1) entsprechen. Aus diesem Grund sind die Tasterwerte in den Bedingungen negiert, z.B. '' | ||
+ | |||
+ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
+ | ''/ | ||
+ | |||
+ | Hier ist das Programm [[4_up_down_counter|Up/ | ||
+ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
+ | |||
+ | - Im wesentlichen gleicht das Programm dem bereits bekanntem. Es kann aber auf die bereits berechnete Flanken '' | ||
+ | |||
+ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
+ | '' | ||
+ | |||
+ | - Je nach gedrückter Taste wird hier die Variable '' | ||
+ | |||
</ | </ | ||
+ | |||
<-- | <-- | ||
--> IV. Ausführung in Simulide # | --> IV. Ausführung in Simulide # | ||
- | - Geben Sie die oben dargestellten Codezeilen | + | - Geben Sie die oben dargestellten Codezeilen ein und kompilieren Sie den Code. |
- Öffnen Sie Ihre hex-Datei in SimulIDE und testen Sie, ob diese die gleiche Ausgabe erzeugt | - Öffnen Sie Ihre hex-Datei in SimulIDE und testen Sie, ob diese die gleiche Ausgabe erzeugt | ||
Zeile 740: | Zeile 769: | ||
--> Aufgaben# | --> Aufgaben# | ||
- | - Erweiterung der des Zählers: | ||
- | - Bauen Sie den Zähler so um, dass er jede Sekunde um 1 nach oben zählt. | ||
- | - Ändern Sie die Funktionsweise der Tasten S2 und S3 so, dass diese die Zählrichtung angeben. | ||
- | - Variation der Eingabe | ||
- | - Fügen Sie einen weiteren Schalter S4 hinzu. | ||
- | - Mit diesem Schalter | ||
- | - ++ Tipp 1| Ändern Sie das herauf-/ | ||
- | - ++ Tipp 2| Wie muss die neue Variable bei Tastendruck auf S4 geändert werden? Wann muss die neue Variable wieder zurückgesetzt werden? | ||
- | <-- | + | Vielleicht haben Sie es schon bemerkt: gelegentlich scheint das Display für einen kurzen Augenblick einzelne falsche Zeichen anzuzeigen. |
+ | Der Grund dafür ist, dass das Auslesen der Taster und die Datenübertragung an das Display über die gleichen Pins stattfindet und nicht synchronisiert ist. | ||
+ | Um dies zu beheben ist eine Verbesserung des Programms notwendig. | ||
+ | Speicherauslastung und Programmoptimierung: | ||
+ | - Merken Sie sich die Speicherauslastung des bisherigen Programms. Diese finden Sie z.B. über den Solution Explorer: '' | ||
+ | - Der oben gezeigte Code wurde in zwei Schritten optimiert: Erster Schritt war {{microcontrollertechnik: | ||
+ | - Wie funktioniert die optimierte Funktionen '' | ||
+ | - Für was wird der Array '' | ||
+ | - Für zweite Version wurde gänzlich auf Delays im Millisekundenbereich verzichtet: {{microcontrollertechnik: | ||
+ | - Analysieren Sie die '' | ||
+ | - Alle Unterfunktionen wurden in separate Dateien ausgelagert. '' | ||
+ | |||
+ | <-- | ||