www.mikrocontroller.net

Forum: Compiler & IDEs Timer/Counter geht nicht richtig


Autor: Oli K. (waldmeister)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Magnus Müller (Gast)
Datum:

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

Gruß,
Magnetus

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oli K. (waldmeister)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.
...
  intflag_sb.bit.t1 = RESET;    //in while schleife
...
  RESET(PORTD,0x80);
...

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

Autor: klugscheissender Rahul, manchmal auch fies (Gast)
Datum:

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

Autor: Oli K. (waldmeister)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.