AT89C51CC03 Alarmanlage

OP #2876265
Lesenswert?

Hallo,

ich habe mir zur Aufgabe gemacht eine kleine Alarmanlage zu 
Programmieren.
Als Microcontroller habe ich mir den AT89C51CC03 ausgesucht.

Leider bin ich kein großer C-Programmierer, habe lediglich mal innerhalb 
eine Vorlesung simple Programmierungen gemacht.

Aufgabe:
Die Alarmanlage brauch 2 Eingänge. Einmal den Meldekontakt 
(Alarmauslösung) und einmal einen Aktivierungskontakt.
Als Ausgang müssen nur 2 Ausgänge definiert werden. 2 x Summer bzw. LED

Im Anhang habe ich jetzt erstmal den allerersten schritt eingefügt. Ist 
dieser schon so richtig oder habe ich da irgendwas nicht beachtet?

Erscheinen nämlich schon jetzt fehler ;)
Angehängte Dateien:
OP #2935436
Lesenswert?

Abend,

zu erstmal. Ich benutze den mikrocontroller, weil meine TFH damit sehr 
oft arbeitet. Zum anderen vertreibt mein Prof. auch die passenden 
Programmierboards (TFH-Board-One).

Zum Programm:
Habe jetzt mal einen kleines Programm geschrieben. Ich habe dort aber 
ein kleines Problem am Ende. Undzwar will ich dort mit dem Taster S3 
einmal eine Lampe Einschalten und bei einem nächsten Tastendruck wieder 
ausschalten.
Dies funktioniert auch zu 80%, aber teilweise reagiert die LED nur 
sporadisch. Schaltet also nicht sauber die zustände.
Hat da vllt. jemand einen Tipp?

Gruß
Angehängte Dateien:
OP #2935437
Lesenswert?

void main (void)
    // Start des Hauptprogramms
{
// LED Fehler einschalten wenn S1 oder S2 gedrückt sind
// LED Grün = Alles OK
if ((S1==0) | (S2==0))
{
    LED6 = AN;
    LED7 = AUS;
}
else
{
    LED7 = AN;
    LED6 = AUS;
}
// Alarmanlage aktivieren

if((S3==0) & (S2==1) &  (S1==1))        //S1 & S2 = Fenster-/Türkontakte
{                                       //S3 = Einschaltsensor
    if(LED5==AUS)
        LED5 = AN;                      // DIESER PROGRAMMABSCHNITT 
FUNKTIONIERT NICHT WIE GEWOLLT; ZU 80% WIRD RICHTIG GESCHALTET, 
TEILWEISE ABER ERST MACH 2-3 BETÄTIGUNGEN VON S3

    else
        LED5 = AUS;
}
}
#2936630
Lesenswert?

> Die Adresse vom summer ist 0xB4.
Also P3.4. Und die Schalter und LEDs sind bunt gemischt an P1...

Etwas seltsam ist diese Syntax aber schon:
unsigned char bit Summer @ 0xB4;  // Char oder Bit...
Aber weiter oben ist es ja ähnlich:
extern near unsigned char P3;   // bidirectional
extern bit unsigned char P3_B4;

> Wenn ich aber nun den Summer parallel zur LED summen lassen will. Klappt
> das nicht.
Wie ist der Beschaltet? Nach dem Programm hängt der Summer an Vcc und 
wird vom Controller gegen geschaltet. Dabei solltest Du auf den 
maximalen Strom achten. So ein einzelner Summer kann für einen 
Controllerport schon zu viel sein. Da sollte noch ein Transistor 
dazwischen.
OP #2936862
Lesenswert?

Erstmal zur Info, dieses Board benutze ich zum Austesten meines 
Programmes.

http://www.palmtec.de/PalmTec/8051er_-_World/P_A__L/TFH-Board_ONE_-_Sys-Doku_-_V2-3.pdf

Mein Prof. hat dieses Entwickelt und ist Inh. der Firma.

Also Zusatzplatine wurde folgendes dran gesteckt:
Digitale I/O-Test-Karte ONE
DIO-Test ONE

Das der Summer gegen Null geschaltet wird ist richtig. Ich habe mal als 
anhang ein kleines Testprogramm dran gehangen. Dort klappt es wunderbar, 
es geht eine LED an und wenn diese aus geht summt der summer.

Daher ist es für mich jetzt unerklärlich, das es in meinem Alarm prog. 
nicht klappt.

Es wird wahrscheinlich ein kleiner Fehler sein, komme aber nicht 
dahinter. Wobei ich aber auch nicht die riesen Kenntnisse habe, studiere 
Energietechnik. Also hab eher was mit großen E.-Maschinen und dicken 
Leitungen zu tun
Angehängte Dateien:
#2938393
Lesenswert?

Ohne jetzt irgendwie auf Sinn oder Unsinn des Programms einzugehen...

Das was in Deinem Programm passiert hat noch etwas 
"Optimierungspotential"
1
if ((S3==0) && (S2==1) && (S1==1))
2
{
3
   // Flankenauswertung + Entprellung
4
   _wait_ms(20);
5
   while(S3==0);
6
   _wait_ms(20);
7
   if (LED5==AUS)
8
   {
9
       summer=AN;
10
       _wait_ms(50);
11
       summer=AUS;
12
       _wait_ms(50);
13
       summer=AN;
14
       _wait_ms(50);
15
       summer=AUS;         
16
       LED5 = AN;
17
   }
18
   else
19
       LED5 = AUS;         // ohne Klammern macht der else-Zweig nur DAS
20
   summer=AN;
21
   _wait_ms(100);
22
   summer=AUS;      
23
}
Ob mit den gezeigten Programmierkenntnissen eine (hier nicht sichtbare) 
Funktion _wait_ms(Zeit) auch die angegebene Zeit abwartet, darf 
ernsthaft bezweifelt werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren