www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CodeVision und die Timers


Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leuts,

ich versuche hier mit CodeVision auf einem Mega16 einen Timer von 10 ms
hinzubekommen.
Also alle 10 ms soll ein Interrupt ausgelöst werden.
Zu Testzwecken will ich da bis 100 zählen und dann eine Led blinken
lassen. Die sollte also im Sekundentakt blinken. Aber hier bei mir
dauert das 3 Sekunden. Hat einer eine Idee woran das liegt ? Overhead
von C ?
Quarzfrequenz = 4,194304 MHz

Codeauszug:

Init:
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;

TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0x63;
TCNT1L=0xC0;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;



// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
TCNT1H=0xC0;
TCNT1L=0x63;
// Place your code here
  if (j < 100)
  {
    j++;
  } else {
    ++i;
    PORTC = ~i;
    j=0;
  }
}

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
......
++i;
PORTC = ~i;

hohohoho, was ist denn das? :)))

an welchem pin hast du denn die led angeschlossen?
schreib' doch z.b.:

if (PORTC.X) PORTC.X=0 else PORTC.X=1;

somit "toggle-st" du den PORT.X pin...

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, muss natürlich:

if (PORTC.X) PORTC.X=0; else PORTC.X=1;

heissen...

Autor: chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder PORTC.X ^= 0x??

Autor: chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja PORTC ^= 0x??

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, das Problem ist ja nicht das toggeln der LD, sondern die
Timerzeit.
Die sollte eigentlich bei 1 Sekunde liegen, liegt aber aber ca. 3
Sekunde. Warum ?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Reload im Interrupt ist schon mal ganz ungenau.
Vor allem, weil T1 ja schon selber sowas kann (Mode 4, OCR1A als
Endwert).

Und wenn man dazu auch noch in Kopfrechnen schwach ist, dann laß das
mal lieber den Compiler rechnen:

#define XTAL        4.194304e6    // 4,194304 MHz
#define T1_INTERVAL 100           // 100Hz

OCR1A = (unsigned int)(XTAL / T1_INTERVAL - 1);

Nur noch Mode 4 einstellen und fertig.


Peter

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das problem liegt genau beim "toggeln", wie du es jetzt "realisiert"
hast; bedenk' mal, was du eigentlich machst mit:

++i;
PORTC = ~i;

:))

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry emil, aber deine änderung bewirkt leidern ichts. immer noch ca.
3.3 sekunden.
also klemm ich mich mal an peters idee

trotzdem thanks a lot

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber trotzdem, irgendwo ist da wohl noch ein Denkfehler von mir drin.
Also: Ich habe einen Quarz mit 4,194304 MHz. Nun stelle ich einen
Prescaler von 1024 ein (TCCR0 = 5), ergibt eine Frequenz von 4096 Hz.
Also wird der Zähler alle 244 µs inkrementiert.
Nun will ich alle 20 ms einen Overflow, ergibt also 20 ms / 244 µs =
81,90 (82) Zählschritte. Da er immer bis 256 zählt, alde ich einen
Vorwahlwert von 256 - 82 = 174 nach TCNT0. In der Interruptroutine
zähle ich jetzt nochmals von 0-50 und dann toggle ich ein Bit. das Bit
müßte also alle 50 x 20 ms = 1s wechseln. Tut es aber nicht, es
wechselt ca. alle 3 Sekunden.
Woran kann das liegen ? Ich kann mir einfach nicht vorstellen, dass
Codevision da was vermurkst.

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht postest du hier endlich dein gesamtes programm?
wie jemand hier zu sagen pflegt: die glaskugel wird gerade repariert...

Autor: Karlheinz Druschel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
nichts leider als das

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..."TCNT0=178;"

ich weiss nicht, ob es so funktioniert, vielleicht ja, vielleicht nein;

ich würde den timer mit TCNT0=0xB2 aufladen, (178 DEC=B2 HEX), weiss
nicht, ob der compiler in diesem fall auch DEC zahlen versteht

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis, aber die Änderung bringt nichts.
Ich habe auch mal im Listfile geguckt, die Zahl wird schon richtig
übersetzt.

Greetings
Karlheinz

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.