mit Timer1 Zeit messen, Zeit teilen und damit Timer3 starten

Gast #142690
Hallo,

so langsam bin ich hier am verzweifeln :=(
Habe mich jetzt an einen (den größten) ATMEL, den ATMega 128
herangewagt. Nachdem auch ich Lehrgeld bezahlt hatte und die ISP
Verbindung falsch ("natürlich" an MOSI und MISO) angeschlossen hatte
(kann man ja zum Glück mit ein paar feinen Drähtchen auf PIN 2 und 3
wieder korrigieren), läuft der uC jetzt soweit (Ports lassen sich
setzen und PINs einlesen). Er hat die ganze Lötprozedur also
überstanden, juhu! Was ich jetzt machen wollte, ist eine
(komplizierte?) Zeitmessung.
Mit Timer3 soll eine Zeit gemessen werden (Timer3 zählt so lange, bis
ICP3 anspricht, d.h. der Input Capture Interrupt ausgelöst wird). Diese
gemessene Zeit soll dann durch 10 (nur ein Beispiel, wird später
variabel sein) geteilt werden und mit dieser Zeit soll dann Timer1
gestartet werden (d.h. Timer1 löst einen Overflow Interrupt nach einem
1/10 der Gesamtzeit/Timer3zeit aus). Aber irgendwie hapert es da, vor
allem beim Teilen durch 10, bzw. dem korrekten Starten des Timers1. Das
sind ja beides 16Bit Timer, die ihr Low und High Byte benötigen. Nur wie
schiebe ich das Ergebnis da hin?
Hier mal ein Codeauszug:


void timer_initialisieren (void)
{
 // Timer1 einfach mal mit 100msec initialsieren (wird später eh
überschrieben)
 TCCR1B = 0x00;
 TCNT1H = 0xBC;
 TCNT1L = 0x80;
 OCR1AH = 0x43;
 OCR1AL = 0x80;
 OCR1BH = 0x43;
 OCR1BL = 0x80;
 OCR1CH = 0x43;
 OCR1CL = 0x80;
 ICR1H  = 0x43;
 ICR1L  = 0x80;
 TCCR1A = 0x00;
 // Timer3 mit 300msec initialisieren (wird schon vorher durch ICP
angehalten/genullt)
 TCCR3B = 0x00;
 TCNT3H = 0xF0;
 TCNT3L = 0xBE;
 OCR3AH = 0x0F;
 OCR3AL = 0x42;
 OCR3BH = 0x0F;
 OCR3BL = 0x42;
 OCR3CH = 0x0F;
 OCR3CL = 0x42;
 ICR3H  = 0x0F;
 ICR3L  = 0x42;
 TCCR3A = 0x00;
 TCCR3B = 0x45; // Timer starten
}

#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr (void)
{
 TCNT1H = high_byte;
 TCNT1L = low_byte;
}

#pragma interrupt_handler timer3_capt_isr:26
void timer3_capt_isr(void)
{
 int zeit = 0;
 int temp = 0;
 // unterbrechen, low und high-byte auslesen, fortsetzen
 CLI();
 zeit  = ICR3L;
 zeit |= (int)ICR3H << 8;
 zeit = zeit / 10 // durch Anzahl der Schritte teilen

// hier klappt was nicht!!!

 temp = zeit << 8;
 high_byte = temp;
 low_byte = zeit;
 TCNT1H = high_byte;
 TCNT1L = low_byte;
 TCCR1B = 0x03; // Timer1 starten

// hier drüber muss der Fehler sein

 SEI();
}

Wie schiebe ich die Bits richtig, bzw. darf ich überhaupt "einfach
so" dividieren?

Gruß,

Hans
Gast #142691
DA fehlt auf jeden Fall mal ein Semikolon nach der "/10"

zeit = zeit / 10 // durch Anzahl der Schritte teilen

wird ja wohl nicht alles gewesen sein..... ?!?!?!

Ciao
Gast #142693
Hmm,

danke. Das mit dem Semikolon war es zwar nicht (hatte da statt der 10
ne Variable stehen), bin mittlerweile aber weiter. Muss mich wohl mal
näher mit WinAVR auseinadersetzen.

Gruß,

Hans

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.