MezData-Logo

Digitalschaltungssimulation mit Zylonenauge

 

Zylonenauge Übersicht

Schema
Schema der Platine
Matrixanordnung
Matrixanordnung der LED

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;
}
SPS

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

Schaltung

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

SR 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

D-FlipFlop

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

Aufgabe
Lösung
void simulation(){
  if((ein&0b111)==0b110){
    aus |= 1; // L0 <- 1
  }
  else {
    aus &= ~1; // L0 <- 0
  }
}

Aufgabe

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

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