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
>ich versuche seit zwei stunden 3 interuupt auszulösen. Ich bin kurz vor >dem Verzweifeln. Dann fang doch einfach mal mit EINEM an.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.