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 ;)
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
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
Welchen Grund hast Du, einen AT89C51CC03 für nur 4 Signale zu benutzen? Ein ATtiny13 sollte ja dicke reichen. Peter
Hallo! Welchen Grund wird er für diesen µC haben? Der Lehrer gibt das so vor!
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ß
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; } }
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.
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.
> 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.
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
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
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.
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 =(
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.