Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
microcontrollertechnik:10_spi_schnittstelle [2021/10/26 00:23] tfischer |
microcontrollertechnik:10_spi_schnittstelle [2024/01/22 13:47] (aktuell) mexleadmin |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | + | ====== |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Zeile 27: | Zeile 27: | ||
< | < | ||
</ | </ | ||
- | {{drawio> | + | {{drawio> |
</ | </ | ||
Zeile 59: | Zeile 59: | ||
<-- | <-- | ||
- | --> III. Eingabe in Atmel Studio # | + | --> III. Eingabe in Microchip |
<WRAP group>< | <WRAP group>< | ||
<sxh c; first-line: 1> | <sxh c; first-line: 1> | ||
/* ============================================================================ | /* ============================================================================ | ||
- | + | ||
- | Experiment 7: MEXLE-Uhr mit hh: | + | Experiment 7: |
- | ============= ========================================================= | + | ============= |
- | + | ||
- | Dateiname: MEXLEuhr_Master.c | + | Dateiname: |
- | + | ||
- | Autoren: Prof. T. Fischer (Hochschule Heilbronn) | + | Autoren: |
- | Prof. G. Gruhler (Hochschule Heilbronn) | + | Prof. G. Gruhler (Hochschule Heilbronn) |
- | D. Chilachava (Georgische Technische Universitaet) | + | D. Chilachava |
- | + | ||
- | Version: 0.2 vom 23.05.2020 | + | Version: |
- | + | ||
- | Hardware: Simulide | + | Hardware: |
- | + | ||
- | Software: Atmel | + | Software: |
- | + | ||
- | Funktion: Digitaluhr mit Anzeige von Stunden, Minuten und Sekunden. Eine | + | Funktion: |
- | einfache Stellfunktion ist mit den Tasten S2 und S3 realisiert. | + | einfache Stellfunktion ist mit den Tasten S2 und S3 realisiert. |
- | Mit S1 und S4 kann die SPI-Kommunikation mit einem Slave-Display | + | Mit S1 und S4 kann die SPI-Kommunikation mit einem Slave-Display |
- | gestartet werden | + | gestartet werden |
- | + | ||
- | Displayanzeige: | + | Displayanzeige: |
- | +----------------+ +----------------+ | + | +----------------+ |
- | | MEXLEuhr - SPI | |=== 00:00:00 ===| | + | | MEXLEuhr - SPI | |=== 00:00:00 ===| |
- | | | + | | |
- | +----------------+ +----------------+ | + | +----------------+ |
- | + | ||
- | Tastenfunktion: | + | Tastenfunktion: |
- | S2: | + | S2: Std (zaehlt Stunden bei Flanke aufwaerts. Ueberlauf bei 24) |
- | S3: Min (zaehlt Minuten bei Flanke aufwaerts. Ueberlauf bei 60) | + | S3: Min (zaehlt Minuten bei Flanke aufwaerts. Ueberlauf bei 60) |
- | (setzt Sekunden beim Druecken zurueck auf 00) | + | (setzt Sekunden beim Druecken zurueck auf 00) |
- | S4: uebertraegt die Info zum Darstellen einer Linie zum Master | + | S4: uebertraegt die Info zum Darstellen einer Linie zum Master |
- | + | ||
- | Fuses im uC: CKDIV8: Aus (keine generelle Vorteilung des Takts) | + | Fuses im uC: CKDIV8: Aus (keine generelle Vorteilung des Takts) |
- | + | ||
- | Header-Files: | + | Header-Files: |
- | + | ||
- | Libraries: pcd8544.c (Library fuer die Ansteuerung des Displays) | + | Libraries: |
- | pcd8544.h (Header-Datei fuer die Ansteuerung des Displays) | + | pcd8544.h |
- | + | ||
- | Module: 1) Taktgenerator | + | Module: |
- | 2) Zaehler fuer Uhr (Takt: 1 s) | + | 2) Zaehler fuer Uhr (Takt: 1 s) |
- | 3) Anzeigetreiber | + | 3) Anzeigetreiber |
- | 4) Stellfunktion | + | 4) Stellfunktion |
- | 5) SPI-Funktionen | + | 5) SPI-Funktionen |
- | + | | |
- | + | ||
- | Die Kopplung der Module wird ueber global definierte Variable realisiert: | + | Die Kopplung der Module wird ueber global definierte Variable realisiert: |
- | + | ||
- | 1-Bit-Variable: | + | 1-Bit-Variable: |
- | takt100ms: | + | takt100ms: |
- | takt1s: Taktgenerator => Zaehler fuer Uhr | + | takt1s: |
- | + | ||
- | 8-Bit-Variable: | + | 8-Bit-Variable: |
- | minuten | + | minuten |
- | stunden | + | stunden |
+ | |||
=============================================================================*/ | =============================================================================*/ | ||
- | + | ||
+ | |||
// Deklarationen ============================================================== | // Deklarationen ============================================================== | ||
+ | |||
// Festlegung der Quarzfrequenz | // Festlegung der Quarzfrequenz | ||
+ | |||
#ifndef F_CPU // | #ifndef F_CPU // | ||
- | #define F_CPU 6144000UL // MiniMEXLE mit 6,144 MHz Quarz | + | #define F_CPU 12288000UL |
- | #endif | + | # |
- | + | ||
+ | |||
// Include von Header-Dateien | // Include von Header-Dateien | ||
- | + | ||
- | #include < | + | #include < |
- | #include < | + | #include < |
- | #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 PRESCALER_VAL 30 | ||
+ | #define CYCLE10MS_MAX 10 // | ||
+ | #define CYCLE100MS_MAX | ||
+ | |||
+ | #define SPEAK_PORT | ||
+ | #define SPEAK_BIT | ||
+ | #define LED_PORT | ||
+ | #define LED_BIT | ||
+ | |||
+ | #define ASC_NULL | ||
+ | #define ASC_COLON | ||
+ | |||
+ | #define NO 0 // | ||
+ | #define YES 1 // | ||
+ | #define PRESSED 0 // | ||
+ | #define UNPRESSED 1 // | ||
- | # | + | # |
- | # | + | # |
- | # | + | # |
+ | #define TENTH_MAX 10 // max Wert der Zentelsekunden | ||
- | # | + | # |
- | # | + | # |
- | #define LED_PORT PORTB // | + | |
- | #define LED_BIT 0 // | + | |
- | + | ||
- | #define ASC_NULL 0x30 // | + | |
- | #define ASC_COLON 0x3A // | + | |
// 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 zehntelSekunden | + | unsigned char tenthOfASecond = 0; // Variable Sekunden |
- | 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 |
- | + | ||
- | unsigned char zeile = 0; // x-Koordinate | + | unsigned char line = 0; // x-Koordinate |
- | unsigned char pos = 0; // y-Koordinate | + | unsigned char pos = 0; // y-Koordinate |
- | unsigned char zeichen =' | + | unsigned char character =' |
- | + | ||
- | bool timertick; // Bit-Botschaft alle 0,111ms (bei Timer-Interrupt) | + | bool timertick; |
- | 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 sw1_neu | + | bool button1_new |
- | bool sw2_neu | + | bool button2_new |
- | bool sw3_neu | + | bool button3_new |
- | bool sw4_neu | + | bool button4_new |
- | bool sw1_alt | + | bool button1_old |
- | bool sw2_alt | + | bool button2_old |
- | bool sw3_alt | + | bool button3_old |
- | bool sw4_alt | + | bool button4_old |
- | + | ||
- | bool PcdSendMessage = 0; // Flag fuer sendebereite SPI-Nachricht | + | bool PcdSendMessage = 0; // Flag fuer sendebereite SPI-Nachricht |
+ | |||
// Funktionsprototypen | // Funktionsprototypen | ||
- | + | ||
- | void timerInt0(void); | + | void timerInt0(void); |
- | void uhrStellen(void); // Stellfunktion | + | void setTime(void); // Stellfunktion |
- | void uhrAnzeigen(void); | + | void showTime(void); |
- | void uhrZaehlen(void); // Uhrfunktion | + | void refreshTime(void); |
- | void initDisplay(void); | + | void initDisplay(void); |
- | void zehntelSekundenAufPcdAnzeigen(void);// | + | void showTenthOfASecond(void); // Anzeige der Zehntelsenkunde auf separatem Display |
+ | |||
// Hauptprogramm ============================================================== | // Hauptprogramm ============================================================== | ||
+ | |||
int main() | int main() | ||
{ | { | ||
- | // Initialisierung | + | |
- | + | | |
- | initDisplay(); | + | initDisplay(); |
- | pcd_init(); | + | pcd_init(); |
- | + | ||
- | TCCR0A = 0; // Timer 0 auf " | + | TCCR0A = 0; |
- | SET_BIT(TCCR0B, | + | SET_BIT(TCCR0B, |
- | SET_BIT(TIMSK0, | + | SET_BIT(TIMSK0, |
- | + | ||
- | SET_BIT(DDRD, | + | SET_BIT(DDRD, |
- | PORTC |= 0b00001111; | + | PORTC |= 0b00001111; |
- | SET_BIT(DDRB, | + | SET_BIT(DDRB, |
- | + | ||
- | sei(); // generell Interrupts einschalten | + | sei(); |
- | + | | |
- | // Hauptprogrammschleife | + | // Hauptprogrammschleife |
- | + | ||
- | while(1) // unendliche Warteschleife mit Aufruf der | + | while(1) |
- | // Funktionen abhaengig von Taktbotschaften | + | // Funktionen abhaengig von Taktbotschaften |
- | { | + | { |
- | if (takt10ms) // alle 10ms: | + | if (cycle10msActive) // alle 10ms: |
- | { | + | { |
- | takt10ms | + | |
- | uhrStellen(); // Tasten abfragen, Stellen, SPI-Komm. | + | |
- | } | + | } |
- | + | ||
- | if (takt100ms) // alle 100ms: | + | if (cycle100msActive) |
- | { | + | { |
- | takt100ms | + | |
- | if (PcdSendMessage) // wenn SPI-Nachricht gesendet werden soll: | + | if (PcdSendMessage) |
- | { | + | { |
- | PcdSendMessage = 0; // Botschaft loeschen | + | PcdSendMessage = NO; |
- | TGL_BIT(LED_PORT, | + | TGL_BIT(LED_PORT, |
- | zehntelSekundenAufPcdAnzeigen();// Anzeige auf PCD Display | + | |
- | } | + | } |
- | uhrAnzeigen(); // Uhrzeit auf Anzeige ausgeben | + | |
- | uhrZaehlen(); // Uhr weiterzaehlen | + | |
- | } | + | } |
- | + | ||
- | if (takt1s) // alle Sekunden: | + | if (cycle1sActive) // alle Sekunden: |
- | { | + | { |
- | takt1s | + | |
- | TGL_BIT(LED_PORT, | + | TGL_BIT(LED_PORT, |
- | pcd_init(); | + | pcd_init(); |
- | } | + | } |
- | } | + | } |
- | 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: | + | Veraenderte Variable: |
- | hunderstel | + | |
- | zehntel | + | |
- | + | ||
- | Ausgangsvariable: | + | Ausgangsvariable: |
- | takt100ms | + | |
- | takt1s | + | |
*/ | */ | ||
+ | |||
{ | { | ||
- | timertick = 1; // Botschaft 0,111ms senden | + | |
- | --vorteiler; // Vorteiler dekrementieren | + | --softwarePrescaler; // Vorteiler dekrementieren |
- | if (vorteiler==0) // wenn 0 erreicht: 10ms abgelaufen | + | if (softwarePrescaler==0) // wenn 0 erreicht: 10ms abgelaufen |
- | { | + | { |
- | vorteiler | + | |
- | takt10ms | + | |
- | --hundertstel; // Hunderstelzaehler dekrementieren | + | --cycle10msCount; // Hunderstelzaehler dekrementieren |
- | + | ||
- | if (hundertstel==0) // wenn 0 erreicht: 100ms abgelaufen | + | if (cycle10msCount==0) // wenn 0 erreicht: 100ms abgelaufen |
- | { | + | { |
- | hundertstel | + | |
- | takt100ms | + | |
- | --zehntel; // Zehntelzaehler dekrementieren | + | --cycle100msCount; // Zehntelzaehler dekrementieren |
- | + | ||
- | if (zehntel==0) // wenn 0 erreicht: 1s abgelaufen | + | if (cycle100msCount==0) // wenn 0 erreicht: 1s abgelaufen |
- | { | + | { |
- | zehntel | + | |
- | takt1s | + | |
- | } | + | } |
- | } | + | } |
- | } | + | } |
} | } | ||
+ | |||
// 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. |
- | Ebenso wird die SPI-Funktion hier aufgerufen. | + | Ebenso wird die SPI-Funktion hier aufgerufen. |
- | + | ||
- | 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 S1 wird die Uebergabe der Zeit Master > Slave gestartet | + | Mit der Taste S1 wird die Uebergabe der Zeit Master > Slave gestartet |
- | 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 |
- | Mit der Taste S4 wird die Uebergabe der Zeit Master < Slave gestartet | + | Mit der Taste S4 wird die Uebergabe der Zeit Master < Slave gestartet |
- | + | ||
- | Veraenderte Variable: | + | Veraenderte Variable: |
- | minuten | + | |
- | sekunden | + | |
- | + | | |
- | Speicher fuer Bits: | + | Speicher fuer Bits: button1_old |
- | sw2Alt | + | |
- | sw3Alt | + | |
- | sw4Alt | + | |
*/ | */ | ||
- | + | ||
- | { | + | { |
- | sw1_neu | + | |
- | sw2_neu | + | |
- | sw3_neu | + | |
- | sw4_neu | + | |
- | + | ||
- | if ((sw1_neu==0)) // wenn Taste 1 gedrueckt ist: | + | if (button1_new==PRESSED) // wenn Taste 1 gedrueckt ist: |
- | { | + | { |
- | PcdSendMessage = 1; | + | PcdSendMessage = YES; |
- | } | + | } |
- | + | | |
- | if ((sw2_neu==0)&(sw2_alt==1)) // wenn Taste 2 eben gedrueckt wurde: | + | if ( (button2_new==PRESSED) |
- | { | + | &(button2_old==UNPRESSED)) // wenn Taste 2 eben gedrueckt wurde: |
- | stunden++; // Stunden hochzaehlen, | + | { |
- | if (stunden==24) | + | hours++; // Stunden hochzaehlen, |
- | stunden | + | if (hours== HOURS_MAX) |
- | } | + | |
- | if ((sw3_neu==0)&(sw3_alt==1)) // wenn Taste 3 eben gedrueckt wurde: | + | } |
- | { | + | if ( (button3_new==PRESSED) |
- | minuten++; // Minuten hochzaehlen, | + | &(button3_old==UNPRESSED)) // wenn Taste 3 eben gedrueckt wurde: |
- | if (minuten==60) | + | { |
- | minuten | + | |
- | } | + | if (minutes== MINUTES_MAX) |
- | if (sw3_neu==0) // solange Taste 3 gedrueckt: | + | |
- | sekunden | + | } |
- | + | if (button3_new==PRESSED) | |
- | if ((sw4_neu==0)&(sw4_alt==1)) // wenn Taste 3 eben gedrueckt wurde: | + | seconds |
- | { | + | |
- | pcd_putLine(rand()%83, | + | if ((button4_new==0)&(button4_old==1)) // wenn Taste 3 eben gedrueckt wurde: |
- | pcd_updateDisplay(); | + | { |
- | } | + | pcd_putLine(rand()%83, |
- | + | pcd_updateDisplay(); | |
- | sw1_alt | + | } |
- | sw2_alt | + | |
- | sw3_alt | + | |
- | sw4_alt | + | |
+ | | ||
+ | | ||
} | } | ||
+ | |||
// 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); // |
} | } | ||
+ | |||
// Anzeigefunktion fuer PCD Display ======================================================== | // Anzeigefunktion fuer PCD Display ======================================================== | ||
- | + | ||
- | void zehntelSekundenAufPcdAnzeigen(void) | + | void showTenthOfASecond(void) |
- | + | ||
- | /* Anzeigen der Zenhtelsekunden auf dem Display PCD8544 | + | /* Anzeigen der Zenhtelsekunden auf dem Display PCD8544 |
*/ | */ | ||
+ | |||
{ | { | ||
- | pcd_gotoxy(zeile, pos); // Setze Position am Display | + | |
- | pcd_putc(zehntelSekunden+0x30); // Schreibe Zehntelsekunden | + | pcd_putc(tenthOfASecond+0x30); // Schreibe Zehntelsekunden |
- | pcd_updateDisplay(); | + | pcd_updateDisplay(); |
- | if (++pos > 13) // naechste Position, und wenn diese ausserhalb der Anzeige | + | if (++pos > POS_MAX) // naechste Position, und wenn diese ausserhalb der Anzeige |
- | { | + | { |
- | pos = 0; // zurueck auf erste Position | + | pos = 0; // zurueck auf erste Position |
- | if (++zeile > 5) // naechste Zeile, und wenn diese ausserhalb der Anzeige | + | if (++line > LINE_MAX) // naechste Zeile, und wenn diese ausserhalb der Anzeige |
- | { | + | { |
- | zeile | + | |
- | pcd_clearDisplay(); | + | pcd_clearDisplay(); |
- | }; | + | }; |
- | } | + | } |
} | } | ||
+ | |||
// Initialisierung Display-Anzeige ============================================ | // Initialisierung Display-Anzeige ============================================ | ||
- | + | ||
- | void initDisplay() // Start der Funktion | + | void initDisplay() // Start der Funktion |
{ | { | ||
- | lcd_init(); | + | |
- | + | | |
- | lcd_gotoxy(0, | + | lcd_gotoxy(0, |
- | lcd_putstr(" | + | lcd_putstr(" |
- | + | ||
- | lcd_gotoxy(1, | + | lcd_gotoxy(1, |
- | lcd_putstr(" | + | lcd_putstr(" |
- | + | ||
- | _delay_ms(1000); | + | _delay_ms(1000); |
- | + | ||
- | lcd_gotoxy(0, | + | lcd_gotoxy(0, |
- | lcd_putstr(" | + | lcd_putstr(" |
- | + | ||
- | lcd_gotoxy(1, | + | lcd_gotoxy(1, |
- | lcd_putstr(" | + | lcd_putstr(" |
- | + | ||
- | } // Ende der Funktion | + | } // 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: sekunden | + | Veraenderte Variable: |
- | minuten | + | |
- | stunden | + | hours |
*/ | */ | ||
+ | |||
{ | { | ||
- | TGL_BIT (SPEAK_PORT, | + | |
- | // durch Invertierung des Portbits | + | // durch Invertierung des Portbits |
- | zehntelSekunden++; | + | |
- | if (zehntelSekunden==10) // bei Ueberlauf: | + | if (tenthOfASecond== TENTH_MAX) // bei Ueberlauf: |
- | { | + | { |
- | zehntelSekunden=0; | + | |
- | sekunden++; // Sekunden hochzaehlen | + | |
- | if (sekunden==60) // bei Ueberlauf: | + | if (seconds== SECONDS_MAX) // bei Ueberlauf: |
- | { | + | { |
- | sekunden | + | |
- | minuten++; // | + | |
- | if (minuten==60) // bei Ueberlauf: | + | if (minutes== MINUTES_MAX) // |
- | { | + | { |
- | minuten | + | |
- | stunden++; // Stunden hochzaehlen | + | hours++; // |
- | if (stunden==24) // bei Ueberlauf: | + | if (hours== HOURS_MAX) // |
- | stunden | + | |
- | } | + | } |
- | } | + | } |
- | } | + | } |
} | } | ||
- | |||
</ | </ | ||
</ | </ | ||
Zeile 481: | Zeile 496: | ||
- ''" | - ''" | ||
- Die Makros entsprechen denen der letzten Programme. \\ \\ \\ \\ | - Die Makros entsprechen denen der letzten Programme. \\ \\ \\ \\ | ||
- | - Die Konstanten entsprechen im Wesentlichen denen der letzten Programme. Der Vorteiler Wert entspricht aber hier der Hälfte des bisherigen Wertes, da die Taktfrequenz ebenso halb so groß ist. \\ \\ \\ \\ \\ \\ | + | - Die Konstanten entsprechen im Wesentlichen denen der letzten Programme. Der Vorteiler Wert entspricht aber hier der Hälfte des bisherigen Wertes, da die Taktfrequenz ebenso halb so groß ist. \\ \\ \\ \\ \\ \\ \\ \\ |
- Für die Zeichen '' | - Für die Zeichen '' | ||
+ | - Für die anschaulichere Beschreibung von Bitwerten wird " | ||
+ | - Die Grenzen der Zeitgrößen sind hier ebenso definiert. \\ \\ \\ | ||
- Bei den Variablen entsprechen einige denen der letzten Programme. \\ \\ \\ \\ \\ | - 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. \\ \\ \\ | ||
- Für das neue Display werden Variablen für die Textposition und für das auszugebenden Zeichen deklariert. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | - Für das neue Display werden Variablen für die Textposition und für das auszugebenden Zeichen deklariert. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
- Das Flag PcdSendMessage zeigt an, ob Zeichen regelmäßig zu übertragen sind. \\ \\ \\ | - Das Flag PcdSendMessage zeigt an, ob Zeichen regelmäßig zu übertragen sind. \\ \\ \\ | ||
- | - 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. \\ \\ \\ \\ |
'' | '' | ||
- | \\ \\ | + | \\ \\ \\ \\ |
- Zunächst werden zwei Initialisierungsroutinen aufgerufen (siehe weiter unten) | - Zunächst werden zwei Initialisierungsroutinen aufgerufen (siehe weiter unten) | ||
- Dann werden wieder " | - Dann werden wieder " | ||
Zeile 496: | Zeile 514: | ||
- Auch die Konfiguration der Anschlüsse für die Schalter wurde bereits erklärt. Die an Port C angeschlossenen Taster erhalten dadurch einen Pull-up Widerstand. \\ \\ | - Auch die Konfiguration der Anschlüsse für die Schalter wurde bereits erklärt. Die an Port C angeschlossenen Taster erhalten dadurch einen Pull-up Widerstand. \\ \\ | ||
- Mit dem Befehl '' | - Mit dem Befehl '' | ||
- | - In der Endlosschleife sind verschiedene Zeitzyklen vorgesehen (wie beim [[4._up_down_counter|Up/Down Counter]]). \\ \\ | + | - In der Endlosschleife sind verschiedene Zeitzyklen vorgesehen (wie beim [[4_up_down_counter|Up/Down Counter]]). \\ \\ |
- | - im $10ms$ Raster (auch $10ms$ Zyklus genannt) wird die Unterfunktion '' | + | - im $10~\rm ms$ Raster (auch $10~\rm ms$ Zyklus genannt) wird die Unterfunktion '' |
- | - im $100ms$ Raster werden die Unterfunktionen '' | + | - im $100~\rm ms$ Raster werden die Unterfunktionen '' |
- | - im $1s$ Raster blinkt die LED und das Unterprogramm '' | + | - im $1~\rm s$ Raster blinkt die LED und das Unterprogramm '' |
'' | '' | ||
- Mit dem Befehl '' | - Mit dem Befehl '' | ||
- | - Die Ermittlung von '' | + | - Die Ermittlung von '' |
- | - Eine Erweiterung auf '' | + | - Eine Erweiterung auf '' |
'' | '' | ||
\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
- | - In dieser Funktion werden zunächst die Stellungen aller Taster eingelesen (vgl. '' | + | - In dieser Funktion werden zunächst die Stellungen aller Taster eingelesen (vgl. '' |
- | - Die Flankenerkennung in den if-Bedingungen wurde auch bereits beim [[4._up_down_counter|Up/down Counter]] erklärt. | + | - Die Flankenerkennung in den if-Bedingungen wurde auch bereits beim [[4_up_down_counter|Up/down Counter]] erklärt. |
- | - Wenn die Taste '' | + | - Wenn die Taste '' |
- | - Die Tasten '' | + | - Die Tasten '' |
- | - Die Taste '' | + | - Die Taste '' |
'' | '' | ||
Zeile 518: | Zeile 536: | ||
- Auf dem LCD wird zunächst die Position '' | - Auf dem LCD wird zunächst die Position '' | ||
- | - Vom Wert '' | + | - Vom Wert '' |
- Danach wird ein Doppelpunkt ausgegeben | - Danach wird ein Doppelpunkt ausgegeben | ||
- Die Anzeige von Minuten und Sekunden erfolgt analog. | - Die Anzeige von Minuten und Sekunden erfolgt analog. | ||
- | \\ \\ \\ \\ | + | \\ \\ \\ \\ \\ |
'' | '' | ||
Zeile 541: | Zeile 559: | ||
'' | '' | ||
\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ | ||
- | - Hier wird zunächst ein Flankenwechsel für den Lautsprecher ausgegeben. Damit knackt der Lautsprecher etwa im $10ms$ Takt. | + | - Hier wird zunächst ein Flankenwechsel für den Lautsprecher ausgegeben. Damit knackt der Lautsprecher etwa im $10~\rm ms$ Takt. |
- | - In den verschachtelten if-Anweisungen werden jeweils die einzelnen Werte (z.B. '' | + | - In den verschachtelten if-Anweisungen werden jeweils die einzelnen Werte (z.B. '' |
</ | </ | ||
Zeile 548: | Zeile 566: | ||
<-- | <-- | ||
--> IV. Ausführung in Simulide # | --> IV. Ausführung in Simulide # | ||
- | - Legen Sie in Atmel Studio ein neues Projekt an. | + | - Legen Sie in Microchip |
- | - Fügen Sie in dieses die *.c und *.h Files aus dem File '' | + | - Fügen Sie in dieses die *.c und *.h Files aus dem File '' |
- Geben Sie die oben dargestellten Codezeilen in '' | - Geben Sie die oben dargestellten Codezeilen in '' | ||
- Ö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 572: | Zeile 590: | ||
- Um den Signalverlauf besser zu sehen, kann mit einem Klick auf '' | - Um den Signalverlauf besser zu sehen, kann mit einem Klick auf '' | ||
- Das im Bild dargestellte Signal ist '' | - Das im Bild dargestellte Signal ist '' | ||
- | - Analyse der Dateien in '' | + | - Analyse der Dateien in '' |
- In der Datei '' | - In der Datei '' | ||
- In der Datei '' | - In der Datei '' | ||
Zeile 590: | Zeile 608: | ||
===== weiterführendes ===== | ===== weiterführendes ===== | ||
- | * Diese [[http:// | + | * Diese [[http:// |
+ | * Ein einfaches Beispiel für eine Anfrage von Daten beim Slave ist unter [[weitere Codebeispiele]] eingefügt | ||