Zylonenauge Übersicht
Um mit den 8 Port-Pins von PORTB die 16 LED ansteuern zu können sind die LED als Matrix verschaltet. Um beispielsweise L0 leuchten zu lassen muss PB4 auf 0 und PB0 auf 1 geschaltet werden. An PORTB muss dazu 0b11100001 = 0xe1 ausgegeben werden.
Die Taster T2..T0 sind gegen GND (0V) verschaltet, bei Betätigung liegt Low-Signal am Eingang vor. Die internen PullUps müssen eingeschaltet werden, damit bei offenem Taster ein High-Pegel am Eingang anliegt: PORTD = 0b01110000.
Simulation von Digitalschaltungen in Speicher programmierbaren Steuerung (SPS)
#include <avr/io.h>
unsigned char ein, aus; // glob. Var. fuer Ein- und Ausgabe
int main(){
DDRB=0xff; // PORTB auf Ausgang
PORTD=0x70; // Pullups fuer T2..T0 an
while(1){
ein=(~PIND&0x70)>>4; // Taster einlesen und zurechtschieben
simulation(); // Simulation ausfuehren
PORTB= 0xe0 | aus & 0xf; // nur L3..L0
}
}
void simulation(){
aus = ein;
}
Mit einem Computerprogramm kann das Verhalten digitaler Schaltungen simuliert werden, das Ein- Ausgabeverhalten wird nachgestellt.
In einem stetigen Zyklus wird der Zustand der Taster in eine globale Variable ein eingelesen, das Unterprogramm
simulation() aufgerufen und die globale Variable aus ausgegeben.
Um den Einstieg zu erleichtern, werden die negative Logik der Taster, gedrückt sind sie 0 und die Position in ein zurecht gerückt.
Hinweis zur Schreibweise in den Kommentaren: ein0 meint Bit0 von ein.
Info: In C ist 0 = false, alle anderen Werte werden als true interpretiert
Beispiele für Simulation
Schaltplan mit Java-Digitalsimulator
Datei: sps1.dig
L0 = T0 & T1
L1 = T0 # T1
L2 = T2
void simulation(){
if((ein&0b11)==0b11)
aus |= 1; // setze L0
else
aus &= ~1;// loesche L0
if((ein&0b11)>=1)
aus |= 2; // setze L1
else
aus &= ~2;// loesche L1
if(ein&0b100)
aus |= 4; // setze L2
else
aus &= ~4;// loesche L2
}
RS-FlipFlop
void simulation(){
if(ein&2){ // T1 = 1 ?
aus &=~1; // L0 <- 0
} else if(ein&1){// T0 = 1 ?
aus |=1; // L0 <- 1
}
}
Wegen der Rücksetzpriorität wird zuerst das R-Signal überprüft.
Taktflanken gesteuertes D-FF
void simulation(){
static unsigned char merker=0;
if(!merker && (ein&2)){//T1 st. Fl.
if(ein&1){ // aus0 <- ein0
aus |=1;
}
else {
aus &=~1;
}
}
merker = ein&2;
}
Im der lokalen Variablen merker wird der letzte Zustand von T1 gemerkt, um die steigende Flanke erkennen zu können. Die Variable ist als static definiert, damit der Inhalt nicht zwischen den Aufrufen von simulation() verlohren geht. Alternativ könnte auch eine globale Variable verwendet werden.
Aufgaben
Aufgabe
Lösung
void simulation(){
if((ein&0b111)==0b110){
aus |= 1; // L0 <- 1
}
else {
aus &= ~1; // L0 <- 0
}
}
Aufgabe
Lösung
void simulation(){
aus = 0;
if((ein&0b111)==0b001){ // DeMorgan
aus |= 1; // L0 <- 1
}
if((ein&0b110)==0b100 || (ein&0b110)==0b010){
aus |= 2; // L1 <- 1
}
}
Aufgabe
Lösung
void simulation(){
if((ein&0b11)==0b01){
aus |= 1;
} else {
aus &= ~1;
}
if(ein&0b100){ // Ruecksetzprioritaet
aus &= ~2;
}
else if(aus&1){// setzen?
aus |= 2;
}
}
Template
Bla
Blub