C515C Mikrocontroller Klausur Ersttermin: 11.7.2024 Gruppe II 12:55 - 17:00 # Organisatorisches Labor: Logikanalyse 6 Laboreinheiten mit Analyse und Programmierung des 8051 Mikrocontroller - In Aulis Aufgaben zum Vor- & Nacharbeiten - Bei Messaufgaben ist ein Bericht gefordert, bei Programmierungsaufgaben ist dies nicht nötig. - Ein Antreten ist beim 1. Prüfungstermin der Laboraufgaben ist VERPFLICHTEND, ansonsten kämpft man mit dem Prüfungsauschuss Bredi stellt ein LaTeX-Packet zur verfügung für irgendwas... habs nicht mental aufgenommen, dient aber dem Kontext der Labore Labortermin wird Donnerstag um eine viertel Stunde verschoben. # Grundlagen der Programmiersprache C Quellcode wird von Bredi hochgeladen. KEINE KLASSEN WUUUUUUUUU STARTUP.A51 --> Assembly Datei für 8051 Microkontroller stdint.h definiert verlässliche Bitbreite von Variablen (ein long ist nicht unbedingt 32 Bits) \_t steht für Typ und ist Konvention ## Einstellungen $\mu$Vision Für die Labore werden C515C-L Microcontroller verwendet, für mu vision ist dies ebenfalls wichtig. Memory Model: Small Code Rom Size: Compact ### Debug: - Use Keil Monitor-51 Driver wenn ein Microkontroller angeschlossen ist ansonsten use Simulator - Target setup - Einstellen des Portes - Stop Program Execution with Serial Interrupt wird empfohlen - Einstellen des WatchDog-Timers - mitgabe einer Initialization File - WatchdogAus.ini - .\ ### Einzelne Ausgabe der Einzelnen Bits und Bytes - Ansprechen über die Speicherbereiche (Special Function Register) - Mehrere SFR für Ports - Port 5 ist frei verfügbar, 4 ist größtenteils verfügbar, Port 1 abhängig vom Jumper ```java #include // enthält die ganzen Codes zum Ansprechen der Ports etc sfr meinPort = 0x90; // special function register, definition der Adresse des Portes nummer 1 sbit meinLsbVonP1 = meinPort^0; // auswahl des signifikanten Bits ``` ```c switch (tier) { case hund: demovar = 47; case katze: demovar =+ 2; break; } ``` Der gegebene Code läuft wenn tier == hund ist durch den Case *hund* und danach durch den Case *katze*, weil nicht *gebreaked* wird. Zitate usw. beispielsweise: [Brede, 24] _____ ### Kontrollstrukturen Setzen von Bits anhand von Masken (meistens ein Byte, der &, | genommen wird um den gewünschten Bit zu invertieren). ```C /* & and | or ^ xor ~ complement >> right shifting << left shifting */ ``` Bedenke an Port 5 des Mikrocontrollers gilt negative Logik, daher ~-Operator verwenden. ### Ein und Ausgabe für Zwecke der Laborausgaben Ausschnitt aus eingabeAusgabeDemo.c ```C #include serInit(); uchar taste = serWaitIn(); //Warten auf Eingabe taste = serIn(); //Direkte Eingabe serCharOut(taste); ``` Ausschnitt aus komplexeDatentypenDemo.c ```C int *intptr; int cream[10]; inptr = cream //bekommt die adresse vom nullten Index von cream *intptr++ = 37 // setzt cream[0] = 37 und erhöht dann den Zeiger um die Bitzahl eines Integers ``` Es gibt 3 Addressspeicher für den Mikrocontroller, in den Speicherraum code, kann eingeschrieben werden, danach aber nicht modifiziert werden. ```C char code myString[] = "Hallo Welt."; ``` ## Grundlegende Hardwarestruktur eines Rechners Wie wird eine konstante geladen? Wie wird eine konstante aus einem Register in den Speicher geladen? ## Hardwarestruktur des 8051 Mikrocontrollers Kurze Wiederholung vom Speicher-Layout. Registerbank (RB0 - RB3) kann durchaus sinnvoll für den 32 Bit-Addierer sein. Oder es wird eine Registerbank und alle 8 Register verwendet. code, data und xdata ### Erstellen eines Projektes für Assembler 1. New Projekt 1. C515C-L 2. Do not copy STARTUP.A51 2. .s Datei erstellen (wird von alleine zu einer .a51) 3. Options 1. A51 1. Define 8051 SFR Names checked (oder nicht abhängig von der Config) 2. Target 1. Operating System: Compact ```c #include org 0 //start bei Adresse 0 jmp 0 // springe zu Adresse 0 end ``` ## Hardware-Operationen und -Kontrollstrukturen der 8051 Mikrocontroller ```c setb c //ansprechen des ein bit-registers clr c //clear ; //Kommentar mov dptr,#02000h //initialisierung des Datapointers bei externer Adresse 02000h movx @dptr,a // Einschreiben des Akkumulatorwertes in die externe Adresse 02000h //---- Logische Befehle ---- anl orl xrl setb 4 // setzt den 4. Bit auf 1 cpl // //----Grundlegende Sprungbefehle---- jmp sprungziel sprungziel: jz //sprung nur bei Akkumulator bei Null jnz //jump not zero jc //jump carry (carry ist eins) jnc // jump not carry dnjz //decrementiert und spring wenn nicht null cjne //vergleich und sprung und kann ein Carry-Flag setzen PSW //Program Status Word rr rrc da //Überlaufkorrektur swap // mov movc // jb p1.0,$ // warten auf fallende Flanke jnb p1.0,$ // warten auf steigende Flanke codebase equ 0 //setzen eines variabelnamen für bestimmten Wert ```