Forum: Mikrocontroller und Digitale Elektronik µC Code frage


von Peterle A. (Firma: keine) (wanderameise)


Lesenswert?

infineon 505C:
1
#include <stdio.h>
2
3
volatile int tick;                
4
unsigned char RELOAD_HIGH;
5
unsigned char RELOAD_LOW;
6
void wait( int,int);               
7
8
_interrupt (1) void MyInterrupt(void)     
9
  {
10
  TH0  =  RELOAD_HIGH;
11
  TL0  =   RELOAD_LOW;
12
  tick++;
13
   }
14
15
void wait( int anzahl, int wert)
16
     {
17
       tick  =  0;
18
      while(tick < anzahl)
19
      {
20
              if(tick%2==0)
21
           {
22
           P1_0  =   wert;
23
           } else
24
           {
25
           P1_0  =   0;
26
           }
27
         }
28
     }
29
30
31
void main(void)
32
{
33
                      
34
TR0    =  1;              
35
EA    =  1;              
36
ET0    =  1;
37
TMOD  =  0x01;
38
39
40
    while(1)
41
    {
42
      RELOAD_HIGH  =  0xf1;        
43
      RELOAD_LOW  =   0x36;
44
      wait(132,1);
45
                        wait(165,0);
46
      
47
          
48
49
    }                
50
                                             
51
}

hoffe der code ist übersichtlich!das prinzip des programms habe ich 
verstanden, nur ein paar sachen sind mir nicht so ganz klar!wie muss ich 
mir den ablauf im µC vorstellen?

-in der main funktion wird als erstes der timer intialisiert
-wenn das programm in die endlosschleife kommt, läuft der timer bereits?
mit welchem startwert?der grade im register steht?

-dann übergebe ich die eigentlichen startwerte für den timer an globale 
variable!nun beginnt der timer immer wieder bei diesem wert!das heisst 
er muss mind einmal zum overflow gekommen sein um überhaupt seinen 
startwert zu erhalten?

-die wait funktion wird aufgerufen

-das programm verharrt solange in der main funktion, bis der interrupt 
131 mal durch den overflow ausgelöst wurde?

heisst das also, das der timer sobald er initalisiert wurde läuft egal 
was ich sonst so für befehle ausführen lasse und das er nciht mehr 
stopt?
was passiert nach der pause "wait(165,0);"?fängt er von vorne an?ja 
oder?um ich zu stoppen müsste ich wohl das entsprechende register bit 
setzen?!?

danke

von Peter D. (peda)


Lesenswert?

Benjamin Moll wrote:
> -in der main funktion wird als erstes der timer intialisiert
> -wenn das programm in die endlosschleife kommt, läuft der timer bereits?
> mit welchem startwert?der grade im register steht?

Der Wert, der als Resetwert im Datenblatt angegeben ist.

> -dann übergebe ich die eigentlichen startwerte für den timer an globale
> variable!nun beginnt der timer immer wieder bei diesem wert!das heisst
> er muss mind einmal zum overflow gekommen sein um überhaupt seinen
> startwert zu erhalten?

Ja.

> -das programm verharrt solange in der main funktion, bis der interrupt
> 131 mal durch den overflow ausgelöst wurde?

Nein, sondern bis zum Ausschalten.
Das Main wird nie verlassen.


> heisst das also, das der timer sobald er initalisiert wurde läuft egal
> was ich sonst so für befehle ausführen lasse und das er nciht mehr
> stopt?

Das ist der Sinn des Timers.

> was passiert nach der pause "wait(165,0);"?fängt er von vorne an?ja

Zählt einfach weiter.


> oder?um ich zu stoppen müsste ich wohl das entsprechende register bit
> setzen?!?

Ja


Peter

von Peterle A. (Firma: keine) (wanderameise)


Lesenswert?

danke soweit, aber nochmal dazu:

> -das programm verharrt solange in der main funktion, bis der interrupt
> 131 mal durch den overflow ausgelöst wurde?

glaub das sollte wait anstatt main heissen.sry!


=>also der timer wird gestartet
=>er kommt in die endlosschleife
=>er springt in die wait funktion um dort 132 mal die membran zu heben 
bzw zu senken! was passiert danach, wenn die abbruchbedingung für die 
wehile schleife erfüllt ist?er sprigt zurück in die main, um den 
nächsten befehl auszuführen oder?


von Karl H. (kbuchegg)


Lesenswert?

Benjamin Moll wrote:

> bzw zu senken! was passiert danach, wenn die abbruchbedingung für die
> wehile schleife erfüllt ist?

Es wird die nächste Anweisung nach der Schleife ausgeführt.
Da es aber keine Anweisung mehr gibt, erfolgt der Rücksprung
zu der Programmstelle, von der der Aufruf der Funktion
erfolgt ist. Dort geht es dann mit der nächsten Anweisung
nach dem Funktionsaufruf weiter.


von Peterle A. (Firma: keine) (wanderameise)


Lesenswert?

ok danke soweit

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.