Mit der folgenden Schaltung liefern wir einen universellen Impulszähler, der dank gezielter Parametrierung mit Dip-Schaltern auf unterschiedliche
Weise verwendbar ist. Der Zähler kann so eine positive Flanke des Eingangssignals erkennen als auch eine negative. Die Richtungszählung kann auf positiv oder negativ
eingestellt werden. Beim Erreichen des Sollwertes kann der Zähler den Ablauf anhalten oder einen Impuls ausgeben, Reset durchführen und erneut die Zählung starten.
Die Impulslänge ist ebenfalls mit Dip-Schaltern konfigurierbar. Mit einer Reset-Taste kann der Ablauf unterbrochen und neu eingeleitet werden. Mit einer weiteren
Taste kann der eingestellte Sollwert eingesehen werden. Bei negativer Zählung kann der Zähler als ein Countdown-Zähler verwendet werden. Folgende Funktionen stehen
zur Verfügung:
Erkennung der positiven Flanke des Eingangssignals
Dip 1.1 – OFF / Dip 1.9 – ON / Dip 1.10 – OFF
Erkennung der negativen Flanke des Eingangssignals
Dip 1.1 – ON / DIP 1.9 – OFF / Dip 1.10 – ON
Positive Zählrichtung
Dip 1.2 – OFF
Negative Zählrichtung
Dip 1.2 – ON
Impulsausgabe beim Sollwert, Reset und automatischer Neustart
Dip 1.3 – OFF
Stop beim Sollwert, Ausgang dauerhaft setzen
Dip 1.3 – ON
Einstellung der Signallänge am Ausgang
Dip 1.4 bis Dip 1.7
Einstellung binär in 250 ms Schritten. Maximale Länge 15 * 250 ms = 3,7 Sek.
Im Programm änderbar.
Sollwert-Einstellung
Dip 2.1 bis 2.5
Einstellung binär. Maximale Einstellung in dem Beispiel beträgt 31.
ATtiny 2313A
Der Mikrocontroller ATtiny 2313A ist ein 20-beiniger 8-Bit-Mikrocontroller, der folglich 18 I/Os zur Verfügung stellt. Der Baustein arbeitet
zwischen 1,8-5,5 Volt. Die Größe des Programmspeichers (Flash) beträgt 2kB (RAM: 0,128 kB, EEPROM 128 Byte). Er verfügt jeweils über einen 8-Bit und 16-Bit
Timer, vier PWM-Kanäle und einen analogen Komparator. Bauform ist PDIP-20. Betriebs-Temperaturbereich erstreckt sich
von -40 bis 85 °C.
Pin-Out
I/O – Adressierung im Programm: Pin 02 – PCINT 11 – Programm Adresse = 00
Pin 03 – PCINT 12 – Programm Adresse = 01
Pin 04 – PCINT 09 – Programm Adresse = 02
Pin 05 – PCINT 08 – Programm Adresse = 03
Pin 06 – PCINT 13 – Programm Adresse = 04
Pin 07 – PCINT 14 – Programm Adresse = 05
Pin 08 – PCINT 15 – Programm Adresse = 06
Pin 09 – PCINT 16 – Programm Adresse = 07
Pin 11 – PCINT 17 – Programm Adresse = 08
Pin 12 – PCINT 00 – Programm Adresse = 09
Pin 13 – PCINT 01 – Programm Adresse = 10
Pin 14 – PCINT 02 – Programm Adresse = 11
Pin 15 – PCINT 03 – Programm Adresse = 12
Pin 16 – PCINT 04 – Programm Adresse = 13
Pin 17 – PCINT 05 – Programm Adresse = 14
Pin 18 – PCINT 06 – Programm Adresse = 15
Pin 19 – PCINT 07 – Programm Adresse = 16
Programm (Sketch)
// **************************************************************************************
// Multifunktionszähler mit DIP-Schaltern
// Eine Schaltung mit DIP-Schaltern und ATtiny2313A
// Arduino IDE 2.3.5
// **************************************************************************************
#include<TM1637Display.h> // Bibliothek 7-Segmentanzeige mit TM1637
#define CLK 15 // Display Pins CLK/DIO
#define DIO 16
TM1637Display display(CLK, DIO); // Display initialisieren
int DIP [12];
// DIP[0]-DIP 1.1 (Pin02-00) – Signal: OFF=positive Flanke/ON=negative Flanke
// DIP[1]-DIP 1.2 (Pin03-01) – Signal: OFF–Zählrichtung positiv / ON–negativ
// DIP[2]-DIP 1.3 (Pin04-02) – Ausgang: ON – Auto Stop / OFF – Auto Reset
// DIP[3]-DIP 1.4 (Pin05-03) - Signallänge Wertigkeit 1
// DIP[4]-DIP 1.5 (Pin06-04) - Signallänge Wertigkeit 2
// DIP[5]-DIP 1.6 (Pin07-05) - Signallänge Wertigkeit 4
// DIP[6]-DIP 1.7 (Pin08-06) - Signallänge Wertigkeit 8
// DIP 1.8 - Reserve
// DIP 1.9 - Signal: OFF=neg. Flanke/ON=pos. Flanke
// DIP 1.10 - Signal: OFF=pos. Flanke/ON=neg. Flanke
// DIP[7]-DIP 2.1 (Pin11-08) - Sollwert Wertigkeit 1
// DIP[8]-DIP 2.2 (Pin12-09) - Sollwert Wertigkeit 2
// DIP[9]-DIP 2.3 (Pin13-10) - Sollwert Wertigkeit 4
// DIP[10]-DIP 2.4 (Pin14-11) - Sollwert Wertigkeit 8
// DIP[11]-DIP 2.5 (Pin15-12) - Sollwert Wertigkeit 16
int Taste_Soll = 7; // Taste für Anzeige des Sollwertes
int Ausgang = 13; // Zähler Ausgang
int Signal = 14; // Untersuchtes externes Signal
int Anzeige; // Inhalt für 7-Segmentanzeige
int Startwert, Sollwert, Istwert; // Aktuelle Zählwerte
bool Freigabe; // Freigabe Signalempfang
bool Aktualisierung; // Istwert wird aktualisiert
bool Programm_anhalten; // Zählvorgang stoppen
int Soll [] = {1 ,2, 4, 8, 16}; // Binärwerte
int Ausgang_Impulslaenge; // Eingestellte Signallänge in ms
// **************************************************************************************
void setup() {
display.setBrightness(10); // Display Helligkeit
display.clear(); // Display löschen
for (int i=0; i<7; i++) { // I/O Konfiguration
DIP [i] = i;
pinMode(DIP[i], INPUT_PULLUP);
}
for (int i=7; i<12; i++) {
DIP [i] = i+1;
pinMode(DIP[i], INPUT_PULLUP);
}
pinMode(Taste_Soll, INPUT_PULLUP);
pinMode(Ausgang, OUTPUT);
pinMode(Signal, INPUT);
// Einstellungen auswerten ..........................................................
for (int i=7; i<12; i++) {
if (digitalRead(DIP[i]) == LOW) {
Sollwert = Sollwert + Soll [i-7]; // Sollwert Vorgabe
}
if (i<10) { // Ausgang Signallänge
if (digitalRead(DIP[i-4]) == LOW) {
Ausgang_Impulslaenge = Ausgang_Impulslaenge + Soll [i-7] * 250;
}
}
}
// Startwert abhängig von Zählrichtung ..............................................
if (digitalRead(DIP[1]) == LOW) { // Festlegung des Startwertes
Startwert = Sollwert;
Sollwert = 0;
}
Istwert = Startwert; // Startwert für Istwert
}
// **************************************************************************************
void loop() {
// Sollwert Anzeige .................................................................
if (digitalRead(Taste_Soll) == LOW) { // zwischendurch Anzeige
Display_Anzeige (Sollwert);
delay (1000);
}
// Signal positve Flanke ..........................................................
if (digitalRead(DIP[0]) == HIGH) { // Erkennung positive Flanke
if (digitalRead(Signal) == HIGH && Freigabe) {
Freigabe = false; // Signal erkannt
Aktualisiereung = true; // Istwert aktualisieren
delay(100); // Prellen abwarten
}
if (digitalRead(Signal) == LOW) {
Freigabe = true;
}
}
// Signal negative Flanke ...........................................................
if (digitalRead(DIP[0]) == LOW) { // Erkennung negative Flanke
if (digitalRead(Signal) == LOW && Freigabe) {
Freigabe = false; // Signal erkannt
Aktualisiereung = true;
delay(100);
}
if (digitalRead(Signal) == HIGH) {
Freigabe = true;
}
}
// Istwert aktualisieren ............................................................
if (Aktualisiereung) { // Istwert Aktualisierung
if (digitalRead(DIP[1]) == HIGH) { // abhängig von Zählrichtung
Istwert++;
} else {
Istwert--;
}
Aktualisiereung = false; // Aktualisierung abgeschlossen
}
Display_Anzeige (Istwert); // Display aktualisieren
// Auswertung der Grenzwerte ........................................................
if (Istwert == Sollwert) {
digitalWrite(Ausgang, HIGH); // Ausgang setzen
if (digitalRead(DIP[2]) == LOW) { // Modus mit Auto Stop
Programm_anhalten = true;
}
if (digitalRead(DIP[2]) == HIGH) { // Modus mit Auto Reset
delay (Ausgang_Impulslaenge);
Istwert = Startwert;
digitalWrite(Ausgang, LOW); // Ausgang abschalten
}
}
while (Programm_anhalten) { }
}
// **************************************************************************************
void Display_Anzeige (int Anzeige) {
display.showNumberDecEx((int)Anzeige, 0b00000000, false, 4, 4);
}
// **************************************************************************************