Hallo Leute, Ich arbeite mich langsam durch mit C und dem STM8S-Board. Normale GPIOs, Timer, PWM, habe ich mitlerweile mehr oder weniger verstanden. Was ich noch nicht verstehe und sehr gerne lernen möchte, ist wie man einen einfachen interrupt mit capcop setzt. Z.B. PD6-GPIO-Input.. Low -> da hängt einfach eine Photodiode dran, die über einen Widerstand mit einer externen Spannungsquelle verbunden ist. PD5-GPIO-Output... Hight -> eine LED mit nem Widerstand, die am Anfang aus ist. Ich würde gerne einen Compare-Interrupt einbauen, der guckt ob der PD6 Eingang auf 1 oder 0 steht, und abhängig davon den PD5 auf 1 bzw. 0 setzt - leider weiss ich nicht genau wie, was ich aber gemacht habe ist follgendes: --------------------------------------------------------------------- GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, 0x40, GPIO_MODE_IN_FL_NO_IT); GPIO_Init(GPIOD, 0x20, GPIO_MODE_OUT_PP_LOW_FAST); while(1){ if(((u8)GPIOD->IDR & 0x40) > 0x00){ GPIOD->ODR &= ~(0x20); }else{ GPIOD->ODR |= 0x20; } } --------------------------------------------------------------------- aber das ist kein Interrupt und ausserdem funktioniert es irgendwie nicht... Freue mich über jede Antwort Grüsse - Mischa
Hallo Mischa, ich habe ein Programmbeispiel, mit dem Du die LED an Port D, Pin 0 mit Hilfe eines Overun Interrupts von TIM1 in seiner Helligkeit ändern kannst. Ich hoffe, dass Programm ist einigermaßen für dich verständlich dokumtentiert. Es wurde das STM8 Discovery Board von STM verwendet. Eine kostenlose IDE mit 8kb gibts auf der IAR Homepage. Auf der Resonance Homepage findest du für paar Hinweise für die STM IDE. Im Anhang findest du die Interrupt Tabelle, die auch in der Datei iostm8s105c6.h von IAR bzw. im Handbuch von STM stehen. MfG IsobarX /*---------------------------------------------------------------------- --- * STM8S Discovery - IAR STM8S 1.2 - STM8S 1.1.1 Library *----------------------------------------------------------------------- */ #include "stm8s.h" #include "iostm8s105c6.h" #include "stm8s_conf.h" /* stm8s_conf.h: uncomment: #define _TIM1 (1), #define _TIM3 (1) */ /* Start by getting brighter */ s16 brightness_direction = +1; /* Interrupt OVR_UIF ############### header file: iostm8s105c6.h (IAR Directory) */ #pragma vector = TIM1_OVR_UIF_vector __interrupt void TIM_Update_vector(void) { /* Get the current brightness */ u16 current_brightness = TIM3_GetCapture2(); /* Check the brightness (maximum or minimum) */ if (brightness_direction > 0) { /* We're currently getting brighter */ if (current_brightness == 1000) { /* if brightness maximum; start getting darker */ brightness_direction = -1; } } else { /* getting brighter */ if (current_brightness == 0) { /* if brightness minimum; start getting brighter */ brightness_direction = +1; } } /* Update the brightness of the LED according to the brightness "direction" */ TIM3_SetCompare2(current_brightness + brightness_direction); /* Clear the interrupt pending bit for TIM1 */ TIM1_ClearITPendingBit(TIM1_IT_UPDATE); } /* ----------------------------- Main Program ------------------ */ void main(void) { /* Reset TIM3 */ TIM3_DeInit(); /* TIM3 Prescaler of 1 and a period of 999 */ TIM3_TimeBaseInit(TIM3_PRESCALER_1, 999); /* TIM3 CHannel 2 as Output, Enable, Capture/Compare Value 0, Low Level-> LED on */ TIM3_OC2Init(TIM3_OCMODE_PWM1, TIM3_OUTPUTSTATE_ENABLE, 0, TIM3_OCPOLARITY_LOW); /* Enable TIM3 */ TIM3_Cmd(ENABLE); /* Reset TIM1 */ TIM1_DeInit(); /* Set TIM1: Prescaler of 1000, count up, Period of 1, repetition counter of 0 */ TIM1_TimeBaseInit(1000, TIM1_COUNTERMODE_UP, 1, 0); /* Set TIM1 to generate interrupts every time the counter overflows (every ms) */ TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE); /* Enable TIM1 */ TIM1_Cmd(ENABLE); /* Enable global interrupts */ enableInterrupts(); /* Infinite loop */ for(;;); } /*---------------------------------------------------------------------- --- * Interrupt vector numbers *----------------------------------------------------------------------- */ #define SPI_TXE_vector 0x0C #define SPI_RXNE_vector 0x0C #define SPI_WKUP_vector 0x0C #define SPI_MODF_vector 0x0C #define SPI_CRCERR_vector 0x0C #define SPI_OVR_vector 0x0C #define TIM1_OVR_TIF_vector 0x0D #define TIM1_OVR_BIF_vector 0x0D #define TIM1_OVR_UIF_vector 0x0D #define TIM1_CAPCOM_CC1IF_vector 0x0E #define TIM1_CAPCOM_CC2IF_vector 0x0E #define TIM1_CAPCOM_COMIF_vector 0x0E #define TIM1_CAPCOM_CC4IF_vector 0x0E #define TIM1_CAPCOM_CC3IF_vector 0x0E #define TIM2_OVR_UIF_vector 0x0F #define TIM3_OVR_UIF_vector 0x11 #define TIM2_CAPCOM_CC3IF_vector 0x10 #define TIM3_CAPCOM_CC3IF_vector 0x12 #define TIM2_CAPCOM_CC1IF_vector 0x10 #define TIM2_CAPCOM_TIF_vector 0x10 #define TIM3_CAPCOM_TIF_vector 0x12 #define TIM3_CAPCOM_CC1IF_vector 0x12 #define TIM3_CAPCOM_CC2IF_vector 0x12 #define TIM2_CAPCOM_CC2IF_vector 0x10 #define I2C_SB_vector 0x15 #define I2C_ADDR_vector 0x15 #define I2C_ADD10_vector 0x15 #define I2C_STOPF_vector 0x15 #define I2C_BTF_vector 0x15 #define I2C_OVR_vector 0x15 #define I2C_RXNE_vector 0x15 #define I2C_TXE_vector 0x15 #define I2C_BERR_vector 0x15 #define I2C_ARLO_vector 0x15 #define I2C_AF_vector 0x15 #define I2C_WUFH_vector 0x15 #define UART2_T_TXE_vector 0x16 #define UART2_T_TC_vector 0x16 #define UART2_R_OR_vector 0x17 #define UART2_R_RXNE_vector 0x17 #define UART2_R_IDLE_vector 0x17 #define UART2_R_PE_vector 0x17 #define UART2_R_LBDF_vector 0x17 #define ADC1_AWS2_vector 0x18 #define ADC1_AWS1_vector 0x18 #define ADC1_AWS0_vector 0x18 #define ADC1_AWS3_vector 0x18 #define ADC1_EOC_vector 0x18 #define ADC1_AWS5_vector 0x18 #define ADC1_AWS6_vector 0x18 #define ADC1_AWS7_vector 0x18 #define ADC1_AWS8_vector 0x18 #define ADC1_AWS9_vector 0x18 #define ADC1_AWDG_vector 0x18 #define ADC1_AWS4_vector 0x18 #define TIM4_OVR_UIF_vector 0x19 #define FLASH_EOP_vector 0x1A #define FLASH_WR_PG_DIS_vector 0x1A
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.