Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
microcontrollertechnik:3_logische_funktionen [2020/05/01 17:01] tfischer angelegt |
microcontrollertechnik:3_logische_funktionen [2024/03/11 00:12] (aktuell) mexleadmin |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== 3. Up-Down Counter | + | ====== 3 Logische Funktionen |
- | ===== LCD Displany ansteuern - wie kommt Test auf eine Anzeige? | + | ===== Tasten einlesen |
<WRAP group> | <WRAP group> | ||
<WRAP column 30%> | <WRAP column 30%> | ||
Zeile 9: | Zeile 9: | ||
Nach dieser Lektion sollten Sie: | Nach dieser Lektion sollten Sie: | ||
- | - wissen, wie Display angesprochen wird | + | - wissen, wie eine Taste eingelesen werden kann |
</ | </ | ||
==== Video ==== | ==== Video ==== | ||
- | {{youtube> | + | {{youtube> |
+ | |||
+ | <WRAP hide> | ||
+ | {{youtube> | ||
+ | </ | ||
</ | </ | ||
+ | |||
+ | ==== Übung ==== | ||
+ | |||
+ | --> I. Vorarbeiten # | ||
+ | - Laden Sie folgende Datei herunter: | ||
+ | - {{microcontrollertechnik: | ||
+ | - {{microcontrollertechnik: | ||
+ | - {{microcontrollertechnik: | ||
+ | |||
+ | <-- | ||
+ | --> II. Analyse des fertigen Programms # | ||
+ | - Initialisieren des Programms | ||
+ | - Öffnen Sie SimulIDE und öffnen Sie dort mittels {{microcontrollertechnik: | ||
+ | - Laden Sie '' | ||
+ | - Betrachtung der neuen Komponenten: | ||
+ | - Betrachtung des Programmablaufs | ||
+ | - 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: | ||
+ | - AND-Verknüpfung: | ||
+ | - OR-Verknüpfung: | ||
+ | - NOT-Verknüpfung: | ||
+ | - XOR-Verknüpfung: | ||
+ | - Werden die Tasten S1 und S2 gedrückt, so werden die Ergebnisse aktualisiert. | ||
+ | - Das Programm zu diesem Hexfile soll nun erstellt werden | ||
+ | |||
+ | <-- | ||
+ | --> III. Eingabe in Microchip Studio # | ||
+ | \\ \\ | ||
+ | <panel type=" | ||
+ | Beachten Sie, dass die '' | ||
+ | </ | ||
+ | |||
+ | <WRAP group>< | ||
+ | / | ||
+ | |||
+ | Experiment 3: | ||
+ | ============= | ||
+ | |||
+ | Dateiname: | ||
+ | |||
+ | Autoren: | ||
+ | Prof. G. Gruhler (Hochschule Heilbronn) | ||
+ | D. Chilachava | ||
+ | |||
+ | Version: | ||
+ | |||
+ | Hardware: | ||
+ | AVR-USB-PROGI Ver. 2.0 | ||
+ | |||
+ | Software: | ||
+ | C-Compiler: AVR/GNU C Compiler 5.4.0 | ||
+ | |||
+ | Funktion: | ||
+ | logischen Verknuepfungen (UND, ODER, NOT, XOR) dargestellt. | ||
+ | Die logischen Eingangssignale werden von den Tasten S1 und S2 | ||
+ | eingelesen. | ||
+ | |||
+ | Displayanzeige: | ||
+ | +----------------+ | ||
+ | |- Experiment 3 -| |S1& | ||
+ | |Logic Functions | |/ | ||
+ | +----------------+ | ||
+ | |||
+ | Tastenfunktion: | ||
+ | |||
+ | Jumperstellung: | ||
+ | |||
+ | Fuses im uC: CKDIV8: Aus (keine generelle Vorteilung des Takts) | ||
+ | |||
+ | Header-Files: | ||
+ | |||
+ | =============================================================================*/ | ||
+ | |||
+ | // Deklarationen ============================================================== | ||
+ | |||
+ | // Festlegung der Quarzfrequenz | ||
+ | #ifndef F_CPU // | ||
+ | #define F_CPU 18432000UL // | ||
+ | # | ||
+ | |||
+ | // Include von Header-Dateien | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include " | ||
+ | |||
+ | // Konstanten | ||
+ | #define ASC_ZERO | ||
+ | #define ASC_ONE | ||
+ | |||
+ | // Variable | ||
+ | bool sw1 = 0; // Bitspeicher fuer Taste 1 | ||
+ | bool sw2 = 0; // Bitspeicher fuer Taste 2 | ||
+ | |||
+ | // Makros | ||
+ | #define SET_BIT(BYTE, | ||
+ | #define CLR_BIT(BYTE, | ||
+ | |||
+ | // Funktionsprototypen | ||
+ | void initDisplay(void); | ||
+ | void initTaster(void); | ||
+ | void readButtons(void); | ||
+ | |||
+ | // Hauptprogramm ============================================================== | ||
+ | int main() // | ||
+ | { | ||
+ | initDisplay(); | ||
+ | |||
+ | unsigned char temp; // temporaere Variable definieren | ||
+ | | ||
+ | while(1) // | ||
+ | { | ||
+ | readButtons(); | ||
+ | |||
+ | if (sw1&& | ||
+ | else temp=ASC_ZERO; | ||
+ | lcd_gotoxy(0, | ||
+ | lcd_putc(temp); | ||
+ | |||
+ | if (sw1||sw2) temp=ASC_ONE; | ||
+ | else temp=ASC_ZERO; | ||
+ | lcd_gotoxy(0, | ||
+ | lcd_putc(temp); | ||
+ | |||
+ | if (!sw1) | ||
+ | else | ||
+ | lcd_gotoxy(1, | ||
+ | lcd_putc(temp); | ||
+ | |||
+ | if (sw1^sw2) | ||
+ | else temp=ASC_ZERO; | ||
+ | lcd_gotoxy(1, | ||
+ | lcd_putc(temp); | ||
+ | |||
+ | _delay_ms(100); | ||
+ | |||
+ | } // Ende der unendlichen Schleife | ||
+ | |||
+ | } // | ||
+ | |||
+ | // Funktionen ================================================================= | ||
+ | |||
+ | // Initialisierung Display-Anzeige | ||
+ | void initDisplay(void) | ||
+ | { | ||
+ | lcd_init(); | ||
+ | |||
+ | lcd_gotoxy(0, | ||
+ | lcd_putstr(" | ||
+ | |||
+ | lcd_gotoxy(1, | ||
+ | lcd_putstr(" | ||
+ | |||
+ | _delay_ms(2000); | ||
+ | |||
+ | lcd_gotoxy(0, | ||
+ | lcd_putstr(" | ||
+ | |||
+ | lcd_gotoxy(1, | ||
+ | lcd_putstr("/ | ||
+ | } | ||
+ | |||
+ | |||
+ | // Tastenwerte S1 und S2 (ohne Entprellen) einlesen | ||
+ | void readButtons(void) | ||
+ | // | ||
+ | | ||
+ | DDRC = DDRC & 0b11111100; | ||
+ | PORTC = | ||
+ | _delay_us(1); | ||
+ | sw1 = !(PINC & (1 << PC0)); // Tasten invertiert in Bitspeicher einlesen | ||
+ | sw2 = !(PINC & (1 << PC1)); // somit gedrueckte Taste =" | ||
+ | DDRC = DDRC | 0b00000011; | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | ''/ | ||
+ | |||
+ | Ändern Sie auch hier wieder die Beschreibung am Anfang des C-Files, je nachdem was Sie entwickeln | ||
+ | '' | ||
+ | |||
+ | - Hier wird wieder nach dem Quarz geprüft und ggf. dessen Frequenz eingestellt | ||
+ | - Bei den Header-Dateien wird nun die '' | ||
+ | - Als Konstanten werden '' | ||
+ | - Die Variablen '' | ||
+ | - Die Makros wurden bereits erklärt | ||
+ | - Die Funktionsprototypen zeigen wieder die kommenden Unterprogramme an | ||
+ | |||
+ | <WRAP right>< | ||
+ | < | ||
+ | </ | ||
+ | {{drawio> | ||
+ | </ | ||
+ | |||
+ | '' | ||
+ | |||
+ | - Zunächst werden zwei Initialisierungsroutinen aufgerufen (siehe weiter unten) | ||
+ | - Dann wird eine temporäre Variable deklariert, welche im Folgenden die das ASCII-Zeichen der Ergebnisse enthält | ||
+ | - In der Endlosschleife wird zunächst die Unterfunktion '' | ||
+ | - die Zeilen 84...102 scheinen sich sehr zu ähneln: | ||
+ | - Hier steht jeweils zuerst eine '' | ||
+ | - Die Funktion '' | ||
+ | - Für die verschiedenen booleschen Funktionen steht jeweils eine '' | ||
+ | - In Zeile '' | ||
+ | |||
+ | \\ \\ \\ \\ \\ \\ | ||
+ | |||
+ | '' | ||
+ | \\ \\ | ||
+ | - In '' | ||
+ | - Funktion '' | ||
+ | - Durch die Änderung des Datenrichtungs-Register (DDR) wird die Richtung der Anschlüsse vorgegeben. Es sollen dabei die Schalter S1 und S2 einlesbar gestellt werden (in Simulide durch die Tasten '' | ||
+ | - Die Verzögerung '' | ||
+ | - 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. \\ \\ \\ \\ | ||
+ | |||
+ | |||
+ | </ | ||
+ | <-- | ||
+ | --> IV. Ausführung in Simulide # | ||
+ | - Geben Sie die oben dargestellten Codezeilen nacheinander ein und kompilieren Sie den Code. | ||
+ | - Öffnen Sie Ihre hex-Datei in SimulIDE und testen Sie, ob diese die gleiche Ausgabe erzeugt | ||
+ | |||
+ | <-- | ||
+ | \\ | ||
+ | |||
+ | Bitte arbeiten Sie folgende Aufgaben durch: | ||
+ | |||
+ | --> Aufgaben# | ||
+ | - Berechnungen zum '' | ||
+ | - Suchen Sie den Wert des Pull-up Widerstands an einem I/O-Pin im Datenblatt des atmega 88 unter '' | ||
+ | - 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? | ||
+ | - Erweiterung der Schalteranzahl | ||
+ | - 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 '' | ||
+ | - Als ersten Test sollten die booleschen Funktionen statt den Schaltern '' | ||
+ | - Im nächsten Programm sollen alle Schalter '' | ||
+ | |||
+ | <-- | ||
+ | |||
+ | |||
+ | |||
+ | * Diese [[https:// | ||
+ | |||
+ | |||
+ |