Forum: Mikrocontroller und Digitale Elektronik C Anfänger braucht hilfe


von eRay (Gast)


Lesenswert?

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

von Düsendieb (Gast)


Lesenswert?

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;

von Albert .. (albert-k)


Lesenswert?

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.

von Michael K. (aemkai)


Lesenswert?

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

von eRay (Gast)


Lesenswert?

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.

von eRay (Gast)


Lesenswert?

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?

von Tom (Gast)


Lesenswert?

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

von Micha K. (Gast)


Lesenswert?

>> 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
Noch kein Account? Hier anmelden.