4.8 KiB
Executable File
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
#include <REG515C.h> // 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
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).
/*
& 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
#include <serIO.h>
serInit();
uchar taste = serWaitIn(); //Warten auf Eingabe
taste = serIn(); //Direkte Eingabe
serCharOut(taste);
Ausschnitt aus komplexeDatentypenDemo.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.
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
- New Projekt
- C515C-L
- Do not copy STARTUP.A51
- .s Datei erstellen (wird von alleine zu einer .a51)
- Options
- A51
- Define 8051 SFR Names checked (oder nicht abhängig von der Config)
- Target
- Operating System: Compact
- A51
#include <REF515C.H>
org 0 //start bei Adresse 0
jmp 0 // springe zu Adresse 0
end
Hardware-Operationen und -Kontrollstrukturen der 8051 Mikrocontroller
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