motor_typenschild_sew_drn71M6


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


Impulszähler
mit PIC, BCD-Decoder und 7-Segmentanzeige


BCD Decoder


Neben dem PIC16F1503, der in dieser Schaltung die Regie übernimmt, besteht die Schaltung aus vier 7-Segmentanzeigen, die mit vier BCD-Decodern 74HC4511 zum Leuchten gebracht werden. Die Decoder stellen jeweils sieben Ausgänge zur Verfügung, die mit den entsprechenden Anschlüssen der 7-Segmentanzeigen verbunden werden müssen. Die Verbindungen erfolgen nicht willkürlich. Jeder Ausgang des Decoders ist für ein bestimmtes Element der 7-Segmentanzeige zuständig.
Die Decoder werden durch vier Leitungen mit einer Signalquelle, hier der PIC Mikrocontroller, verbunden. Über diese vier Leitungen empfangen sie BCD-codiert die Werte der Ziffern, die angezeigt werden sollen. Sie decodieren intern die duale Vorgabe und wandeln sie in sieben Signale, die die 7-Segmentanzeigen steuern.
Mit drei weiteren Verbindungen werden die Decoder gesteuert. Man kann mit diesen Steuersignalen bestimmen, zu welchem Zeitpunkt die BCD-Daten von den Decodern berücksichtigt werden sollen und wann die Umwandlung für die Ausgänge stattfinden soll. Diese Steuersignale machen es möglich, mehrere Decoder zusammen zu schalten und gleichzeitig die Menge der Verbindungen zu reduzieren. Die Steuersignale sind:
LT – Lampentest
BL – Anzeige EIN / AUS
LE – Datenübernahme
In der Schaltung werden vier 7-Segmentanzeigen mit Decodern verschaltet. Die vier Datenleitungen werden gleichzeitig mit allen Decodern verbunden. Mit den Steuersignalen LE wird dann entschieden, welcher Decoder zu welchem Zeitpunkt auf diese Daten reagieren soll.
Die Aufgabe der Schaltung halten wir einfach. Der Mikrocontroller empfängt über einen Eingang externe Impulse. Sie werden gezählt und mithilfe der 7-Segmentanzeigen angezeigt. Beim Erreichen eines bestimmten Zählerstandes wird ein Ausgang gesetzt. Hier ist eine Leuchtdiode angeschlossen. Das ist schon alles.
Für die Impulse ist ein einfacher Taster, der manuell betätigt werden muss, zuständig. Ein weiterer Schalter dient nur Präsentationszwecken. Mit ihm ist es möglich, einen schnellen Durchlauf des Zählers zu erreichen.

PIC16F1503

PIC16F1503

PIC16F1503

PIC16F1503 ist ein 8-Bit Mikrocontroller mit einer Taktfrequenz von 20 MHz. Er verfügt über 14 Anschlüsse und stellt 12 I/Os zur Verfügung. Sein 128 Bytes Flash-Speicher kann mindestens 100.000 beschrieben werden.

PIC16F1503 Pinbelegung

PIC16F1503 Pinbelegung

Kurze Zusammenfassung:
- Versorgungsspannung 2,3 – 5,5 VDC
- 8-Bit Mikrocontroller
- 3,5 kByte Programmspeicher
- 49 Anweisungen
- RAM 128 Byte
- Flash 100.000 Schreiboperationen
- 20 MHz CPU-Taktfrequenz
- 12 I/O Pins (1 Nur_Eingang-Pin)
- 2 8-Bit Timer
- 1 16-Bit Timer
- 4 PWM-Ausgänge
- 2 analoge Komparatoren
- Temperaturbereich -40 … +85°C
- Watchdog-Timer (WDT),
- Programmierbarer Codeschutz
- Stromsparender Schlafmodus
- Analog-Digital-Wandler (ADC) mit 10-Bit-Auflösung
- 10-Bit-PWM-Module
- u.v.m.

PIC16F1503 Mikrocontroller Datenblatt:
https://components101.com/sites/default/files/component_datasheet/PIC16F1503-Datasheet.pdf


BCD-Decoder 74HC4511

BCD-Decoder 74HC4511

Die integrierte Schaltung 74HC451 wurde speziell zum Ansteuern von 7-Segmentanzeigen entwickelt. Mit sieben Ausgängen werden alle sieben Elemente der Anzeige einzeln ein- bzw. ausgeschaltet. Mit dem Steuersignal BL kann die Anzeige ein- bzw. ausgeschaltet werden. Das Signal LE bestimmt, ob die Daten an die Ausgänge weitergeleitet werden. Mit dem dritten Steuersignal LT kann ein Lampentest durchgeführt werden.

BCD-Decoder 74HC4511

7-Segmentanzeige

7-Segmentanzeige

Der aktuelle Zählerstand wird mithilfe vier 7-Segmentanzeigen sichtbar. Alle Anzeigen werden von den BCD-Treibern 74HC4511 angesteuert. 7-Segmentanzeigen stellen eine einfache, verlässliche und kostengünstige Alternative zur Darstellung von Ziffern (und anderen Zeichen).

7-Segmentanzeige


Der Schaltplan

Der Schaltplan

Der Schaltplan


Die Testschaltung

Testschaltung

Testschaltung

Anmerkungen

- Die Schaltkompositionen für Zehner- und Hunderter-Anzeige sind aus Platzgründen auf dem Plan nicht gezeichnet. Sie müssen natürlich in die Schaltung eingepflegt werden. Die Verdrahtung aller Segmente ist identisch. Lediglich die Leitung LE wird vom Mikrocontroller zu jedem BCD-Decoder separat geführt.
- Die Leuchtdiode D1 wird nur für Demonstrationszwecke verwendet. Mit dem Ausgang könnte sonst, nachdem der gewünschte Zählerstand erreicht wurde, ein Prozess angehalten werden.
- Der Taster S1 dient als Impulsquelle. Hier könnte auch jeder beliebige Impulsgeber eingesetzt werden.
- Ähnlich wie die LED D1 dient auch der Schalter S2 nur Präsentation. Wenn man ihn entfernt, stehen für weitere Programmerweiterungen noch zwei freie I/Os zur Verfügung.

Das Programm

// ***************************************************************************
// Impulszähler mit PIC16F1503, BCD-Decoder 75HC4511 und 7-Segmentanzeige
// MPLAB X IDE v6.00
// XC8-Compiler 2.4
// ***************************************************************************
             

// PIC16F1503 Configuration Bit Settings 
// CONFIG1 
#pragma config FOSC = INTOSC    // Oscillator Selection Bits (INTOSC oscillator:  
                                // I/O function on CLKIN pin) 
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled) 
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled) 
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function  
                                // is digital input) 
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program  
                                // memory code protection is disabled) 
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled) 
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled.  
                                // I/O or oscillator function on the CLKOUT pin) 

// CONFIG2 
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off) 
#pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable (Stack Overflow or  
                                // Underflow will not cause a Reset) 
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset  
                                // Voltage (Vbor), low trip point selected.) 
#pragma config LPBOR = OFF      // Low-Power Brown Out Reset (Low-Power BOR is disabled) 
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on  
                                // MCLR/VPP must be used for programming) 

#include <xc.h>
#include <stdbool.h>

#define _XTAL_FREQ 1000000
#define BCD_Bit0 PORTAbits.RA5        // Bit 0 der BCD-Zahl, Pin 2 
#define BCD_Bit1 PORTCbits.RC4        // Bit 1 der BCD-Zahl, Pin 6 
#define BCD_Bit2 PORTCbits.RC5        // Bit 2 der BCD-Zahl, Pin 5 
#define BCD_Bit3 PORTAbits.RA4        // Bit 3 der BCD-Zahl, Pin 3 
#define Anzeige_0001 PORTCbits.RC0    // Anzeige x1 Daten übernehmen 
#define Anzeige_0010 PORTAbits.RA2    // Anzeige x10 Daten übernehmen 
#define Anzeige_0100 PORTAbits.RA1    // Anzeige x100 Daten übernehmen 
#define Anzeige_1000 PORTAbits.RA0    // Anzeige x1000 Daten übernehmen 
#define Impuls_Eingang PORTAbits.RA3  // Impulseingang 
#define Stop_Signal PORTCbits.RC1     // Stop - Zielstand erreicht 
#define TEST_Schalter PORTCbits.RC2   // Testschalter Dauerdurchlauf 

char Ziffer = 0;
char Einer, Zehner, Hunderter, Tausender;
int Zaehlerstand;
bool Flanke;

void Ziffer_ausgeben () {
    
    Anzeige_0001 = 1;             // Digit Einer / Daten Übernahme deaktiviert 
    Anzeige_0010 = 1;             // Digit Zehner/ Daten Übernahme deaktiviert 
    Anzeige_0100 = 1;             // Digit Hunderter / Daten Übernahme deaktiviert 
    Anzeige_1000 = 1;             // Digit Tausender / Daten Übernahme deaktiviert 
    
    BCD_Bit0 = 0;                 // BCD Datenleitung nullen 
    BCD_Bit1 = 0;                 // BCD Datenleitung nullen 
    BCD_Bit2 = 0;                 // BCD Datenleitung nullen 
    BCD_Bit3 = 0;                 // BCD Datenleitung nullen 
    
    switch (Ziffer) {             // 0 = 0000 
        case 1: BCD_Bit0 = 1;     // 1 = 0001 
                break;   
        case 2: BCD_Bit1 = 1;     // 2 = 0010 
                break;
        case 3: BCD_Bit0 = 1;     // 3 = 0011 
                BCD_Bit1 = 1;
                break;
        case 4: BCD_Bit2 = 1;     // 4 = 0100 
                break;
        case 5: BCD_Bit0 = 1;     // 5 = 0101 
                BCD_Bit2 = 1;
                break;
        case 6: BCD_Bit1 = 1;     // 6 = 0110 
                BCD_Bit2 = 1;
                break;
        case 7: BCD_Bit0 = 1;     // 7 = 0111 
                BCD_Bit1 = 1;
                BCD_Bit2 = 1;
                break;
        case 8: BCD_Bit3 = 1;     // 8 = 1000 
                break;
        case 9: BCD_Bit0 = 1;     // 9 = 1001 
                BCD_Bit3 = 1;
                break;                    
    }
}

void main(void) {
    
    ANSELA = 0b00000000;                 // Pins als digitale I/Os 
    ANSELC = 0b00000000;                 // Pins als digitale I/Os 
    TRISA = 0b00001000;                  // I/O PORT A, 1-Eingang, 0-Ausgang 
    TRISC = 0b00000100;                  // I/O PORT C, 1-Eingang, 0-Ausgang 
    PORTA = 0b00000000;                  // Ausgänge nullen 
    PORTC = 0b00000100;                  // Ausgänge nullen     

    while (true) {
        if (TEST_Schalter == false) {    // Testbetrieb 
            Flanke = false;
        }
        if ((Impuls_Eingang == false) && (Flanke == false)) {
            Einer++;                     // Flanke erkannt: Gesamtzähler um 1 
            Zaehlerstand++;              // erhöhen und anzeigen 
            Flanke = true;
            if (Einer > 9) {
                Einer = 0;
                Zehner++;
            }
            Ziffer = Einer;
            Ziffer_ausgeben ();          // BCD auf Bus legen 
            Anzeige_0001 = 0;            // Digit 1 übernimmt die Daten 
            
            if (Zehner > 9) {
                Zehner = 0;
                Hunderter++;
            }   
            Ziffer = Zehner;
            Ziffer_ausgeben ();
            Anzeige_0010 = 0;  
            
            if (Hunderter > 9) {
                Hunderter = 0;
                Tausender++;
            }  
            Ziffer = Hunderter;
            Ziffer_ausgeben ();
            Anzeige_0100 = 0;
            
            if (Tausender > 9) {
                Einer = 0;
                Zehner = 0;
                Hunderter = 0;
                Tausender = 0;
            }      
            Ziffer = Tausender;
            Ziffer_ausgeben ();
            Anzeige_1000 = 0;                        
        }
 
        if (Impuls_Eingang == true) {    // Erst wenn Taster losgelassen  
            Flanke = false;              // geht es weoter 
        }
        while (Zaehlerstand == 9500) {   // Gewünschter Zählerstand erreicht? 
            Stop_Signal = true;          // Signal ausgeben und Zähler stoppen 
        }
    }
}
// ***************************************************************************         


Kurzvideo zur Schaltung

Kurzvideo


Weitere Themen:


Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz