Forum: Mikrocontroller und Digitale Elektronik Interrupt XPlain


von Axel (Gast)


Lesenswert?

Hallo Zusammen,

ich versuche seit zwei stunden 3 interuupt auszulösen. Ich bin  kurz vor 
dem Verzweifeln.
es sollte also 2 Compare (CCA, CCB) und eine Overflow (OVF)sein. aber es 
tut nichts.
-Die LED1 soll 1ms togglen
-LED2 soll 2ms togglen
-LED3 soll 0,5ms togglen

Ich benutze Xplain mit ATXmega128A1 und JTAG als Debugger. Die H-file 
und C-file habe ich beigefügt.

hier den code:

#define F_CPU 32000000UL

#include "avr_compiler.h"
#include "port_driver.h"
#include "pmic_driver.h"
#include "clksys_driver.h"
#include "TC_driver.h"

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>



#define LEDS  PORTE
#define LED1 (1<<PIN0)
#define LED2 (1<<PIN1)
#define LED3  (1<<PIN2)


void Port_Init(void)

{  PORT_SetPinsAsOutput( &LEDS,LED1);
  PORT_SetPinsAsOutput( &LEDS,LED2);
  PORT_SetPinsAsOutput( &LEDS,LED3);
}

void LED1_LED2_Toggle  (void)
{

        // Enable interrupt levels.
  PMIC_SetVectorLocationToApplication();
  PMIC_EnableLowLevel();
  PMIC_EnableMediumLevel();
        //Set up Timer/Counter 0 with three Compare Match interrupts.
  TCC0.CTRLB = TC0_CCBEN_bm | TC0_CCAEN_bm | TC_WGMODE_NORMAL_gc;
  TCC0.INTCTRLB = (uint8_t) TC_CCBINTLVL_MED_gc | TC_CCAINTLVL_LO_gc;
  TCC0.CCA = 0x7CFF; // Compare Match A, (1000hz--->1ms)
  TCC0.CCB = 0xF9FF; // Compare Match B, (500hz--->2ms)
        TCC0.CTRLA = TC_CLKSEL_DIV1_gc;// Run at maximum speed.
}

ISR(TCC0_CCA_vect)
{
  PORT_TogglePins(&LEDS,LED1);
}

ISR(TCC0_CCB_vect)
{
  PORT_TogglePins(&LEDS,LED2);
}

void LED3_Toggle (void)
{
   PMIC_EnableHighLevel();
        //Set period/TOP value
  TC_SetPeriod(&TCC0,0x3E7F); //2000Hz (0,5ms)
  // Select clock source
  TC0_ConfigClockSource(&TCC0, TC_CLKSEL_DIV1_gc);
        // Enable overflow interrupt at high level
  TC0_SetOverflowIntLevel(&TCC0, TC_OVFINTLVL_HI_gc);
  //PMIC.CTRL |= PMIC_HILVLEN_bm;

}

ISR(TCC0_OVF_vect)
{
  PORT_TogglePins(&LEDS,LED3);
}


void CLK_Init()
{

  CLKSYS_Enable( OSC_RC32MEN_bm );
  CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );

  //DFLL für genauere 32MHz (bringt aber keine Verbesserung)
  OSC.DFLLCTRL |= OSC_RC32MCREF_bm;
  DFLLRC32M.CTRL |= DFLL_ENABLE_bm;
  ///////////////////////////////////////////////

  do {} while ( CLKSYS_IsReady( OSC_RC32MRDY_bm ) == 0 );
  CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc );
}



int main (void)

{
       Port_Init();
       LED1_LED2_Toggle();
       LED3_Toggle();
       CLK_Init();
       sei();

       while (1)
      {}

}

vielen Dank

Axel

von holger (Gast)


Lesenswert?

>ich versuche seit zwei stunden 3 interuupt auszulösen. Ich bin  kurz vor
>dem Verzweifeln.

Dann fang doch einfach mal mit EINEM an.

von Axel (Gast)


Lesenswert?

Hallo Holger,

die OVF-interrupt klappt laut der oxi.
Das problem das es ist unmöglich die zwei anderen Interrupt auszulösen. 
CCA und CCB folgen die werte (0,5ms) von OVF.
Ich habe keine Ahgnug , woran das liegen kann.


Danke Axel

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
Noch kein Account? Hier anmelden.