Forum: Mikrocontroller und Digitale Elektronik Problem mit Laufvariable Atmel XMEGA8


von TT (Gast)


Lesenswert?

Hi Forum,
ich bereite mich immer noch auf eine Klausur im Fach 
Microprozessortechnik vor.
Ich habe mir die Aufgabe gestellt, 20 Impule in einer bestimmten 
Frequenz auszugeben.
Mein Problem liegt dabei in dem Zählen der Impulse.
Ach übrigens: Da ich erstaml was lauffähiges Zaubern will habe ich es 
erstmal ohne ISR zu machen.

Ich habe also ein Endlosschleife laufen:

U8 i=0; //Laufvariable

for(;;)
{
If (TCF0.CNT == 0)
{
i++;
if(i<40)
{
PORTE.OUTTGL = Ledx;
}
}
}

Nur zum Problem:
Das das Progi nicht läuft habe ich die Laufvariable untersucht und auf 
PORTE.OUTCLR = i; ausgegeben.

Und da sieht man das die scheinbar mit dem ersten cnt-impuls LED0 bis 
LED6 angehen und anschließenden (beim nächsten cnt-takt) geht noch LED7 
an.

Die wertzuweisung bei U8 i=0; hat überhaupt keinen einfluss.
Wertzuweisung inerhalb der endlosschleife funktioniert zwar, aber ist 
nicht sinnvoll da diese ja bei jedem schleifendurchlauf wieder auf 0 
gesetzt wird.

Habt Ihr da ne Idee was man machen kann???

Danke

TT
von Floh (Gast)


Lesenswert?

TT schrieb:
> for(;;)
> {
> If (TCF0.CNT == 0)
> {
> i++;
> if(i<40)
> {
> PORTE.OUTTGL = Ledx;
> }
> }
> }

Schrecklich formatiert.
So als Tip: Wie lange wird die Bedingung TCF0.CNT == 0 wahr sein? Mit 
Sicherheit mehrere Programmdurchläufe. Also wird pro "Nullsein" mehrmals 
hocgezählt.
von TT (Gast)


Lesenswert?

Ja, soory wegen der Formatierung.
Ich habe es einfach nur abgetippt.

Warum aber funktioniert das Toogln?
Ich habe Vorteiler = 1024 und PER = 2000.
Das Toogeln ergibt ca. 1hz.

Meinst du da etwa das CNT==0 für 1024x (System)Takte High ergibt?
Das würde ich bedeuten wenn ich VT runterschraube und PER richtig hoch 
könnte es was werden?

Ich mach mal nen Versuch.
Danke für den Tipp.

TT
von Peter II (Gast)


Lesenswert?

TT schrieb:
> Das würde ich bedeuten wenn ich VT runterschraube und PER richtig hoch
> könnte es was werden?
nein, du darst nur bei einem Wechsel von 0 auf 1 deine Variable 
hochzählen. Also den Alten wert merken und dann vergleichen.
von TT (Gast)


Lesenswert?

Leuchtet mit ein. Der VT hält CNT auf 0 und die endlosschleife fragt 
jedes mal  ab und adddiert 1 dazu.
Die Wert verändern hatte übrigens nur zur Folge das beim start LED0 bis 
Led5 angingen.

Kannst du mir noch nen Tip geben wie ich vom TCF0.CNT ne 
Flankenauswertung mache?
Dabei habe ich jetzt echt Probleme :-(

Danke
TT
von Peter II (Gast)


Lesenswert?

TT schrieb:
> Kannst du mir noch nen Tip geben wie ich vom TCF0.CNT ne
> Flankenauswertung mache?
Tipp steht doch schon da:
> Also den alten wert merken und dann vergleichen.
von TT (Gast)


Lesenswert?

Wer lesen kann.... Ihr wisst schon!

Auf jeden Fall läuft es: freu!!!
hier nun die Endlosschleife

for(;;)
{
  //Endsloschleife
    if((TCF0.CNT==0) && (i==r1))
    {r1=i;
      if(i<=19)
      {
      PORTE.OUTTGL = O0;
      }
    i++;
    }
    if(TCF0.CNT==2000)
    {
      r1=i;
    }

}

Ich lasse meine LED (O0) nun 10x blinken und dann bleibt sie aus.
Sicherlich müsste man jetzt noch was für den überlauf von i machen.
aber das ist ne andere Baustelle.

Vielen Dank nochmals für die Hilfe.
By

Toni
von ich (Gast)


Lesenswert?

xmega8? Da ist mir wohl was entgangen...
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.