Forum: Mikrocontroller und Digitale Elektronik interrupt capcom beispiel für stm8s


von Mischa T. (misha_p)


Lesenswert?

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

von IsobarX (Gast)


Lesenswert?

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