176 lines
4.8 KiB
Markdown
Executable File
176 lines
4.8 KiB
Markdown
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
|
|
|
|
```java
|
|
#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
|
|
```
|
|
|
|
```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 <serIO.h>
|
|
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 <REF515C.H>
|
|
|
|
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
|
|
|
|
```
|
|
|