Timer/Counter geht nicht richtig

OP #478362
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);
Gast #478503
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!
#478548
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
Gast #478556
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
OP #478661
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
Gast #478672
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
#478696
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
OP #478704
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.
#478705
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren