Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
microcontrollertechnik:7_uhr_und_zeitraster [2020/10/16 10:19] tfischer |
microcontrollertechnik:7_uhr_und_zeitraster [2024/01/22 13:46] (aktuell) mexleadmin |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== 7. Uhr und Zeitraster ====== | + | ====== 7 Uhr und Zeitraster ====== |
==== Ziele ==== | ==== Ziele ==== | ||
Zeile 5: | Zeile 5: | ||
Nach dieser Lektion sollten Sie: | Nach dieser Lektion sollten Sie: | ||
- | - wissen, wie man .... | + | - wissen, wie man aus den auf Interupt-basierten Zeitrastern langsamere Raster umsetzt. |
==== Übung ==== | ==== Übung ==== | ||
--> I. Vorarbeiten # | --> I. Vorarbeiten # | ||
- Laden Sie folgende Datei herunter: | - Laden Sie folgende Datei herunter: | ||
- | - {{microcontrollertechnik: | + | - {{microcontrollertechnik: |
- | - {{microcontrollertechnik: | + | - {{microcontrollertechnik: |
- {{microcontrollertechnik: | - {{microcontrollertechnik: | ||
Zeile 17: | 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 eine Uhr mit dem Format HH:MM:SS Menu zu sehen | - Als nächstes ist im Display eine Uhr mit dem Format HH:MM:SS Menu zu sehen | ||
Zeile 25: | Zeile 26: | ||
<-- | <-- | ||
- | --> III. Eingabe in Atmel Studio # | + | --> III. Eingabe in Microchip |
<WRAP group>< | <WRAP group>< | ||
- | /* ============================================================================ | ||
- | Experiment 7: 7_mexleclock mit Stunden-, Minuten- und Sekunden-Anzeige | + | /* ============================================================================ |
- | ============= ========================================================= | + | |
- | + | Experiment 7: | |
- | Dateiname: 7_MexleClock.c | + | ============= |
- | + | ||
- | Autoren: Peter Blinzinger | + | Dateiname: |
- | Prof. G. Gruhler (Hochschule Heilbronn) | + | |
- | D. Chilachava (Georgische Technische Universitaet) | + | Autoren: |
- | + | Prof. G. Gruhler (Hochschule Heilbronn) | |
- | Version: 1.2 vom 01.05.2020 | + | D. Chilachava |
- | + | ||
- | Hardware: MEXLE2020 Ver. 1.0 oder höher | + | Version: |
- | AVR-USB-PROGI Ver. 2.0 | + | |
- | + | Hardware: | |
- | Software: Entwicklungsumgebung: | + | AVR-USB-PROGI Ver. 2.0 |
- | C-Compiler: AVR/GNU C Compiler 5.4.0 | + | |
- | + | Software: | |
- | Funktion: Digitaluhr mit Anzeige von Stunden, Minuten und Sekunden. Eine | + | C-Compiler: AVR/GNU C Compiler 5.4.0 |
- | einfache Stellfunktion ist mit den Tasten S2 und S3 realisiert. | + | |
- | + | Funktion: | |
- | Displayanzeige: | + | einfache Stellfunktion ist mit den Tasten S2 und S3 realisiert. |
- | +----------------+ +----------------+ | + | |
- | |- Experiment 7 -| |=== 00:00:00 ===| | + | Displayanzeige: |
- | | Digital Clock | | Std Min | | + | +----------------+ |
- | +----------------+ +----------------+ | + | |- Experiment 7 -| |=== 00:00:00 ===| |
- | + | | Digital Clock | | Std Min | | |
- | Tastenfunktion: | + | +----------------+ |
- | S3: Min (zaehlt Minuten bei Flanke aufwaerts. Überlauf bei 60) | + | |
- | (setzt Sekunden beim Druecken zurueck auf 00) | + | Tastenfunktion: |
- | + | S3: Min (zaehlt Minuten bei Flanke aufwaerts. Überlauf bei 60) | |
- | Jumperstellung: | + | (setzt Sekunden beim Druecken zurueck auf 00) |
- | + | ||
- | Fuses im uC: CKDIV8: Aus (keine generelle Vorteilung des Takts) | + | Jumperstellung: |
- | + | ||
- | Header-Files: | + | Fuses im uC: CKDIV8: Aus (keine generelle Vorteilung des Takts) |
- | + | ||
- | Module: 1) Taktgenerator | + | Header-Files: |
- | 2) Zaehler fuer Uhr (Takt: 1 s) | + | |
- | 3) Anzeigetreiber | + | Module: |
- | 4) Stellfunktion | + | 2) Zaehler fuer Uhr (Takt: 1 s) |
- | + | 3) Anzeigetreiber | |
- | Modul 1: Das Modul " | + | 4) Stellfunktion |
- | Zusaetzliche Takte: 10 ms fuer Stellfunktion | + | |
- | | + | Modul 1: Das Modul " |
- | + | Zusaetzliche Takte: 10 ms fuer Stellfunktion | |
- | Verwendung von Hardware-Timer 0 und T0 Overflow-Interrupt. | + | |
- | Frequenzen: Quarzfrequenz | + | |
- | | + | Verwendung von Hardware-Timer 0 und T0 Overflow-Interrupt. |
- | Hardware-Timer | + | Frequenzen: Quarzfrequenz |
- | Software-Vorteiler | + | Timer-Vorteiler |
- | Hundertstel-Zaehler / | + | Hardware-Timer |
- | Zehntel-Zaehler / 10 => | + | Software-Vorteiler |
- | + | Hundertstel-Zaehler / 10 => 10 Hz / 100 ms | |
- | Modul 2: Das Modul " | + | Zehntel-Zaehler |
- | Sekunden, Minuten und Stunden werden als Binaerzahlen gezaehlt | + | |
- | Sekunden und Minuten zaehlen 00..59, die Stunden 00..23. | + | Modul 2: Das Modul " |
- | Ein " | + | Sekunden, Minuten und Stunden werden als Binaerzahlen gezaehlt |
- | + | Sekunden und Minuten zaehlen 00..59, die Stunden 00..23. | |
- | Modul 3: Das Modul " | + | Ein " |
- | Hintergrundinformationen und die aktuelle Uhrzeit aus. | + | |
- | Darstellung auf der Anzeige (mittig in Zeile 1): [23: | + | Modul 3: Das Modul " |
- | + | Hintergrundinformationen und die aktuelle Uhrzeit aus. | |
- | Modul 4: Das Modul " | + | Darstellung auf der Anzeige (mittig in Zeile 1): [23: |
- | Es dient 1. zum Einlesen und Entprellen der Stelltasten | + | |
- | | + | Modul 4: Das Modul " |
- | 2. zum Ausfuehren der Stellfunktion: | + | Es dient 1. zum Einlesen und Entprellen der Stelltasten |
- | | + | |
- | | + | 2. zum Ausfuehren der Stellfunktion: |
- | | + | |
- | (einfache Synchronisierung der Uhr!) | + | |
- | Beim Stellen kein Uebertrag von den Minuten auf die Stunden. | + | |
+ | (einfache Synchronisierung der Uhr!) | ||
+ | Beim Stellen kein Uebertrag von den Minuten auf die Stunden. | ||
+ | |||
+ | Die Kopplung der Module wird ueber global definierte Variable realisiert: | ||
+ | |||
+ | 1-Bit-Variable: | ||
+ | takt100ms: | ||
+ | takt1s: | ||
+ | |||
+ | 8-Bit-Variable: | ||
+ | minuten | ||
+ | stunden | ||
- | Die Kopplung der Module wird ueber global definierte Variable realisiert: | ||
- | |||
- | | ||
- | takt100ms: | ||
- | takt1s: | ||
- | |||
- | 8-Bit-Variable: | ||
- | minuten | ||
- | stunden | ||
- | |||
=============================================================================*/ | =============================================================================*/ | ||
+ | |||
// Deklarationen ============================================================== | // Deklarationen ============================================================== | ||
+ | |||
// Festlegung der Quarzfrequenz | // Festlegung der Quarzfrequenz | ||
- | #ifndef F_CPU // optional definieren | + | #ifndef F_CPU |
- | #define F_CPU 12288000UL // ATmega | + | #define F_CPU 18432000UL |
- | #endif | + | # |
+ | |||
// Include von Header-Dateien | // Include von Header-Dateien | ||
- | #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) |
+ | |||
// Konstanten | // Konstanten | ||
- | # | + | # |
- | # | + | # |
- | # | + | # |
- | + | ||
- | #define SPEAK_PORT PORTD // Port-Adresse fuer Lautsprecher | + | #define SPEAK_PORT |
- | #define SPEAK_BIT 5 // Port-Bit fuer Lautsprecher | + | #define SPEAK_BIT |
+ | |||
#define ASC_NULL | #define ASC_NULL | ||
#define ASC_COLON | #define ASC_COLON | ||
+ | #define INPUT_PIN_MASK 0b00001111 | ||
+ | |||
// Variable | // Variable | ||
- | unsigned char vorteiler = VORTEILER_WERT; // Zaehlvariable Vorteiler | + | unsigned char softwarePrescaler |
- | unsigned char hundertstel = HUNDERTSTEL_WERT; // Zaehlvariable Hundertstel | + | unsigned char cycle10msCount = CYCLE10MS_MAX; // Zaehlvariable Hundertstel |
- | unsigned char zehntel = ZEHNTEL_WERT; // Zaehlvariable Zehntel | + | unsigned char cycle100msCount |
- | unsigned char sekunden | + | unsigned char seconds = 56; // Variable Sekunden |
- | unsigned char minuten | + | unsigned char minutes = 34; // Variable Minuten |
- | unsigned char stunden = 12; // Variable Stunden | + | unsigned char hours = 12; // Variable Stunden |
- | + | ||
- | bool timertick; // Bit-Botschaft alle 0,166ms (bei Timer-Interrupt) | + | bool timertick; // Bit-Botschaft alle 0,166ms (bei Timer-Interrupt) |
- | bool takt10ms; // Bit-Botschaft alle 10ms | + | bool cycle10msActive; |
- | bool takt100ms; // Bit-Botschaft alle 100ms | + | bool cycle100msActive; // Bit-Botschaft alle 100ms |
- | bool takt1s; // Bit-Botschaft alle 1s | + | bool cycle1sActive; |
- | + | ||
- | bool sw2_neu | + | bool button2_new |
- | bool sw3_neu | + | bool button3_new |
- | bool sw2_alt | + | bool button2_old |
- | bool sw3_alt | + | bool button3_old |
+ | uint8_t buttonState | ||
+ | |||
// Funktionsprototypen | // Funktionsprototypen | ||
- | void init_Taster(void); //Taster initialisieren | + | void initDisplay(void); // Init Anzeige |
- | void uhrStellen(void); // Stellfunktion | + | void setTime(void); // Stellfunktion |
- | void uhrAnzeigen(void); // Anzeigefunktion | + | void showTime(void); // Anzeigefunktion |
- | void uhrZaehlen(void); // Uhrfunktion | + | void refreshTime(void); // Uhrfunktion |
- | void initDisplay(void); | + | |
// Hauptprogramm ============================================================== | // Hauptprogramm ============================================================== | ||
int main() | int main() | ||
{ | { | ||
- | // Initialisierung | + | |
- | init_Taster(); | + | initDisplay(); |
- | initDisplay(); | + | |
- | + | TCCR0A = 0; | |
- | TCCR0A = 0; // Timer 0 auf " | + | SET_BIT(TCCR0B, |
- | SET_BIT(TCCR0B, | + | SET_BIT(TIMSK0, |
- | SET_BIT(TIMSK0, | + | |
- | + | SET_BIT(DDRD, | |
- | SET_BIT(DDRD, | + | |
- | + | sei(); | |
- | sei(); // generell Interrupts einschalten | + | |
- | + | // Hauptprogrammschleife | |
- | // Hauptprogrammschleife | + | |
- | + | while(1) | |
- | while(1) // unendliche Warteschleife mit Aufruf der | + | // Funktionen abhaengig von Taktbotschaften |
- | // Funktionen abhaengig von Taktbotschaften | + | { |
- | { | + | if (cycle10msActive) |
- | if (takt10ms) // alle 10ms: | + | { |
- | { | + | |
- | takt10ms | + | |
- | uhrStellen(); // Tasten abfragen, Uhr stellen | + | } |
- | } | + | if (cycle100msActive) // alle 100ms: |
- | if (takt100ms) // alle 100ms: | + | { |
- | { | + | |
- | takt100ms | + | |
- | uhrAnzeigen(); // Uhrzeit auf Anzeige ausgeben | + | } |
- | } | + | if (cycle1sActive) |
- | if (takt1s) // alle Sekunden: | + | { |
- | { | + | |
- | takt1s | + | |
- | uhrZaehlen(); // Uhr weiterzaehlen | + | } |
- | } | + | } |
- | } | + | return 0; |
- | return 0; | + | |
} | } | ||
+ | |||
+ | // Interrupt-Routine ========================================================== | ||
- | // Interrupt-Routine ========================================================== | ||
ISR (TIMER0_OVF_vect) | ISR (TIMER0_OVF_vect) | ||
- | /* In der Interrupt-Routine sind die Softwareteiler realisiert, die die Takt- | + | /* In der Interrupt-Routine sind die Softwareteiler realisiert, die die Takt- |
- | botschaften (10ms, 100ms, 1s) fuer die gesamte Uhr erzeugen. Die Interrupts | + | botschaften (10ms, 100ms, 1s) fuer die gesamte Uhr erzeugen. Die Interrupts |
- | werden von Timer 0 ausgeloest (Interrupt Nr. 1) | + | werden von Timer 0 ausgeloest (Interrupt Nr. 1) |
- | + | ||
- | Veraenderte Variable: vorteiler | + | |
- | | + | |
- | | + | |
- | + | ||
- | Ausgangsvariable: | + | |
- | | + | |
- | | + | |
*/ | */ | ||
{ | { | ||
- | timertick = 1; // Botschaft 0,166ms senden | + | |
- | --vorteiler; // Vorteiler dekrementieren | + | --softwarePrescaler; // Vorteiler dekrementieren |
- | if (vorteiler==0) // wenn 0 erreicht: 10ms abgelaufen | + | if (softwarePrescaler==0) |
- | { | + | { |
- | vorteiler | + | |
- | takt10ms | + | |
- | --hundertstel; // Hunderstelzaehler dekrementieren | + | --cycle10msCount; // Hunderstelzaehler dekrementieren |
- | + | ||
- | if (hundertstel==0) // wenn 0 erreicht: 100ms abgelaufen | + | if (cycle10msCount==0) |
- | { | + | { |
- | hundertstel | + | |
- | takt100ms | + | |
- | --zehntel; // Zehntelzaehler dekrementieren | + | --cycle100msCount; // Zehntelzaehler dekrementieren |
- | + | ||
- | if (zehntel==0) // wenn 0 erreicht: 1s abgelaufen | + | if (cycle100msCount==0) |
- | { | + | { |
- | zehntel | + | |
- | takt1s | + | |
- | } | + | } |
- | } | + | } |
- | } | + | } |
} | } | ||
- | + | | |
- | // Taster initialisieren ======================================================= | + | |
- | void init_Taster(void) | + | |
- | { | + | |
- | DDRB = DDRB & 0xE1; // Port B auf Eingabe schalten | + | |
- | PORTB |= 0x1E; | + | |
- | _delay_us(10); | + | |
- | } | + | |
// Stellfunktion ============================================================== | // Stellfunktion ============================================================== | ||
- | void uhrStellen(void) | + | void setTime(void) |
- | /* Die Stellfunktion der Uhr wird alle 10ms aufgerufen. Dadurch wir eine | + | /* Die Stellfunktion der Uhr wird alle 10ms aufgerufen. Dadurch wir eine |
- | Entprellung der Tastensignale realisiert. Das Stellen wir bei einer | + | Entprellung der Tastensignale realisiert. Das Stellen wir bei einer |
- | fallenden Flanke des jeweiligen Tastensignals durchgefuehrt. Darum | + | fallenden Flanke des jeweiligen Tastensignals durchgefuehrt. Darum |
- | muss fuer einen weiteren Stellschritt die Taste erneut betaetigt werden. | + | muss fuer einen weiteren Stellschritt die Taste erneut betaetigt werden. |
- | + | ||
- | Eine Flanke wird durch (alter Wert == 1) UND (aktueller Wert == 0) erkannt. | + | Eine Flanke wird durch (alter Wert == 1) UND (aktueller Wert == 0) erkannt. |
- | + | ||
- | Mit der Taste S2 werden die Stunden aufwaerts gestellt. | + | Mit der Taste S2 werden die Stunden aufwaerts gestellt. |
- | Mit der Taste S3 werden die Minuten aufwaerts gestellt (kein Uebertrag) | + | Mit der Taste S3 werden die Minuten aufwaerts gestellt (kein Uebertrag) |
- | Solange Taste S3 gedrueckt ist werden die Sekunden auf 00 gehalten | + | Solange Taste S3 gedrueckt ist werden die Sekunden auf 00 gehalten |
- | + | ||
- | Veraenderte Variable: stunden | + | Veraenderte Variable: stunden |
- | | + | minuten |
- | | + | sekunden |
- | + | ||
- | Speicher fuer Bits: | + | Speicher fuer Bits: |
- | | + | sw3Alt |
*/ | */ | ||
{ | { | ||
- | sw2_neu | + | DDRC = DDRC &~INPUT_PIN_MASK; |
- | sw3_neu | + | PORTC |= INPUT_PIN_MASK; |
+ | _delay_us(1); // Wartezeit Umstellung Hardware-Signal | ||
+ | buttonState | ||
+ | DDRC |= INPUT_PIN_MASK; | ||
- | if ((sw2_neu==0)&(sw2_alt==1)) // wenn Taste 2 eben gedrueckt wurde: | + | // Einlesen der Tastensignale |
- | { | + | button2_new = (buttonState & (1 << PC1)); |
- | stunden++; // Stunden hochzaehlen, | + | button3_new = (buttonState & (1 << PC2)); |
- | if (stunden==24) | + | |
- | stunden | + | |
- | } | + | |
- | if ((sw3_neu==0)&(sw3_alt==1)) // wenn Taste 3 eben gedrueckt wurde: | + | { |
- | { | + | hours++; // Stunden hochzaehlen, |
- | minuten++; // Minuten hochzaehlen, | + | if (hours==24) |
- | if (minuten==60) | + | |
- | minuten | + | } |
- | } | + | if ((button3_new==0)&(button3_old==1)) // wenn Taste 3 eben gedrueckt wurde: |
- | if (sw3_neu==0) // solange Taste 3 gedrueckt: | + | { |
- | sekunden | + | |
- | + | if (minutes==60) | |
- | sw2_alt | + | |
- | sw3_alt | + | } |
+ | if (button3_new==0) | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
} | } | ||
+ | |||
// Anzeigefunktion Uhr ======================================================== | // Anzeigefunktion Uhr ======================================================== | ||
- | void uhrAnzeigen(void) | + | void showTime(void) |
- | /* Die Umrechnung der binaeren Zaehlwerte auf BCD ist folgendermaßen geloest: | + | /* Die Umrechnung der binaeren Zaehlwerte auf BCD ist folgendermaßen geloest: |
- | Zehner: einfache Integer-Teilung (/10) | + | Zehner: einfache Integer-Teilung (/10) |
- | Einer: | + | Einer: |
*/ | */ | ||
{ | { | ||
- | lcd_gotoxy(0, | + | |
- | + | | |
- | lcd_putc(ASC_NULL + stunden/10); // Stunden Zehner als ASCII ausgeben | + | lcd_putc(ASC_NULL + hours/10); // Stunden Zehner als ASCII ausgeben |
- | lcd_putc(ASC_NULL + stunden%10); // Stunden Einer als ASCII ausgeben | + | lcd_putc(ASC_NULL + hours%10); // Stunden Einer als ASCII ausgeben |
- | lcd_putc(ASC_COLON); | + | lcd_putc(ASC_COLON); |
- | + | | |
- | lcd_putc(ASC_NULL + minuten/10); // Minuten als ASCII ausgeben | + | lcd_putc(ASC_NULL + minutes/10); // Minuten als ASCII ausgeben |
- | lcd_putc(ASC_NULL + minuten%10); // | + | lcd_putc(ASC_NULL + minutes%10); // |
- | lcd_putc(ASC_COLON); | + | lcd_putc(ASC_COLON); |
- | + | | |
- | lcd_putc(ASC_NULL + sekunden/10); // Sekunden als ASCII ausgeben | + | lcd_putc(ASC_NULL + seconds/10); // Sekunden als ASCII ausgeben |
- | lcd_putc(ASC_NULL + sekunden%10); // | + | lcd_putc(ASC_NULL + seconds%10); // |
} | } | ||
+ | |||
// Initialisierung Display-Anzeige ============================================ | // Initialisierung Display-Anzeige ============================================ | ||
- | void initDisplay() // Start der Funktion | + | void initDisplay() |
{ | { | ||
- | 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); |
- | + | ||
- | lcd_gotoxy(0, | + | lcd_gotoxy(0, |
- | lcd_putstr(" | + | lcd_putstr(" |
- | + | ||
- | lcd_gotoxy(1, | + | lcd_gotoxy(1, |
- | lcd_putstr(" | + | lcd_putstr(" |
- | } // Ende der Funktion | + | } |
+ | |||
// Zaehlfunktion Uhr ========================================================== | // Zaehlfunktion Uhr ========================================================== | ||
- | void uhrZaehlen | + | void refreshTime |
- | /* Die Uhr wird im Sekundentakt gezaehlt. Bei jedem Aufruf wird auch ein | + | /* Die Uhr wird im Sekundentakt gezaehlt. Bei jedem Aufruf wird auch ein |
- | " | + | " |
- | die Minuten, die Ueberlaeufe der Minuten die Stunden hoch. | + | die Minuten, die Ueberlaeufe der Minuten die Stunden hoch. |
- | + | ||
- | Veraenderte Variable: | + | Veraenderte Variable: |
- | minuten | + | minuten |
- | stunden | + | stunden |
*/ | */ | ||
{ | { | ||
- | TGL_BIT (SPEAK_PORT, | + | |
- | // durch Invertierung des Portbits | + | // durch Invertierung des Portbits |
- | + | ||
- | sekunden++; // Sekunden hochzaehlen | + | |
- | if (sekunden==60) // bei Überlauf: | + | if (seconds==60) |
- | { | + | { |
- | sekunden | + | |
- | minuten++; // Minuten hochzaehlen | + | |
- | if (minuten==60) // bei Ueberlauf: | + | if (minutes==60) // bei Ueberlauf: |
- | { | + | { |
- | minuten | + | |
- | stunden++; // Stunden hochzaehlen | + | hours++; // Stunden hochzaehlen |
- | if (stunden==24) // bei Ueberlauf: | + | if (hours==24) // bei Ueberlauf: |
- | stunden | + | |
- | } | + | } |
- | } | + | } |
- | }</ | + | } |
+ | </ | ||
</ | </ | ||
Zeile 377: | Zeile 375: | ||
- Bei den Variablen entsprechen einige denen der letzten Programme. | - Bei den Variablen entsprechen einige denen der letzten Programme. | ||
- Für die Uhr werden Stunden, Minuten, Sekunden und Zehntelsekunden mit Anfangswerten deklariert. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | - Für die Uhr werden Stunden, Minuten, Sekunden und Zehntelsekunden mit Anfangswerten deklariert. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
- | - 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. |
'' | '' | ||
- | - Das Hauptprogramm ähnelt sehr stark dem [[4._up_down_counter|Up/Down Counter]]. Entsprechend werden die Zeilen 143-157 hier nicht weiter erklärt. \\ \\ \\ \\ \\ \\ \\ \\ | + | - Das Hauptprogramm ähnelt sehr stark dem [[4_up_down_counter|Up/Down Counter]]. Entsprechend werden die Zeilen 143-157 hier nicht weiter erklärt. |
- In der Endlosschleife sind auf der ersten Ebene wieder nur If-Abfragen zu den Flags '' | - In der Endlosschleife sind auf der ersten Ebene wieder nur If-Abfragen zu den Flags '' | ||
- | - Alle $10ms$ (bzw. wenn das entsprechende Flag gesetzt wird) wird das Flag zurückgesetzt und das Unterprogramm '' | + | - Alle $10~\rm ms$ (bzw. wenn das entsprechende Flag gesetzt wird) wird das Flag zurückgesetzt und das Unterprogramm '' |
- | - Alle $100ms$ (bzw. wenn das entsprechende Flag gesetzt wird) wird das Flag zurückgesetzt und das Unterprogramm '' | + | - Alle $100~\rm ms$ (bzw. wenn das entsprechende Flag gesetzt wird) wird das Flag zurückgesetzt und das Unterprogramm '' |
+ | - Alle $1~\rm s$ (bzw. wenn das entsprechende Flag gesetzt wird) wird das Flag zurückgesetzt und das Unterprogramm '' | ||
'' | '' | ||
- | - Mit dem Befehl '' | + | - Auch die Interrupt Routine ist dem Programm |
- | - 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 ('' | + | |
- | - Die Ermittlung von '' | + | '' |
- | - Eine große Änderung ist, dass bereits im Interrupt alle 10ms die Unterfunktion '' | + | |
- | '' | + | |
- | - Das Einstellen des Data Direction Registers und der Pullups wurde bereits in vorherigen Programmen erklärt. | + | |
- | '' | + | |
\\ \\ | \\ \\ | ||
- | - In dieser Funktion werden zunächst die Stellungen aller Taster eingelesen (vgl. '' | + | - In dieser Funktion werden zunächst die Stellungen aller Taster eingelesen (vgl. '' |
- | - Neu hier ist, dass die Bedienung der Schalter | + | - Neu hier ist, dass die Bedienung der Schalter |
- | '' | + | '' |
- | - Hierüber wird die Augenzahl | + | - Hierüber wird die Uhrzeit |
- | \\ \\ \\ | + | - Ähnlich zum Counter werden die zweistelligen Werte mit Division durch 10 und dessen Rest in zwei einzelne Ziffern gewandelt |
+ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
'' | '' | ||
Zeile 406: | Zeile 402: | ||
- Nach zwei Sekunden wird der Auswahlbildschirm angezeigt. | - Nach zwei Sekunden wird der Auswahlbildschirm angezeigt. | ||
- | + | \\ \\ \\ \\ \\ \\ \\ \\ \\ | |
+ | |||
+ | '' | ||
+ | - Die Zähl-Funktion '' | ||
+ | - Zunächst wird ein Schaltwechsel am Ausgang mit dem Lautsprecher ausgegeben, um einen Knackton zu erzeugen | ||
+ | - Dann werden die Sekunden hochgezählt | ||
+ | - ist das Maximum erreicht, so wird der Sekunden-Wert zurückgesetzt und der Minuten-Wert um eins hochgezählt. | ||
+ | - ebenso wird beim Maximum des Minuten-Serts dieser zurückgesetzt und der Stundenwert hochgezählt. | ||
+ | - beim Maximum des Stunden-Werts wird dieser wieder auf Null gesetzt | ||
</ | </ | ||
Zeile 422: | Zeile 426: | ||
--> Aufgabe# | --> Aufgabe# | ||
- | - Darstellung des Augenwerts ändern | + | - Bauen Sie einen " |
- | - Laden Sie folgende Dateien herunter: {{microcontrollertechnik: | + | - Es sollen nicht nur Stunde, Minute, Sekunde dargestellt werden und veränderbar sein, sondern auch Tag, Monat und Jahr im Format dd:mm:yy |
- | - Simulieren | + | - Achten |
- | - Ändern | + | |
+ | - Überlegen | ||
+ | - BONUS: Wie kann der Wochentag bestimmt werden? | ||
<-- | <-- |