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 [2022/02/24 20:33] 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 11: | Zeile 11: | ||
--> I. Vorarbeiten # | --> I. Vorarbeiten # | ||
- Laden Sie folgende Datei herunter: | - Laden Sie folgende Datei herunter: | ||
- | - {{microcontrollertechnik: | + | - {{microcontrollertechnik: |
- | - {{microcontrollertechnik: | + | - {{microcontrollertechnik: |
- {{microcontrollertechnik: | - {{microcontrollertechnik: | ||
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: | + | - Ö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 26: | 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 | ||
- | ============= ========================================================= | ||
- | |||
- | Dateiname: | ||
- | |||
- | Autoren: | ||
- | Prof. G. Gruhler (Hochschule Heilbronn) | ||
- | D. Chilachava (Georgische Technische Universitaet) | ||
- | |||
- | Version: | ||
- | |||
- | Hardware: | ||
- | AVR-USB-PROGI Ver. 2.0 | ||
- | |||
- | Software: | ||
- | C-Compiler: | ||
- | |||
- | Funktion: | ||
- | einfache Stellfunktion ist mit den Tasten S2 und S3 realisiert. | ||
- | |||
- | Displayanzeige: | ||
- | +----------------+ +----------------+ | ||
- | |- 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) | ||
- | |||
- | Jumperstellung: | ||
- | |||
- | Fuses im uC: CKDIV8: Aus (keine generelle Vorteilung des Takts) | ||
- | |||
- | Header-Files: | ||
- | |||
- | Module: | ||
- | 2) Zaehler fuer Uhr (Takt: 1 s) | ||
- | 3) Anzeigetreiber (Takt: 100 ms) | ||
- | 4) Stellfunktion | ||
- | |||
- | Modul 1: Das Modul " | ||
- | Zusaetzliche Takte: 10 ms fuer Stellfunktion | ||
- | | ||
- | |||
- | Verwendung von Hardware-Timer 0 und T0 Overflow-Interrupt. | ||
- | Frequenzen: | ||
- | Timer-Vorteiler / | ||
- | Hardware-Timer | ||
- | | ||
- | | ||
- | Zehntel-Zaehler / | ||
- | |||
- | Modul 2: Das Modul " | ||
- | Sekunden, | ||
- | Sekunden und Minuten zaehlen 00..59, die Stunden 00..23. | ||
- | Ein " | ||
- | |||
- | | ||
- | Hintergrundinformationen und die aktuelle Uhrzeit aus. | ||
- | Darstellung auf der Anzeige (mittig in Zeile 1): [23:59:59] | ||
- | |||
- | | ||
- | Es dient 1. zum Einlesen und Entprellen der Stelltasten | ||
- | | ||
- | 2. zum Ausfuehren der Stellfunktion: | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | Die Kopplung der Module wird ueber global definierte Variable realisiert: | + | Experiment 7: |
- | + | ============= | |
- | 1-Bit-Variable: | + | |
- | takt100ms: | + | Dateiname: |
- | takt1s: Taktgenerator => Zaehler fuer Uhr | + | |
- | + | Autoren: | |
- | 8-Bit-Variable: | + | Prof. G. Gruhler (Hochschule Heilbronn) |
- | minuten | + | D. Chilachava |
- | stunden | + | |
+ | Version: | ||
+ | |||
+ | Hardware: | ||
+ | AVR-USB-PROGI Ver. 2.0 | ||
+ | |||
+ | Software: | ||
+ | C-Compiler: AVR/GNU C Compiler 5.4.0 | ||
+ | |||
+ | Funktion: | ||
+ | einfache Stellfunktion ist mit den Tasten S2 und S3 realisiert. | ||
+ | |||
+ | Displayanzeige: | ||
+ | +----------------+ | ||
+ | |- 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) | ||
+ | |||
+ | Jumperstellung: | ||
+ | |||
+ | Fuses im uC: CKDIV8: Aus (keine generelle Vorteilung des Takts) | ||
+ | |||
+ | Header-Files: | ||
+ | |||
+ | Module: | ||
+ | 2) Zaehler fuer Uhr (Takt: 1 s) | ||
+ | 3) Anzeigetreiber | ||
+ | 4) Stellfunktion | ||
+ | |||
+ | Modul 1: Das Modul " | ||
+ | Zusaetzliche Takte: 10 ms fuer Stellfunktion | ||
+ | 100 ms fuer Anzeige. | ||
+ | |||
+ | Verwendung von Hardware-Timer 0 und T0 Overflow-Interrupt. | ||
+ | Frequenzen: Quarzfrequenz | ||
+ | Timer-Vorteiler | ||
+ | Hardware-Timer | ||
+ | Software-Vorteiler | ||
+ | Hundertstel-Zaehler / 10 => 10 Hz / 100 ms | ||
+ | Zehntel-Zaehler | ||
+ | |||
+ | Modul 2: Das Modul " | ||
+ | Sekunden, Minuten und Stunden werden als Binaerzahlen gezaehlt | ||
+ | Sekunden und Minuten zaehlen 00..59, die Stunden 00..23. | ||
+ | Ein " | ||
+ | |||
+ | Modul 3: Das Modul " | ||
+ | Hintergrundinformationen und die aktuelle Uhrzeit aus. | ||
+ | Darstellung auf der Anzeige (mittig in Zeile 1): [23: | ||
+ | |||
+ | Modul 4: Das Modul " | ||
+ | Es dient 1. zum Einlesen und Entprellen der Stelltasten | ||
+ | - Auswertung der fallenden Flanke 1=> 0 | ||
+ | 2. zum Ausfuehren der Stellfunktion: | ||
+ | - S2 zaehlt die Stunden aufwaerts | ||
+ | - S3 zaehlt die Minuten aufwaerts | ||
+ | - solange Taste S3 gedrueckt: Sekunden = 00 | ||
+ | (einfache Synchronisierung der Uhr!) | ||
+ | Beim Stellen kein Uebertrag von den Minuten auf die Stunden. | ||
+ | |||
+ | | ||
+ | |||
+ | 1-Bit-Variable: | ||
+ | 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 initTaster(void); | + | void initDisplay(void); |
- | void initDisplay(void); | + | void setTime(void); // Stellfunktion |
- | void uhrStellen(void); // Stellfunktion | + | void showTime(void); // Anzeigefunktion |
- | void uhrAnzeigen(void); // Anzeigefunktion | + | void refreshTime(void); // Uhrfunktion |
- | void uhrZaehlen(void); // Uhrfunktion | + | |
// Hauptprogramm ============================================================== | // Hauptprogramm ============================================================== | ||
int main() | int main() | ||
{ | { | ||
- | // Initialisierung | + | |
- | initTaster(); | + | 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) | ||
- | /* In der Interrupt-Routine sind die Softwareteiler realisiert, die die Takt- | ||
- | botschaften (10ms, 100ms, 1s) fuer die gesamte Uhr erzeugen. Die Interrupts | ||
- | werden von Timer 0 ausgeloest (Interrupt Nr. 1) | ||
- | Veraenderte Variable: vorteiler | + | ISR (TIMER0_OVF_vect) |
- | hunderstel | + | /* In der Interrupt-Routine sind die Softwareteiler realisiert, die die Takt- |
- | zehntel | + | |
- | + | | |
- | 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 initTaster(void) | + | |
- | { | + | |
- | DDRB = DDRB & 0xE1; // Port B auf Eingabe schalten | + | |
- | PORTB |= 0x1E; | + | |
- | _delay_us(1); | + | |
- | } | + | |
// 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 378: | 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 $1s$ (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 '' |
'' | '' | ||
- | - Auch die Interrupt Routine ist dem Programm [[4._up_down_counter|Up/Down Counter]] entlehnt und wird hier nicht weiter erklärt. | + | - Auch die Interrupt Routine ist dem Programm [[4_up_down_counter|Up/Down Counter]] entlehnt und wird hier nicht weiter erklärt. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ |
- | '' | + | '' |
- | - Auch 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 die Variablen für Stunden, Minuten um eins hochsetzen, bzw. bei Überlauf wider zurück auf 0 setzen. Zusätzlich wird bei eine Änderung des Minuten-Werts der Sekunden-Wert auf 0 gesetzt. | + | - Neu hier ist, dass die Bedienung der Schalter die Variablen für Stunden, Minuten um eins hochsetzen, bzw. bei Überlauf wider zurück auf 0 setzen. Zusätzlich wird bei eine Änderung des Minuten-Werts der Sekunden-Wert auf 0 gesetzt. |
'' | '' |