/*
BITTE ERSTELLEN SIE SICH VORAB EINE PRIVATE KOPIE, DAZU
AUF "SAVE AS" GEHEN.
Aufgabenbeschreibung:
Es soll eine Steuerung aufgebaut werden, welche ein eingelesenes
Byte auf einer vierstelligen 7 Segmentanzeige als
Dezimaläquivalent darstellt.
Das eingelesene Byte wird hier durch die Veränderung eines Potis
vorgegeben. Die Steuerung soll auf einem µC (AT-Mega 328, Arduino Uno)
realisiert werden.
Folgende Pin Belegung ist zu beachten
Port B
Bit 0/1/2/3/4/5/6/7
Bez yG/yDig1/yDig2/yDig3/yDig4/Res/Res/Res
Port D
Bit 0/1/2/3/4/5/6/7
Bez Res/Res/yA/yB/yC/yD/yE/yF
R1) Das eingelesene Byte soll als Dezimaläquivalent auf der
Siebensegmentanzeige fortwährend dargestellt werden.
R2) Die hier verwendete Anzeige verfügt über vier 7
Segmentanzeigen. Jede 7Segmentanzeige wiederum aus sieben
LEDs (A,B,C,...,G), s. https://docs.wokwi.com/parts/wokwi-7segment
Die einzelnen 7Segmentanzeigen lassen sich durch ein Löschen der Bits
yDig1, ..., yDig4 ansteuern --> yDig1 = 0 und yDig 2 = 0
--> yA,yB, ..., yG Anzeige wird an erster Stelle (yDig1, ganze rechts)
und an zweiter Stelle (yDig2) dargestellt.
Die einzelnen LEDs (yA,..., yG) werden zum Leuchten gebracht, indem
die Bits yA, yB, ... gesetzt werden.
R3) Der Mikrocontroller soll fortlaufend die Funktion readPoti aufrufen,
um das Byte einzulesen.
Diese Funktion liefert als Rückgabewert eine Null, wenn das Einlesen
des Potis funktioniert hat. Die Funktion wird über
call by reference aufgerufen, s. Funktionssignatur.
R4) Die Datenrichtungen sollen in einer InitIO() Funktion eingestellt werden.
R5) Alle Ausgänge sollen zu Beginn auf 1 initialisiert werden.
R6) Nutzen Sie zum Lesen und Schreiben der digitalen Ein- und
Ausgänge die Funktionen InputByte und OutputByte der HAS.
R7) Wird entweder in der HAS oder beim Einlesen des Poti Bytes
ein Fehlerwert zurückgegeben, soll auf allen 7Segmentanzeigen
eine 1 dargestellt werden.
R8) Reservierte Bits dürfen nicht in Wert oder Datenrichtung geändert werden.
Ausgänge sind rücklesbar.
ACHTUNG:
Bitte nutzen Sie anstatt des bekannten int main(void) Aufbaus
eine void setup() + void loop() Struktur, wie folgend dargestellt.
Die Funktion setup() wird dabei bei der Abarbeitung einmal durchlaufen
und die Funktion loop() anschließend permanent.
*/
// typ bool ist bereits deklariert
typedef unsigned char uint8_t;
typedef unsigned char BYTE;
typedef enum {PB, PC, PD} PORT;
typedef enum {K0=0, K1, K2, K3, K4, K5, K6, K7} CHANNEL;
void preSetup(void){
// Pseudo-Funktion soll testen, ob reservierte Bits geändert wurden
BYTE PDval = 0b00000000;
BYTE PBval = 0b00100000;
DDRD = 0b00000010; // Output := 1, Input := 0
DDRB = 0b00100100; // Output := 1, Input := 0
OutputByte(PD, PDval);
OutputByte(PB, PBval);
}
BYTE InputByte (PORT PortName, BYTE* ReadValue){
// Hardwareabstraktionsschicht, Einlesen und Abspeichern an Adresse ReadValue
if (PortName == PB){
*ReadValue = PINB;
}
else if (PortName == PC){
*ReadValue = PINC;
}
else if (PortName == PD){
*ReadValue = PIND;
}
return 0;
}
BYTE OutputByte (PORT PortName, BYTE WriteValue){
// Hardwareabstraktionsschicht, Ausgabe des Bytes WriteValue am Port PortName
if (PortName == PB){
PORTB = WriteValue;
}
else if (PortName == PC){
PORTC = WriteValue;
}
else if (PortName == PD){
PORTD = WriteValue;
}
return 0;
}
int readPoti(BYTE *valPoti){
// Funktion, die den PotiWert (0...1023) einlies und
// in ein Byte umwandelt.
// Rueckgabewert <> 0 --> Fehler
// Ergebnis wird an die Adresse von valPoti geschrieben
int returnVal = 0;
int randNumber = random(100); // Random number for error code
int valPoti10Bit = analogRead(A0);
*valPoti = map(valPoti10Bit,0,1023,0,255);
if (randNumber > 98) returnVal = randNumber; // Return Value depending on random number
return(returnVal);
}
void setup(){
// Code, der nur einmal ausgeführt wird
}
void loop(){
// Pseudofunktion zum Testen, ob reservierte Bits geaendert wurden
// Rote LED darf nicht leuchten, Gruene muss leuchten
preSetup();
// Ab hier Ihr Code
// Do nothing more, wegen Umstrickung main() --> loop(), nach Fehler
// "Abbruch"
while(1) {
}
}