Forum: Mikrocontroller und Digitale Elektronik AT89C51CC03 Alarmanlage


von Olli N. (oliver_n)


Angehängte Dateien:

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 ;)

von Peter D. (peda)


Lesenswert?

Wir lieben Screenshots.
Nein, tun wir nicht !!!

Quelltexte am liebsten als Anhang mit richtiger Endung (*.c).

Einen Header kopiert man nicht in den Quelltext, man includiert ihn 
(#include <xxx.h>).


Peter

von Peter D. (peda)


Lesenswert?

Olli N. schrieb:
> Leider bin ich kein großer C-Programmierer

Mußt Du auch nicht.
Aber Du mußt die Grundlagen beherrschen.
Schreiben wird Dir keiner das Programm.

Und vergiß Screenshots!
Die kann man weder compilieren noch zitieren.


Peter

von Peter D. (peda)


Lesenswert?

Welchen Grund hast Du, einen AT89C51CC03 für nur 4 Signale zu benutzen?
Ein ATtiny13 sollte ja dicke reichen.


Peter

von Route_66 H. (route_66)


Lesenswert?

Hallo!
Welchen Grund wird er für diesen µC haben? Der Lehrer gibt das so vor!

von Olli N. (oliver_n)


Angehängte Dateien:

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ß

von Olli N. (oliver_n)


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;
}
}

von Bernhard S. (b_spitzer)


Lesenswert?

Verknüpfungen von Bit-Ergebnissen werden in C mit || oder && erledigt.
Außerdem dürfte einer der Taster bei dem Board prellen. Also lies mal 
was über geeignete Entprellmethoden nach.

von Olli N. (oliver_n)


Angehängte Dateien:

Lesenswert?

habe jetzt wieder das nächste Problem...

irgendwie bekomme ich den Summer nicht zum summen. Bei einem kleinen 
Testprogramm hat dieser aber normal gesummt.
Die Adresse vom summer ist 0xB4.
Wenn ich aber nun den Summer parallel zur LED summen lassen will. Klappt 
das nicht.

von Klaus K. (keili)


Lesenswert?

Hi,
kann es sein, dass da Klammern fehlen?

Gruß Klaus

von Bernhard S. (b_spitzer)


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.

von Olli N. (oliver_n)


Angehängte Dateien:

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

von Olli N. (oliver_n)


Lesenswert?

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

Schalter und LED`s sind in reihne geschaltet. Haben die Pins P1.0 - P1.7

von Bernhard S. (b_spitzer)


Lesenswert?

Bei deinem Programm von 14:59Uhr fehlt eine Klammer nach while(1). Damit 
wird nur die erste if-else-Abfrage ausgeführt. Die 2. Abfrage steht nach 
der Endlosschleife einsam da.

von Olli N. (oliver_n)


Angehängte Dateien:

Lesenswert?

So, habe jetzt eigentlich das Programm zu 100% fertig gehabt. es hat 
auch alles in der TFH funktioniert. Doch nun zuhause, mit meinem Board 
geht es komischerweise nicht mehr so ganz.

Sehe aber auch keinen Fehler, vielleicht sieht hier ja jemand was =(

von Bernhard S. (b_spitzer)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.