Forum: Compiler & IDEs Timer/Counter geht nicht richtig


von Oli K. (waldmeister)


Lesenswert?

Sally Zusammen,
ich habe das Problem, dass mein Timer (90s8535) nicht richtig geht. Ich 
sollte 3 pegel ausgeben, bekomme aber nur einen. Woran kann das liegen?



void wait(int waiti)
{
  waiti -= 13;               // Korr. um 13 µs bei 8 Mhz (Genauigkeit 
+/- 0.6 µs)
  TCNT1 = 60000 - waiti;          //TCNT1 = zeit in 16bit portregister

  TCCR1B = 0x02;      //vorteiler ck/8
  TIFR  |= (1<<TOV1);      //TOV1 gesetzt
  TIMSK |= (1<<TOIE1);    //TOIE1 gesetzt

  intflag_sb.bit.t1 = RESET;    //in while schleife
  sei();
  while (!intflag_sb.bit.t)
  {
  }
  TIMSK &= ~0x04; //timer interr. aus

}
////////
void send(int one, int two, int three)
{
  SET(PORTD,0x80);
  wait(one);
  RESET(PORTD,0x80);

  wait(two)

  SET(PORTD,0x80);
  wait(three);
  RESET(PORTD,0x80);
}
send(10,30,20);

von johnny.m (Gast)


Lesenswert?

Warum postet eigentlich keiner mal ein vollständiges Programm, sondern 
nur solchen zusammenhanglosen Kernschrott? Und dann Hilfe erwarten... 
Ganz toll. Auf jeden Fall kann ich aus dem obigen Gedöns nichts, aber 
auch gar nichts erkennen, außer dass da schon einige Unstimmigkeiten 
drin sind und die Kommentare absolut ohne Aussagekraft sind. Wenn man 
dazu was sagen soll, muss einem schon mitgeteilt werden, was das 
Programm eigentlich machen soll und was es macht. "3 Pegel ausgeben" 
aber "bekomme nur einen" sagt gar nichts!

von Magnus Müller (Gast)


Lesenswert?

Ich muss jonny.m Recht geben. Ausserdem gibt der AVR bestimmt nur 2 
(ZWEI) Pegel aus: High (VCC) und Low (0V).

Gruß,
Magnetus

von Peter D. (peda)


Lesenswert?

Reduzierung ist natürlich erwünscht, ABER:

- nie nur so ähnlich aus dem Kopf, sondern immer mit copy&paste

- es muß fehlerfrei compilierbar sein

- der Fehler muß noch auftreten

- es muß geprüft worden sein, daß der Fehler immer noch auftritt, bevor 
man es postet !!!!


Und ne Fehlerbeschreibung muß immer so aussehen:

- was wurde erwartet

- was passierte statt dessen


Dann kann man auch helfen.


Peter

von Magnus Müller (Gast)


Lesenswert?

> void send(int one, int two, int three)
> {
>   SET(PORTD,0x80);
>   wait(one);
>   RESET(PORTD,0x80);
>
>   wait(two)
>
>   SET(PORTD,0x80);
>   wait(three);
>   RESET(PORTD,0x80);
> }

Wenn du mit "3 Pegel" --> "3 positive Impulse" meinst wundert es mich 
nicht. Diese Funtion erzeugt dir immer nur:

High      
      | |_| |_
Low

Beim Aufruf mit

      send(10,30,20);

kommt dann:

High   _        ___
      |  |______|    |_
Low    10   30    20

Gruß,
Magnetus

von Oli K. (waldmeister)


Lesenswert?

Guten Morgen,
mein Problem ist, dass ich nur einen Impuls bekomme, also hier nur 10, 
wenn ich mit send(10,30,20); alles abschicke. die anderen zwei Impulse 
bekomme ich nicht mehr auf dem Oszi zu sehen. Fehler gibt es beim 
compilieren auch keine und Warnungen bekomme ich auch nicht. Da ich die 
waitfunkt. schon mal ausgetauscht habe, und das ganze auch schon 
funktioniert hat(=alle Impulse ausgeben) bin ich der Meinung, dass mein 
Fehler in der Initiallisierung der Interrupts liegen muss. Aber wie 
schon geschrieben, er bringt mir keine Warnungen und auch keine Fehler. 
Und dann den ganzen Code zu posten wäre Quatsch, da ich den "Fehler" 
schon so weit eingrenzen kann!
Mfg

von Oliver (Gast)


Lesenswert?

Dann lass es halt, und grenze noch weiter selber ein. Schließlich lernt 
man am besten durch Erfahrungen, die man selbst erfährt.

Ein nettes tool für solche Fragestellungen ist vmlab. Das gibt es als 
freeware, und kann beim debuggen dieser Fragestellungen eine echte Hilfe 
sein.

Oliver

von gast (Gast)


Lesenswert?

---
void send(int one, int two, int three)
{
  SET(PORTD,0x80);
  wait(one);
  RESET(PORTD,0x80);

  wait(two)

  SET(PORTD,0x80);
  wait(three);
  RESET(PORTD,0x80);
}
---

bei dem wait(two) fehlt das ;

von Peter D. (peda)


Lesenswert?

Oli K. wrote:

> Und dann den ganzen Code zu posten wäre Quatsch

Da stimme ich Dir zu.
Aber Du must soviel posten, daß man es auch verstehen kann.
Und das geht nur, wenn man sämtliche verwendeten Variablen und 
Funktionen kennt.
1
...
2
  intflag_sb.bit.t1 = RESET;    //in while schleife
3
...
4
  RESET(PORTD,0x80);
5
...

Du hast als eine unbekannte Funktion "RESET" und deren Adresse im Flash 
weißt Du der ebenfalls unbekannten Variable "intflag_sb.bit.t1" zu.

Was soll das ?

Wie soll das ein anderer verstehen ?


Peter

von klugscheissender Rahul, manchmal auch fies (Gast)


Lesenswert?

Hast du deinen Funktionsaufruf auch mal mit nur einer Zahl ausprobiert?
send(10,10,10)?

von Oli K. (waldmeister)


Lesenswert?

Mein Reset habt ich im Headerfile deklariert:
RESET(x,y) (x &= (~y));
und das Bit vom Bitfeld wurde auch im Header deklariert und wird noch 
mal verwendet:

SIGNAL(SIG_TIMER1)     //statt SIGNAL habe ich auch schon INTERRUPT 
eingesetzt
//void timer1_interrupt(void) //zum testen
{
   intflag_sb.bit.t1over_b = 1;
   sei();
}
ansonsten wird das Bit nicht mehr genutzt.

die Funktion habe ich schon in allen Varianten ausprobiert.

von Karl H. (kbuchegg)


Lesenswert?

> Und dann den ganzen Code zu posten wäre Quatsch, da ich den
> "Fehler" schon so weit eingrenzen kann!

Die übliche vorgehensweise ist es, den Teil bei dem du Probleme
hast in ein neues, komplettes Programm zu verpacken (also
mit main() und allem was dazugehört, so dass man es kompilieren
kann) und dieses Programm zu posten. Vorher aber sicherstellen,
dass das Problem immer noch da ist.

Man sollte nicht glauben, wievielen Leuten (inkl. mir) es beim
Zusammenstellen solcher Testprogramme wie Schuppen von den Augen
fällt.


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.