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