Forum: Mikrocontroller und Digitale Elektronik mikroelektronika EasyPICv7 Lauflicht


von Da Mo (Gast)


Lesenswert?

Guten Tag,

folgendes Programm erzeugt ein Lauflicht (links/rechts/links/rechts/...) 
am PORTC (RC0, RC1, RC2, RC3, RC4, RC5, RC6, RC7) des EasyPICv7.

Es erfolgt eine ständige Überprüfung ob TRISC als OUTPUT gesetzt ist. 
Ist dies nicht der Fall, wird ein Wechselblinker am PORTE (RE1, RE2) 
aktiv.

1
int ports(void)
2
{
3
  TRISC = 0x00;                                 // set direction to be output
4
  TRISE = 0x00;                  // set direction to be output (output error)
5
6
  LATC = 0x00;                                      // turn OFF the LATC leds
7
  LATE = 0x00;                       // turn OFF the LATD leds (output error)
8
  
9
  if( TRISC != 0x00)
10
  {
11
   return -1;
12
  }
13
  else
14
  {
15
   return 0;
16
  }
17
}
18
19
void main()
20
{
21
  int flag;
22
  char i;
23
24
  flag = ports();
25
26
  if(flag == 0)
27
  {
28
   while(1)
29
   {
30
    for(i = 0; i < 8; i ++)
31
    {
32
     Delay_ms(30);
33
     LATC = 0x01 << i;
34
    }
35
    for(i = 7; i > 0; i --)
36
    {
37
     Delay_ms(30);
38
     LATC = 0x01 << i;
39
    }
40
   }
41
  }
42
  
43
  if(flag == -1)
44
  {
45
   while(1)
46
   {
47
    {
48
     Delay_ms(100);
49
     LATE = 0x01 << 1;
50
     Delay_ms(100);
51
     LATE = 0x01 << 2;
52
    }
53
   }
54
  }
55
 }

Den selben Effekt, möchte ich jetzt mit interrupts und dem Oscillator 
erzielen. Wer kann mir dabei helfen?

Vielen Dank im Voraus!

von Krapao (Gast)


Lesenswert?

> Es erfolgt eine ständige Überprüfung ob TRISC als OUTPUT gesetzt ist.

Das ist nicht richtig. Es wird einmal geprüft, ob TRISC als OUTPUT 
gesetzt ist. Danach wird endlos (d.h. bis zum nächsten RESET des µC) 
eine von zwei Aktionen (Lauflicht oder Wechselblinker) durchgeführt.

von Da Mo (Gast)


Lesenswert?

Das habe ich ganz übersehen. Danke! Eine ständige Überprüfung ist aber 
auch nicht möglich (dafür würde man einen Parallelprozess benötigen), da 
in der main-Funktion eine while-Schleife endlos läuft.

von Krapao (Gast)


Lesenswert?

Es ist möglich, aber man muss eine andere Programmlogik benutzen.

Die Funktion von ports() muss aufgetrennt werden in eine einmalige 
Initialisierung und die mehrmal durchgeführte Abfrage.

Die Abfrage aus dem ports() muss in die große Arbeitsschleife rein.

Die Aktionen dürfen in der großen Arbeitsschleifen nicht als 
eigenständig Endlosschleifen laufen, sondern müssen die Kontrolle z.B. 
nach einem Durchlauf abgegeben.

Bei dem Lauflicht kann man das z.B. nach einem kompletten for-Durchlauf 
machen (Umschalten mit ports() nur nach einem kompletten Laufvorgang) 
oder man macht die Steuerung noch feiner, so dass ports() nach einem 
Umschaltvorgang einer LED im Lauflicht aktiv werden kann.

Weil dann im Betrieb die Aktion gewechselt werden kann. braucht man auch 
noch Anweisungen, um die Aktion abzuschalten, die gerade verlassen wird.

von Da Mo (Gast)


Lesenswert?

Dafür muss ich das komplette Programm umbauen. Das werde ich vielleicht 
am Abend machen. Vorerst würde ich gerne die Umsetzung von diesem 
Programm mit Interrupts, ... versuchen!?

von Da Mo (Gast)


Lesenswert?

@Krapao

Da sich noch keiner bezüglich den Interrupts, ... gemeldet hat, habe ich 
die Zeit für den Umbau der Logik genützt. Jetzt müsste eine ständige 
Überprüfung von TRISC gewährleistet sein!?
1
void initialisation(void)
2
{
3
  TRISC = 0x00;                                 // set direction to be output
4
  TRISE = 0x00;                  // set direction to be output (output error)
5
6
  LATC = 0x00;                                      // turn OFF the LATC leds
7
  LATE = 0x00;                       // turn OFF the LATD leds (output error)
8
}
9
10
int control(void)
11
{
12
 if( TRISC != 0x00)
13
 {
14
  return -1;
15
 }
16
 else
17
 {
18
  return 0;
19
 }
20
}
21
22
void main()
23
{
24
  int flag;
25
  char i;
26
27
  initialisation();
28
29
  while(1)
30
  {
31
   flag = control();
32
33
   if(flag == 0)
34
   {
35
     for(i = 0; i < 8; i ++)
36
     {
37
      Delay_ms(30);
38
      LATC = 0x01 << i;
39
     }
40
     for(i = 7; i > 0; i --)
41
     {
42
      Delay_ms(30);
43
      LATC = 0x01 << i;
44
     }
45
   }
46
  
47
   if(flag == -1)
48
   {
49
     {
50
      Delay_ms(100);
51
      LATE = 0x01 << 1;
52
      Delay_ms(100);
53
      LATE = 0x01 << 2;
54
     }
55
   }
56
  }
57
 }

von Krapao (Gast)


Lesenswert?

Und das tut es?

Bei dem zweiten Vorhaben:

Versuch in einem ersten Schritt die Funktion Delay_ms() durch eine 
selbstgeschriebene Version zu ersetzen, die mit einem Timer-Interrupt 
arbeitet.

Dazu musst du lernen, wie du einen Timer einrichtest, der z.B. alle 10ms 
aufgerufen wird. Diese Arbeit kann ich dir nicht abnehmen, weil dabei 
tief in dem Datenblatt des benutzten µCs zu stöbern ist und mit PICs 
habe ich keine Erfahrung.

Die Ersatzfunktion für Delay_ms(30) muss dann so lange warten, bis der 
10ms Timer dreimal ausgelöst wurde. Entsprechend ein bei einem 
Delay_ms(200) 20 Aufrufe...

Der nächste Schritt, nach dem Beherrschen der Timerprogrammierung, ist 
dann die Programmlogik umzustricken, so dass die Aktionen als "Mach was 
wenn" geschrieben werden, statt wie jetzt "Mach was dann trödele". Das 
aber wie gesagt später; es bringt nix den dritten Schritt vor dem 
zweiten zu machen. Dann stolpert man.

von Da Mo (Gast)


Lesenswert?

@Krapao

"Und das tut es?"

Was meinst du damit?

Habe ich etwas falsch gemacht?

von Krapao (Gast)


Lesenswert?

Ich meine, dass du doch bestimmt siehst, ob das Programm wie vorgesehen 
arbeitet. Ich kann das von hier aus nicht sehen. Oder sitzt du auch 
nicht vor der Schaltung?

von Da Mo (Gast)


Lesenswert?

Ich habe im Moment nur das geschriebene Programm vor mir am Bildschirm. 
Wenn ich dieses jedoch gedanklich ablaufen lasse, dann komme ich auf die 
gewünschte Funktionalität. Bin mir aber nicht 100%ig sicher!?

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.