www.mikrocontroller.net

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


Autor: Mischa Tschaev (misha_p)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: IsobarX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.