Anschlußblock


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


Sanduhr mit LEDs

Eiständer mit LED-Sanduhr

Mit dem nächsten Experiment statten wir einen Besuch der kulinarischen Welt ab und leisten einen kleinen Beitrag im Bereich des Sonntagfrühstücks. Wir konstruieren eine einfache LEDs-Sanduhr für ein gelungenes und leckeres 5-Minuten-Weichei.
Unser Zeitmesser besteht aus 31 Leuchtdioden, die durch ihre Anordnung an eine Sanduhr erinnern. 15 Leuchtdioden bilden die obere Schale (Kolben), 15 Leuchtdioden sind für die untere Schale zuständig. Die 31ste Leuchtdiode bildet den Sanduhrhals.
Die Aufgabe des Ein- und Ausschaltens der einzelnen Leuchtdioden wird von dem Mikrocontroller PIC16F887 übernommen. Mit 40 Pins stellt er genügend I/O-Anschlüsse für alle Leuchtdioden. So wird jeder Leuchtdiode ihr eigener Anschluss zugeordnet. An einen Pin wird zusätzlich ein aktiver Summer, der nach Ablauf der Zeit diese Tatsache mit einem akustischen Signal signalisieren wird, angeschlossen. Unsere Weichei-Sanduhr wird mit einem einfachen Ein-Aus-Schalter ein- bzw. ausgeschaltet. Das bedeutet, dass sie bei Nichtnutzung keinen Strom verbraucht.

PIC16F887

PIC16F887

Bei dem PIC16F887 handelt es sich um einen verhältnismäßig großen IC-Baustein, der bei einer Breite von ca. 15 mm eine Länge von über 5 cm erreicht. Er besitzt 40 Pins und arbeitet mit einer Versorgungsspannung von 2,3 bis 5 VDC. Die Pinbelegung:

Pinbelegung

Technische Daten:
Bauform: DIP-40
CPU Takt: 32 MHz
Speicher: 14 kByte
RAM: 1,024 kByte
EEPROM: 256 Byte
I/O-Pins: 36
8-bit Timer: 3
16-bit Timer: 4
PWM: 5/2
Internal Oscillator: 32 MHz, 31 kHz
Analog Komparatoren: 2
ADC: 35
Versorgungsspannung: +2,3 ... +5,5 VDC
Temperaturbereich: -40 ... +85 °C

Leuchtdioden

Leuchtdioden

In der Schaltung kommen blauen Leuchtdioden zum Einsatz. Jeder Leuchtdiode ist ein 560 Ohm Vorwiderstand vorgelötet.

Summer

Summer

Für den Krach nach Ablauf der Zeit sorgt ein aktiver Summer.

Schaltplan

Schaltplan



Programm

// *************************************************************************************************************
// Fünf-Minuten-Weichei-Sanduhr
// Sanduhr mit LEDs und PIC
// Mikrocontroller PIC16F887
// MPLAB X IDE v6.00
// *************************************************************************************************************
             

// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT // Oscillator Selection bits (INTOSCIO oscillator: I/O function on 
                                     // RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF            // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF           // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON            // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF              // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF             // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON            // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON             // Internal External Switchover bit (Internal/External Switchover 
                                     // mode is enabled)
#pragma config FCMEN = ON            // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = OFF             // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR 
                                     // must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V        // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF             // Flash Program Memory Self Write Enable bits (Write protection off)

#include <xc.h>
#include <stdbool.h>
#define _XTAL_FREQ 4000000           // Taktfrequenz
                                     // Port werden byteweise angesprochen
int LEDs_oben[14]  = {251, 249, 241, 240, 224, 160,  32,   0,
                      254, 250, 248, 240, 224, 192};   
int LEDs_unten[14] = {  4,   6,  14,  15,  31,  95, 223, 255,
                        1,   5,   7,  15,  47,  63};

int Sandzaehler;                     // Sandkörner Gesamtzähler
int Wartezeit = 205;                 // Wartezeit fallende Sandkörner in ms

// *************************************************************************************************************
void Drei_fallende_Sandkoerner () {
    
    for (int i=0; i<21; i++) {
        PORTE = 0;                   // Ausgänge Port E Aus
        if (Sandzaehler < 10) {
            PORTDbits.RD2 = false;   // Ausgang Pin 21 Aus
        }
        __delay_ms (Wartezeit);      // Wartezeit in ms
        PORTEbits.RE0 = true;        // Ausgang Pin 8 Ein
        __delay_ms (Wartezeit);
        PORTEbits.RE1 = true;        // Ausgang Pin 9 Ein
        __delay_ms (Wartezeit);
        PORTEbits.RE2 = true;        // Ausgang Pin 10 Ein
        __delay_ms (Wartezeit);
        if (Sandzaehler < 10) {
            PORTDbits.RD2 = true;    // Ausgang Pin 21 Ein
            __delay_ms (Wartezeit);
        }        
    }
}

// *************************************************************************************************************
void main(void) {                    // Hauptprogramm
   
    ANSEL = 0x00;
    ANSELH = 0x00;
     
    TRISA  = 0b00000000;             // Pins werden als Aüsgänge definiert
    TRISB  = 0b00000000;
    TRISC  = 0b00000000;
    TRISD  = 0b00000000;
    TRISE  = 0b00000000;
    Sandzaehler = 0;

    PORTA = 255;                     // Port A+B Ein
    PORTB = 255;
    PORTC = 0;                       // Port C+D Aus
    PORTD = 0;        
    
    Drei_fallende_Sandkoerner();
        Reihe_RA_RC:
        if ( Sandzaehler <  8 ) {                
            PORTA = LEDs_oben[Sandzaehler];   // Leds Ein/Aus Sanduhr oben
            PORTC = LEDs_unten[Sandzaehler];  // Leds Ein/Aus Sanduhr unten
            Sandzaehler++;
            Drei_fallende_Sandkoerner();
            goto Reihe_RA_RC;
        }    
        if ( Sandzaehler == 8 ) {  
            PORTB = LEDs_oben[Sandzaehler];  
            PORTD = LEDs_unten[Sandzaehler];
            Sandzaehler++;
            Drei_fallende_Sandkoerner();
        }  
        Reihe_RB_RD:
        if ( Sandzaehler < 14) {   
            PORTB = LEDs_oben[Sandzaehler];
            PORTD = LEDs_unten[Sandzaehler];
            Sandzaehler++;
            Drei_fallende_Sandkoerner();
            goto Reihe_RB_RD;
        }
        PORTEbits.RE0 = false;                // fallende Sandkörner Aus
        PORTEbits.RE1 = false;
        
        while (1) {
            for (int i=0; i<3; i++) {
                PORTDbits.RD6 = true;
                __delay_ms (70);
                PORTDbits.RD6 = false;
                __delay_ms (70);
            }
            __delay_ms (1000);            
        }    
}
// *************************************************************************************************************

Testschaltung

Testschaltung Anschlüsse



Testschaltung LEDs



Testschaltung Rückansicht



Die Aufgabe, die das Programm zu erledigen hat, ist denkbar einfach. Nach und nach werden Leuchtdioden in der oberen Schale der „Sanduhr“ abgeschaltet, während sie in der unteren Schale wieder eingeschaltet werden. Mehr Geheimnisse verbergen sich dem Programm nicht. Als Ergänzung kommen noch drei LEDs, die fallenden Sandkörner imitieren und Ansteuerung eines Krachmachers, nachdem die voreingestellte Zeit abgelaufen ist. Damit die Leuchtdioden nicht einzeln angesteuert werden müssen, werden sie byteweise geschaltet. Die Byte-Werte sind in den Variablen LEDs_oben[] und LEDs_unten[] festgeschrieben.
Wenn wir z.B. die erste Leuchtdiode, die an Pin 4 (RA2) angeschlossen ist, in der oberen Schale abschalten wollen, beträgt der Wert für das gesamte Register A 251 (111 11011 = 251). Hier werden also alle RA-Leuchtdioden unberührt eingeschaltet bleiben (Werte 1), während die RA2-LED ausgeht (Wert 0). Gleichzeitig wird „diese“ Leuchtdiode in der unteren Schale auftauchen. Sie ist dann an den Pin 17 (RC2) angeschlossen. Der Wert für den gesamten Register C beträgt in diesem Fall 4 (000 00100 = 4). Entsprechend bleiben alle RC-Leuchtdioden aus, während die RC2-LED angeht.
Die Gesamtzeit der Sanduhr kann mit der Variable „Wartezeit“ und Anzahl der Wiederholungen in der FOR-Schleife (int i=0; i<21; i++) in dem Unterprogramm „Drei_fallende_Sandkoerner“ eingestellt werden. Bei einer Einstellung der Wartezeit auf 205 ms und des Laufzählers der FOR-Schleife auf 21 erreicht man die Gesamtzeit von ca. 5 min.


Kurzvideo

Kurzvideo


Weitere Themen:


Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz