Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
microcontrollertechnik:3_logische_funktionen [2021/05/09 11:14] 127.0.0.1 Externe Bearbeitung |
microcontrollertechnik:3_logische_funktionen [2024/03/11 00:12] (aktuell) mexleadmin |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== 3. Logische Funktionen ====== | + | ====== 3 Logische Funktionen ====== |
===== Tasten einlesen | ===== Tasten einlesen | ||
Zeile 14: | Zeile 14: | ||
==== Video ==== | ==== Video ==== | ||
+ | {{youtube> | ||
+ | |||
+ | <WRAP hide> | ||
{{youtube> | {{youtube> | ||
+ | </ | ||
</ | </ | ||
Zeile 22: | Zeile 26: | ||
--> I. Vorarbeiten # | --> I. Vorarbeiten # | ||
- Laden Sie folgende Datei herunter: | - Laden Sie folgende Datei herunter: | ||
- | - {{microcontrollertechnik: | + | - {{microcontrollertechnik: |
- | - {{microcontrollertechnik: | + | - {{microcontrollertechnik: |
- {{microcontrollertechnik: | - {{microcontrollertechnik: | ||
Zeile 29: | Zeile 33: | ||
--> 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 '' |
- | - Betrachtung der neuen Komponenten: | + | - Betrachtung der neuen Komponenten: |
- Betrachtung des Programmablaufs | - Betrachtung des Programmablaufs | ||
- 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 ein Displaybild zu sehen, in dem verschiedene logische Formeln mit Ergebnissen abgebildet sind: | - Als nächstes ist ein Displaybild zu sehen, in dem verschiedene logische Formeln mit Ergebnissen abgebildet sind: | ||
- | - AND-Verknüpfung: | + | - AND-Verknüpfung: |
- | - OR-Verknüpfung: | + | - OR-Verknüpfung: |
- | - NOT-Verknüpfung: | + | - NOT-Verknüpfung: |
- | - XOR-Verknüpfung: | + | - XOR-Verknüpfung: |
- Werden die Tasten S1 und S2 gedrückt, so werden die Ergebnisse aktualisiert. | - Werden die Tasten S1 und S2 gedrückt, so werden die Ergebnisse aktualisiert. | ||
- Das Programm zu diesem Hexfile soll nun erstellt werden | - Das Programm zu diesem Hexfile soll nun erstellt werden | ||
<-- | <-- | ||
- | --> III. Eingabe in Atmel Studio # | + | --> III. Eingabe in Microchip |
\\ \\ | \\ \\ | ||
<panel type=" | <panel type=" | ||
- | Beachten Sie, dass die '' | + | Beachten Sie, dass die '' |
</ | </ | ||
<WRAP group>< | <WRAP group>< | ||
/ | / | ||
- | + | ||
- | Experiment 3: Logische Basisfunktionen in Software | + | Experiment 3: |
- | ============= ==================================== | + | ============= |
- | + | ||
- | Dateiname: Logic_Functions.c | + | Dateiname: |
- | + | ||
- | Autoren: Peter Blinzinger | + | Autoren: |
- | Prof. G. Gruhler (Hochschule Heilbronn) | + | Prof. G. Gruhler (Hochschule Heilbronn) |
- | D. Chilachava (Georgische Technische Universitaet) | + | D. Chilachava |
- | + | ||
- | Version: 1.2 vom 27.04.2020 | + | Version: |
- | + | ||
- | Hardware: MEXLE2020 Ver. 1.0 oder höher | + | Hardware: |
- | AVR-USB-PROGI Ver. 2.0 | + | AVR-USB-PROGI Ver. 2.0 |
- | + | ||
- | Software: Entwicklungsumgebung: | + | Software: |
- | C-Compiler: AVR/GNU C Compiler 5.4.0 | + | C-Compiler: AVR/GNU C Compiler 5.4.0 |
- | + | ||
- | Funktion: Auf dem Display werden Ergebnisse von | + | Funktion: |
- | logischen Verknuepfungen (UND, ODER, NOT, XOR) dargestellt. | + | logischen Verknuepfungen (UND, ODER, NOT, XOR) dargestellt. |
- | Die logischen Eingangssignale werden von den Tasten S1 und S2 | + | Die logischen Eingangssignale werden von den Tasten S1 und S2 |
- | eingelesen. | + | eingelesen. |
- | + | ||
- | Displayanzeige: | + | Displayanzeige: |
- | +----------------+ +----------------+ | + | +----------------+ |
- | |- Experiment 3 -| |S1& | + | |- Experiment 3 -| |S1& |
- | |Logic Functions | |/ | + | |Logic Functions | |/ |
- | +----------------+ +----------------+ | + | +----------------+ |
- | + | ||
- | Tastenfunktion: | + | Tastenfunktion: |
- | + | ||
- | Jumperstellung: | + | Jumperstellung: |
- | + | ||
- | 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 // ATmega | + | #define F_CPU 18432000UL // ATmega |
- | #endif | + | # |
+ | |||
// Include von Header-Dateien | // Include von Header-Dateien | ||
- | #include < | + | #include < |
- | #include < | + | #include < |
- | #include < | + | #include < |
- | #include " | + | #include " |
+ | |||
// Konstanten | // Konstanten | ||
- | # | + | # |
- | # | + | # |
+ | |||
// Variable | // Variable | ||
- | bool sw1 = 0; // Bitspeicher fuer Taste 1 | + | bool sw1 = 0; // Bitspeicher fuer Taste 1 |
- | bool sw2 = 0; // Bitspeicher fuer Taste 2 | + | bool sw2 = 0; // Bitspeicher fuer Taste 2 |
+ | |||
// Makros | // Makros | ||
- | #define SET_BIT(PORT, BIT) ((PORT) |= (1<< | + | #define SET_BIT(BYTE, BIT) ((BYTE) |= (1 << |
- | #define CLR_BIT(PORT, BIT) ((PORT) &= ~(1<< | + | #define CLR_BIT(BYTE, BIT) ((BYTE) &= ~(1 << |
+ | |||
// Funktionsprototypen | // Funktionsprototypen | ||
- | void initDisplay(void); | + | void initDisplay(void); |
- | void initTaster(void); | + | void initTaster(void); |
- | void readButtons(void); | + | void readButtons(void); |
+ | |||
// Hauptprogramm ============================================================== | // Hauptprogramm ============================================================== | ||
- | int main() // Start des Hauptprogramms | + | int main() // |
- | { | + | { |
- | initDisplay(); | + | initDisplay(); |
- | initTaster(); | + | |
- | + | unsigned char temp; // temporaere Variable definieren | |
- | unsigned char temp; // temporaere Variable definieren | + | |
- | + | while(1) // | |
- | while(1) // unendliche Schleife | + | { |
- | { | + | readButtons(); |
- | + | | |
- | readButtons(); | + | if (sw1&& |
- | + | else temp=ASC_ZERO; | |
- | if (sw1&& | + | lcd_gotoxy(0, |
- | else temp=NULL; | + | lcd_putc(temp); |
- | lcd_gotoxy(0, | + | |
- | lcd_putc(temp); | + | if (sw1||sw2) temp=ASC_ONE; // Ergebnis der ODER-Verknuepfung |
- | + | else temp=ASC_ZERO; | |
- | if (sw1||sw2) temp=EINS; // Ergebnis der ODER-Verknuepfung | + | lcd_gotoxy(0, |
- | else temp=NULL; | + | lcd_putc(temp); |
- | lcd_gotoxy(0, | + | |
- | lcd_putc(temp); | + | if (!sw1) |
- | + | else | |
- | if (!sw1) temp=EINS; // Ergebnis der Negation | + | lcd_gotoxy(1, |
- | else temp=NULL; | + | lcd_putc(temp); |
- | lcd_gotoxy(1, | + | |
- | lcd_putc(temp); | + | if (sw1^sw2) |
- | + | else temp=ASC_ZERO; | |
- | if (sw1^sw2) temp=EINS; // Ergebnis der XOR-Verknuepfung | + | lcd_gotoxy(1, |
- | else temp=NULL; | + | lcd_putc(temp); |
- | lcd_gotoxy(1, | + | |
- | lcd_putc(temp); | + | _delay_ms(100); |
- | + | ||
- | _delay_ms(100); | + | } // Ende der unendlichen Schleife |
- | + | ||
- | } // Ende der unendlichen Schleife | + | } // Ende des Hauptprogramms |
- | + | ||
- | } // Ende des Hauptprogramms | + | |
// Funktionen ================================================================= | // Funktionen ================================================================= | ||
+ | |||
// Initialisierung Display-Anzeige | // Initialisierung Display-Anzeige | ||
void initDisplay(void) | void initDisplay(void) | ||
{ | { | ||
- | 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("/ |
} | } | ||
- | + | ||
- | // Initialisierung der Taster | + | |
- | void initTaster(void) | + | |
- | // | + | |
- | {// | + | |
- | DDRB = DDRB & 0b11111001; | + | |
- | PORTB = | + | |
- | + | ||
- | _delay_us(10); | + | |
- | } | + | |
// Tastenwerte S1 und S2 (ohne Entprellen) einlesen | // Tastenwerte S1 und S2 (ohne Entprellen) einlesen | ||
void readButtons(void) | void readButtons(void) | ||
- | { | + | // |
- | sw1 = !(PINB & (1 << | + | {// __76543210 |
- | sw2 = !(PINB & (1 << | + | DDRC = DDRC & 0b11111100; |
+ | PORTC = | ||
+ | _delay_us(1); | ||
+ | sw1 = !(PINC & (1 << | ||
+ | sw2 = !(PINC & (1 << | ||
+ | DDRC = DDRC | 0b00000011; | ||
} | } | ||
</ | </ | ||
Zeile 228: | Zeile 226: | ||
- In Zeile '' | - In Zeile '' | ||
- | \\ \\ \\ | + | \\ \\ \\ \\ \\ \\ |
'' | '' | ||
\\ \\ | \\ \\ | ||
- | - In '' | + | - In '' |
- | - Funktion '' | + | - Funktion '' |
- | - Durch die Änderung des Datenrichtungs-Register (DDR) wird die Richtung der Anschlüsse vorgegeben. | + | - Durch die Änderung des Datenrichtungs-Register (DDR) wird die Richtung der Anschlüsse vorgegeben. |
- | - Mit der Zuweisung von '' | + | - Die Verzögerung '' |
- | - Funktion '' | + | - Mit der Zuweisung von '' |
+ | - Im Register '' | ||
+ | - Zum Schluss müssen die Anschlüsse wieder auf Output geschaltet werden, damit danach die Daten für das Display sinnvoll übertragen werden können. \\ \\ \\ \\ | ||
Zeile 251: | Zeile 251: | ||
--> Aufgaben# | --> Aufgaben# | ||
- | - Erweiterung der Schalteranzahl: | + | |
- | - Fügen Sie zwei weitere Tasten mit Verbindung zu Masse und jeweils den Eingängen '' | + | - Suchen Sie den Wert des Pull-up Widerstands an einem I/O-Pin im Datenblatt des atmega 88 unter '' |
- | - Klicken Sie rechts auf den Schalter | + | - Bestimmen Sie $\tau$ aus der Streukapazität von $C_{\rm s} \approx 10~\rm pF$. |
+ | - die meisten Befehle des AVR-Microcontrollers benötigen 2 Takte. Bei $10~\rm MHz$ benötigt ein Befehl etwa $\rm 2 \cdot {{1}\over{10~ MHz}} = 2 \cdot 10^{-7}~ s = 0,2~ \mu s$. \\ Wie weit ist nach einem Befehl der Streukondensator aufgeladen? | ||
+ | - Ab wann kann davon ausgegangen werden, dass die parasitäre Kapazität voll aufgeladen ist? | ||
+ | - Wie viele Takte entsprechen $1~\rm \mu s$ bei einer Taktfrequenz von $8~\rm MHz$? | ||
+ | - Wann wäre die Kapazität aufgeladen, wenn diese sich durch einen externen IC um ein 10faches erhöht? | ||
+ | - Die Situation bei einem Eingangspin ist etwas anders: Hier existiert die parasitäre Kapazität auch. Diese wird aber mit ca. $20~\rm mA$ geladen. \\ Nehmen Sie eine High Spannung von $5~\rm V$ an. | ||
+ | - Wie lange dauert es nun bis die parasitäre Kapazität aufgeladen ist? | ||
+ | - Wie viele Takte entspricht das bei $10~\rm | ||
+ | - Generell müssen intern im Microcontroller in jedem Takt die Kapazitäten von MOSFETs geladen werden. \\ Wieso werden bei schnelleren Anwendungen (z.B. Mobilgeräten) geringere Versorgungsspannungen (z.B. $1,8~\rm V$) verwendet? | ||
+ | - ASCII Code: Warum können nicht einfach die Zahlen $0...9$ übertragen werden? Stattdessen müssen diese in ein ASCII Format gewandelt werden. \\ Was würde ausgegeben werden, wenn tatsächlich die Zahlen $0...9$ gesendet werden würden? | ||
+ | | ||
+ | - Fügen Sie zwei weitere Tasten mit Verbindung zu Masse und jeweils den Eingängen '' | ||
+ | - Klicken Sie bei den neu eingefügten Schaltern mit Rechtsklick an und wählen Sie im Kontextmenu '' | ||
- Ändern Sie den Code so, dass diese Schalter eingelesen werden können. Dazu sollten die Funktionen '' | - Ändern Sie den Code so, dass diese Schalter eingelesen werden können. Dazu sollten die Funktionen '' | ||
- Als ersten Test sollten die booleschen Funktionen statt den Schaltern '' | - Als ersten Test sollten die booleschen Funktionen statt den Schaltern '' | ||
- | - Im nächsten Programm sollen alle Schalter '' | + | - Im nächsten Programm sollen alle Schalter '' |
<-- | <-- | ||
+ | |||
+ | |||
+ | |||
+ | * Diese [[https:// | ||
+ | |||