Gast
#2652013
Hallo wissende Forumsmitglieder, ich konnte schon viel durch eure Einträge lernen. Zu meinem Problem konnte ich jedoch leider noch nichts finden. Und zwar möchte ich auf dem obig genannten µC eine Software PWM realisieren, die eine LED ein- und ausschaltet (Pin 1.0). Ich versuche dies bereits seit einigen Tagen, aber ich weis einfach nicht mehr wo der Fehler liegen könnte. Meiner Meinung nach sollte der Timer bis TACCR0 (=30000) zählen. Von 0 bis TACCR1 (28000) sollte die LED aus sein, und von TACCR1 (28000) bis TACCR0 (=30000) sollte die LED an sein. Somit müsste die LED nur kurz aufblinken. Aber egal was ich mach, die LED blinkt gleichmäßig. Sie blink nur mal schneller, mal langsamer aber nie ändert sich der Duty Cycle. Es wäre super, wenn jemand mal einen Blick drauf werfen könnte. Ich hab einfach keine Idee mehr.... #include "msp430x22x4.h" void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR = BIT0; // P1.0 output (LED) P1OUT = ~BIT0; // P1.0 aus TACTL = TASSEL_2 + MC_1 + ID_3; // + TAIE; // SMCLK, up-mode, interrupt, Teiler 8 // Bis hierhin wird gezählt TACCTL0 = CCIE;// + OUTMOD_7; // TACCR0 interrupt enabled TACCR0 = 30000; // hier wird wird umgeschalten TACCTL1 = CCIE;// + OUTMOD_7; // TACCR1 interrupt enabled TACCR1 = 28000; __bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt } // Timer_A3 Interrupt Vector (TAIV) handler #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A0(void) { // Wenn er hier rein geht, ist TAR == 0; P1OUT &= ~BIT0; } // Timer_A3 Interrupt Vector (TAIV) handler #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A1(void) { // Wenn er hier rein geht, ist TAR == TACCR1 switch (TAIV) // Efficient switch-implementation { case TAIV_TACCR1: P1OUT |= BIT0; // hier geht er rein. break; case TAIV_TACCR2: break; // geht nicht rein. Passt. case TAIV_TAIFG: break; // geht nicht rein. Passt. } } Es wäre wirklich super, wenn irgendjemand eine Idee hätte! Vielen vielen Dank im Vorraus. Tobias