![]()
| Sanduhr mit LEDs![]() 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.
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: ![]() Technische Daten:
Leuchtdioden![]() In der Schaltung kommen blauen Leuchtdioden zum Einsatz. Jeder Leuchtdiode ist ein 560 Ohm Vorwiderstand vorgelötet. Summer![]() Für den Krach nach Ablauf der Zeit sorgt ein aktiver Summer. 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![]() ![]() ![]() 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.
|
Google-Suche auf MEINE-SCHALTUNG.de : |