Forum: Mikrocontroller und Digitale Elektronik PIN immer wieder auf 1 setzen


von ....... (Gast)


Lesenswert?

Hallo

wenn ich in einer while-Schleife bin wird ja der Pin immer wieder neu 
aktiviert.

Mich würde interessieren wenn man COM1C0 auf 1 setzt ob das den TCNT 
auch auf 0 setzt.
Ebenso wenn man Portb auf 1 setzt. Es braucht ja immer eine gewisse Zeit 
bis es in den Zustand kommt. Wenn man in einer while Schleife PORTB1 
immer wieder auf 1 setzt, bewirkt das eine Störung.

Kann man das so lassen oder ist es besser wenn man eine Pause reinsetzt.


MfG
1
do
2
{
3
  if (~PINB & (1<<PB6))
4
  {
5
     TCCR1A &= ~(1<<COM1C0);
6
           PORTB |= (1<<PB1);
7
        }
8
  else
9
  {
10
           TCCR1A |= (1<<COM1C0);
11
           PORTB &= ~(1<<PB1);
12
  }  
13
}while(PINB & (1<<PB6))

von ....... (Gast)


Lesenswert?

Ist die Frage unverständlich formuliert?

von Karl H. (kbuchegg)


Lesenswert?

Jein.


Ich sach mal so.

Eins-er als 1 kann ein Ausgang nicht werden. Wenn er schon auf 1 ist, 
kannst du ihn weiterhin auf 1 setzten bis du schwarz wirst. Das 
interessiert keine Sau.


> Mich würde interessieren wenn man COM1C0 auf 1 setzt ob das
> den TCNT auch auf 0 setzt.

Wenn dem so wäre, würde es im Datenblatt vermerkt sein. Die Information 
ist ja nicht sooooo unwichtig.


> Kann man das so lassen oder ist es besser wenn man eine Pause reinsetzt.
> do
> {
>   if (~PINB & (1<<PB6))
>   {
>     TCCR1A &= ~(1<<COM1C0);
>     PORTB |= (1<<PB1);
>   }
>   else
>   {
>     TCCR1A |= (1<<COM1C0);
>     PORTB &= ~(1<<PB1);
>   }
> }while(PINB & (1<<PB6))

Was soll das bewirken?

Da deine while Schleife vom selben Pin abhängt wie dein if, erhebt sich 
die Frage nach dem Sinn des ganzen. Bist du dir bewusst, dass nach der 
while Schleife es nicht sauber definiert ist, ob da jetzt COM1C0 gesetzt 
oder gelöscht bzw. PB1 gesetzt oder gelöscht ist?
Diese Frage finde ich nämlich viel ineterssanter, weil ich denke, dass 
du dich da grundsätzlich verlaufen hast und in Wirklichkeit eigentlich 
das wolltest:
1
    if( PINB & ( 1 << PB6 ) ) {     // wenn Pin gesetzt
2
      TCCR1A |= (1<<COM1C0);        //   einschalten
3
      PORTB &= ~(1<<PB1);
4
5
      while( PINB & ( 1 << PB6 ))   //   warten, solange der Pin gesetzt ist
6
        ;
7
8
      TCCR1A &= ~(1<<COM1C0);       //   und wieder ausschalten
9
      PORTB |= (1<<PB1);
10
    }
Aber das ist nur eine Vermutung, basierend darauf, dass dein 
Originalcode kein eindeutiges sauberes Verhalten zeigt und davon 
abhängig ist, wann genau der Pin PB6 seinen Zustand wechselt.

von ....... (Gast)


Lesenswert?

Ich habe nur die Kurzfassung reingesetzt. Aber es war auch ein kleiner 
Fehler. Danke!

Der Schrittmotor soll solange laufen bis am Rand der Sensor anschlägt.
Ist der Sensor High soll der Motor einschalten, ist der Sensor Low soll 
der Motor ausschalten.

Da hat mich interessiert. Wenn ich von Low auf High schalte, dann 
braucht es eine gewisse Zeit bis es in den Zustand kommt.
Wenn der Zustand High ist und ich setze ihn wieder High - braucht es 
wieder eine gewisse Zeit bis es in den Zustand kommt weil es wieder 
gesetzt wurde oder bleibt es einfach auf High.

>Wenn er schon auf 1 ist,kannst du ihn weiterhin auf 1 setzten bis du >schwarz 
wirst.

Somit dürfte es nicht stören wenn ich immer wieder auf 1 setze auch 
nicht bei TCNT.
1
  do
2
  {
3
    if (~PINB & (1<<PB6))
4
    {
5
      TCCR1A &= ~(1<<COM1A0);
6
                        PORTB |= (1<<PB5);
7
    }
8
    else
9
    {
10
      TCCR1A |= (1<<COM1A0);
11
    }
12
13
  
14
                if (~PINB & (1<<PB4))
15
    {
16
      TCCR1A &= ~(1<<COM1C0);
17
                        PORTB |= (1<<PB7);
18
    }
19
    else
20
    {
21
      TCCR1A |= (1<<COM1C0);
22
    }
23
      
24
  }while((PINB & (1<<PB6)) || (PINB & (1<<PB4)));

von Karl H. (kbuchegg)


Lesenswert?

....... schrieb:

> Da hat mich interessiert. Wenn ich von Low auf High schalte, dann
> braucht es eine gewisse Zeit bis es in den Zustand kommt.

Ähm, du solltest dir mal klarmachen, über welche Zeiten du hier redest. 
Natürlich braucht jeder einzelne Befehl ein bischen Zeit. Aber das liegt 
im µs Bereich bzw. Bruchteilen davon (je nach Taktfrequenz)! In dieser 
Zeit dreht dein Schrittmotor noch nicht mal ein paar Bogensekunden 
weiter.

> Wenn der Zustand High ist und ich setze ihn wieder High - braucht es
> wieder eine gewisse Zeit bis es in den Zustand kommt weil es wieder
> gesetzt wurde oder bleibt es einfach auf High.

Ähm. Denk mal logisch darüber nach:
Dein Pin ist High.
Du setzt ihn auf High.

Warum, um alles in der Welt, soll der kurfristig auf Low gehen? Kein 
Mensch hat irgendwas von Low gesagt.

> braucht es
> wieder eine gewisse Zeit bis es in den Zustand kommt

In welchen Zustand denn? Der Pin ist doch schon High. Higher als High 
kann der nicht werden.

Wenn du in deinem Zimmer am Lichtschalter auf "Ein" drückst, obwohl das 
Licht schon brennt, dann brennt das Licht eben einfach weiter. Und wenn 
du 50 mal draufdrückst, interessiert das die Glühbirne nicht. Ein ist 
ein.


>
>
1
  do
2
>   {
3
>     if (~PINB & (1<<PB6))
4
>     {
5
>       TCCR1A &= ~(1<<COM1A0);
6
>                         PORTB |= (1<<PB5);
7
>     }
8
>     else
9
>     {
10
>       TCCR1A |= (1<<COM1A0);
11
>     }
12
> 
13
> 
14
>                 if (~PINB & (1<<PB4))
15
>     {
16
>       TCCR1A &= ~(1<<COM1C0);
17
>                         PORTB |= (1<<PB7);
18
>     }
19
>     else
20
>     {
21
>       TCCR1A |= (1<<COM1C0);
22
>     }
23
>
24
25
   Hier an dieser Stelle sein PB4 schon längst 0 und just in diesem
26
   Moment wechselt PB6 von 1 auf 0
27
28
> 
29
>   }while((PINB & (1<<PB6)) || (PINB & (1<<PB4)));

Immer noch das gleiche Problem.
Es ist nicht garantiert, dass du die Abschaltung erhältst. Überleg dir 
einfach mal was passiert, wenn PB6 seinen Zustand wechselt kurz bevor 
das Programm zur abschliessenden while-Abfrage kommt. Die Schleife wird 
verlassen, ohne dass du innerhalb der Schleife die Chance hattest, den 
Motor abzuschalten.

von ....... (Gast)


Lesenswert?

>Warum, um alles in der Welt, soll der kurfristig auf Low gehen? Kein
>Mensch hat irgendwas von Low gesagt.

Die Vermutung war dass jedes mal wenn der Pin gesetzt wird egal ob auf 
High oder Low der Pin kurze Zeit im undefinierten Zustand ist.


Es fällt mir nur auf diese Art ein.

Wenn ich es so machen würde bleibt er in dieser while-Schleife hängen 
und kontrolliert nicht mehr den anderen Sensor.
1
      while( PINB & ( 1 << PB6 ))   //   warten, solange der Pin gesetzt ist
2
        ;
1
    if( (PINB & ( 1 << PB6 ))) // wenn Pin gesetzt
2
  {
3
      TCCR1A |= (1<<COM1CA0);        //   einschalten
4
    } 
5
    if( (PINB & ( 1 << PB4 ))) // wenn Pin gesetzt
6
  {
7
      TCCR1A |= (1<<COM1C0);        //   einschalten
8
    }
9
10
      while( (PINB & ( 1 << PB6 )) || (PINB & ( 1 << PB4 )))   //   warten, solange der Pin gesetzt ist
11
      {
12
       if (~PINB & ( 1 << PB6 ))
13
    {
14
      TCCR1A &= ~(1<<COM1A0);
15
      PORTB |= (1<<PB1);
16
    }
17
       if (~PINB & ( 1 << PB4 ))
18
    {
19
      TCCR1A &= ~(1<<COM1C0);
20
      PORTB |= (1<<PB7);
21
    }
22
    }

von ....... (Gast)


Lesenswert?

Habe einen Teil vergessen.
1
    if( (PINB & ( 1 << PB6 ))) // wenn Pin gesetzt
2
  {
3
      TCCR1A |= (1<<COM1CA0);        //   einschalten
4
    } 
5
    if( (PINB & ( 1 << PB4 ))) // wenn Pin gesetzt
6
  {
7
      TCCR1A |= (1<<COM1C0);        //   einschalten
8
    }
9
10
      while( (PINB & ( 1 << PB6 )) || (PINB & ( 1 << PB4 )))   //   warten, solange der Pin gesetzt ist
11
      {
12
       if (~PINB & ( 1 << PB6 ))
13
    {
14
      TCCR1A &= ~(1<<COM1A0);
15
      PORTB |= (1<<PB1);
16
    }
17
       if (~PINB & ( 1 << PB4 ))
18
    {
19
      TCCR1A &= ~(1<<COM1C0);
20
      PORTB |= (1<<PB7);
21
    }
22
    }
23
      TCCR1A &= ~(1<<COM1A0);
24
      PORTB |= (1<<PB1);
25
      TCCR1A &= ~(1<<COM1C0);
26
      PORTB |= (1<<PB7);

von Karl H. (kbuchegg)


Lesenswert?

....... schrieb:
>>Warum, um alles in der Welt, soll der kurfristig auf Low gehen? Kein
>>Mensch hat irgendwas von Low gesagt.
>
> Die Vermutung war dass jedes mal wenn der Pin gesetzt wird egal ob auf
> High oder Low der Pin kurze Zeit im undefinierten Zustand ist.

Die Vermutung ist falsch.
Sollte ja jetzt mitlerweile klar geworden sein.

> Wenn ich es so machen würde bleibt er in dieser while-Schleife hängen
> und kontrolliert nicht mehr den anderen Sensor.

Dann musst du dir eben etwas anderes einfallen lassen.
Hinweis: Das eigentliche Problem in deinem Code besteht darin, dass du 
an verschiedenen Stellen innerhalb der Schleife verschiedene Werte vom 
Pin Register haben kannst. Das Problem löst sich in Luft auf, wenn du am 
Anfang der Schleife das Pin Register einmal in eine Variable einliest 
und dann immer nur mit dieser Variablen in einem Schleifendurchlauf 
arbeitest. Dann haben alle Programmteile zwangsweise dieselbe 
Vorstellung davon, wie der Portpin momentan gerade steht.

von ....... (Gast)


Lesenswert?

>an verschiedenen Stellen innerhalb der Schleife verschiedene Werte vom
>Pin Register haben kannst. Das Problem löst sich in Luft auf, wenn du am
>Anfang der Schleife das Pin Register einmal in eine Variable einliest
>und dann immer nur mit dieser Variablen in einem Schleifendurchlauf
>arbeitest.

Ich kann nicht ganz nachvollziehen was du da meinst.

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.