Hi, ich sollte eine LED mit 1 Hz blinken lassen. Das habe ich wie folgt gelöst: #include <msp430xg46x.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P5DIR |= 0x02; // P5.1 output (Port5 PIN 1) CCTL0 = CCIE; // CaptureControl0=CCR0InterruptEnabled CCR0 = 32769; // Endwert wird ins CapputreCompareRegister=163 gesetzt //#define CCR0 TACCR0 /* Timer A Capture/Compare 0 */ TACTL = TASSEL_1 + MC_2 + ID_0; // ACLK, contmode,Vorteiler 0 TACTL |= MC_2; // TimerA Start _BIS_SR(LPM3_bits + GIE); // Enter LowPowerMode3 w/ interrupt } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { P5OUT ^= 0x02; // Toggle P5.1 CCR0 += 32769; // Add Offset to CCR0 } Die Timersource ist ACLK (32769 HZ), gestartet im ContiniousMode. Dieser zählt jeweils von 0 bis 65535, dann kommt der Overflow. Da ich das CCR0 auf 32769 gesetzt habe, zählt der Timer nun von 32769 bis 65535 bis zum Overflow. Der er 32769 Zählschritte pro Sekunde schafft, erhält man jede Sekunde einen Overflow. Nun die Frage: Wenn ich nun 100Hz haben will, muss ich das CCR0 auf 327 setzen. Praktisch klappt das dann auch, aber theoretisch passt dann meine Erklärung nicht mehr. Denn wenn der Timer von 327 zu 65535 zählt, dann würde er länger und nicht weniger Zeit benötigen. Folglich ist der Wert im CCR0 der Endwert, bis zu dem gezählt wird, richtig? Nur dann muss der Zähler irgendwo Null gesetzt werden. Oder passiert das automatisch beim Overflow? hm, jetzt klingt es wieder logisch gg Also ist der Wert im CCR0 nun der Endwert, bis zu dem gezählt wird? Grüße, Stefan.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.