
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
	
```

