Hey Leute, in der Schule haben wir vor ein paar Wochen mit der µC Programierung angefangen. Wir haben mehrere Übungen bekommen die bisher immer ein leichtes für mich waren. Jetzt hänge ich aber an 1 Stelle fest. (Vorab es ist 1 Woche vor den Ferien es sind weder Hausaufgaben noch irgentwelche Projekte mich interesiert das einfach deshlab könnt ihr euch den Beitrag "Umgang mit faulen Schüler sparen!) Ich brauche garkeine fertige Lösung sonder villeicht reicht ein gedanken anstoß. Es geht darum eine Arlarmanlage zu Programieren. Port 1.0 Arlarmanlage sarfstellen Port 1.1 Arlarmanlage nach auslösen resetten Port 1.7 Auslöser der arlarmanlage Port 4 Ausgang an LEDS. Wenn die Arlarmanlage auslöse sollen alle 8 Bit am Port 4 anfangen zu Blinken. Das habe ich aucgh bereits fertig. Die LEDs sollen aber 10 Sekunden Blinken dan 2 Sekunden Pause und das so lange bis der Resettaster gedrückt wird. Mit Timern kenne ich mich inzwischen auch aus. Die Zeiten für 10 und 2 Sekunden bekomme ich hin. Das einzige wo ich momentan hänge ist: Wie ich jetzt die 2 Funktionen zusammen füge damit die erstmal 10 Sekunden Blinken und dan 2 Sekundne Pause ist. Ich habe mir etwas überlegt bin aber nicht ganz sicher mit der Realisierung. Wäre es möglich die Funktion in eine While-Schleife zu schreiben und die bidingung der While-Schleife irgentwie einen Returnwert aus der Timerfunktion ist. (Ja ich drücke mich unabsichtlich aber gernne kompliziert aus =)nicht böse nehmen). Wenn ja wie? Ich habe zwar schonmal was mit den Returns versucht hat aber nur mäßig geklappt. Lieg villeicht daran das ich den gesamten Aufbau einer Funktion noch nicht richtig verstanden habe?! Hoffe ihr könnt mir helfen. mfg.eRay
1. Timerroutine in Sekundentakt eine Variable hochzählen wenn die Variable größer 10 dann Variable =0 In Main if (Taktvariable>=7 && Alarm ausgelöst) Port an else Port aus;
Die einfachste variante wäre es den Timer auf eine gemeinsame Zeitbasis zu bringen und im Timerinterupt eine variable hochzuzählen. - Du stellst den Timer auf 2 Sekunden ein (kleinste gemeinsame basis) - Du lässt vom Controller einen Timer Interrupt ausführen - Im Interrupt legst du dir eine static Variable ab die dir später Signalisiert in welchem Status du dich befindest (also ob 10sek Blinken oder 2sek blinken). Diese Variable Initialisierst du erstmal am Anfang mit 0 (das wird bei static nur einmal gemacht, und nicht jedes mal wenn in den Interrupt gesprungen wird). - Nun frägst du ab ob sich das Flag auf 0 oder 1 befindet (0 für 10Sekunden und 1 für 2 Sekunden) - Nun gibt es zwei Fälle: - Flag = 0: Intern einen counter hochzählen und den LED PORt toggeln. Am Ende abfragen ob sich der Counter 4 entspricht (wenn man bei 0 anfängt zu zählen). Wenn ja, Flag auf 1 setzen und counter auf 0. Wenn nein nichts machen. - Flag = 1: nichts tuen und Flag wieder auf 0 setzen. So befindest du dich 10Sekunden lang im Status blinken und 2 sekunen im Status nicht blinken. Natürlich hast du nun ein sehr langsames blinken. Um das zu verändern verringerst du die gemeinsame Zeitbasis z.B. auf 200ms. Nun musst du antürlich die Zählvariablen für Fall 0 und 1 verändern um wieder auf 10/2 Sekunden zu kommen. So das Prinzip.
Hallo eRay, Funtionen sind eigentlich nichts anderes als ausgelagerter Quellcode. Wenn du verschiedene Befehle hast, dann kannst du z.B. die Befehle einfach hintereinander abarbeiten: Befehl 1; Befehl 2; Befehl 3; Befehl 1; Befehl 2; Befehl 4; Befehl 1; Befehl 2; Befehl 5; Du kannst aber auch, wegen der Übersichtlichkeit oder weil du bestimmte Befehlsfolgen immer wieder brauchst, diese in Funktionen schreiben, z.B: Funktion 12() { Befehl ; Befehl ; } Dann könntest du am Beispiel oben schreiben: Funktion 12(); Befehl 3; Funktion 12(); Befehl 4; Funktion 12(); Befehl 5; Zum Timer-Problem: setz dir eine Variable als Merker (oder neudeutsch Flag) und prüf diese dann in einer Schleife. Dann rufst du je nach aktuellem Zustand entweder die Funktion 10s oder die Funktion 2s auf. Ich hoffe, ich habe dein Problem soweit verstanden und paar Anstöße geliefert, ansonsten frag einfach nochmal. (Ich hab keine richtige C-Syntax verwendet, sondern nur meinen PseudoCode zum verdeutlichen :-) )
Danke an alle die mit Tipps gegeben haben da ich wie gesgat noch Anfänger bin versteh ich die nur zum teil. Trozdem hat es mir geholfen. Zur sicherheit könntet ihr mir sagen ob das hier funktioniert?
1 | void timerfrequenz(unsigned char Faktor) //50mS * Faktor |
2 | {
|
3 | unsigned char i=0; |
4 | |
5 | while(i<Faktor) |
6 | {
|
7 | TR0 =0x00; |
8 | TH0 =0x3C; |
9 | TL0 =0xAF; |
10 | TF0 =0x00; |
11 | TR0 =0x01; |
12 | |
13 | while(0 == TF0); |
14 | i=i++; |
15 | }
|
16 | |
17 | }
|
18 | |
19 | |
20 | |
21 | void timerdauer(void) //50mS*240 =12000mS =12 Sekunden |
22 | {
|
23 | unsigned char i=0; |
24 | |
25 | while(i<240) |
26 | {
|
27 | TR1 =0x00; |
28 | TH1 =0x3C; |
29 | TL1 =0xAF; |
30 | TF1 =0x00; |
31 | TR1 =0x01; |
32 | |
33 | while(0 == TF1); |
34 | i=i++; |
35 | }
|
36 | if(i<=200) |
37 | {
|
38 | void blinken(void); |
39 | }
|
40 | else; |
41 | |
42 | |
43 | }
|
44 | |
45 | |
46 | |
47 | |
48 | |
49 | void blinken(void) |
50 | {
|
51 | P4 =0xFF; |
52 | void timerfrequenz(5); |
53 | P4 =0x00; |
54 | void timerfrequenz(5); |
55 | }
|
Sry das es noch nicht kommentiert ist. Aber für euch eingefleischten Programieren doch kein Problem ;). Danke eRay.
ah ich seh grade bin mir aber nicht sicher. kann es sein das mein if(i<=200) mit in die vorrige while-schleife muss?. weil sonst würd es das if ja erst erreichen wenn die whileschleife abgeschlossen ist richtig?
Hallo, Oha! Laß das i=i++; !! Nimm einfach i++!! Das Inkrementieren (Um den ganzzahligen Wert 1 erhöhen) ist DER Befehl den C für sich beansprucht!! ;-) Außerdem kannst du für i=i+2 -- i+=2 schreiben, oder für x=x*2 -- x*=2! Zu dem Thema Timer kann ich mich nur den Vorrednern anschließen! Je nach Controller einfach einen Timer mit einer Zeitbasis (z. Bsp. 10 Millisek.) einstellen. Und eine Variable im dazugehörigem Interrupt hochzählen! Diese Zeitbasis kannst du dann für viele verschiedene Zeitfunktionen verwenden! Du solltest nur darauf achten das die Zeitbasis nicht zu klein ist!! Sonst läufst du Gefahr, das der Controller nur noch mit dem Zählen der Zeitvariable beschäftigt ist!! Meist sind aber Werte im Millisekunden Bereich kein Problem! MfG Tom
>> kann es sein das mein if(i<=200) mit in die vorrige while-schleife muss?.
ja
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.