- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: STM32F100/ Capture Compare Unit

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    vielen Dank nochmal für Ihre Mühe. Sie haben mir sehr viel geholfen.

    Ja, der Atolic hat schon Debugger.

    Den Code werde ich gleich testen.
    Danke.

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    das ist ein Rätzel, den ich nie im Leben verstehen würde.
    es funktioniert nicht!
    bei Debugg gehts rein in der If_schleife aber die LEDS leuchten nicht obwohl er bei LED-On steht.

    Bei meinem Versuch er konnte überhaupt die If_schleife nicht ausführen.

    wenn ich andere Programme bedugge, dann leuchten die Leds ganz normal. nur bei diesem Code leuchten sie nicht.

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    Ich hab das Programm (Toggle LED) aus dem EXamble genommen und debuggert. Es hat supper funktioniert.
    Step by step habe ich das Programm erweitert und bei jede Erweiterung habe das Programm erneut debugg um ich sicher zu sein dass die neue erweiterung hat die Funktion von Blinken_Leds nicht beeinflüssen.


    1) habe ich NVIC und Inputcapture hingeschrieben. debuggert--> LEDs leuchten.ok!
    2)danach die VOLTEILE, debuggert---> LEDS leuchten.ok!
    3)RCC-Configuration hingefügt, debuggert-->LEDs leuchten. Ok!
    4) dann das GPIO-MODE habe ich von IPD zu In_Floating geändert,debuggert--->LEDS leuchten nicht!! ok das ist Normal.

    Was ich annormal finde, dass ich den GPIO-MODE auf IPD zurücksetze und trotzdem leuchten die LEDS nicht. warum?

    mehr als diese 4 schritte habe ich and das Programm von LED-Toggle nicht geändert und sie leuchten nicht mehr obwohl sie besitzen den Orginalen Zustand.

    was könnte dahinten stecken????

    Danch habe ich die RCC von AFIO deaktiviert, trotzdem leuchten die LEDS nicht mehr.


    /* Includes */

    #include <stddef.h>
    #include "stm32f10x.h"

    NVIC_InitTypeDef NVIC_InitStructure; <-- das ist die erste 'Änderung, LEDs leuchten noch
    TIM_ICInitTypeDef Input_Capture;
    GPIO_InitTypeDef GPIO_Inity;


    volatile uint32_t INT_Counter = 0;<-- zwite Erweiterung, LEDS leuchten noch
    volatile uint32_t delayCount;



    void RCC_Configuration(void)
    {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); <-- dritte, LEDS leuchten
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);<-- vierte, LEDS leuchten nicht mehr
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    }

    void delayLoop()
    {
    volatile uint32_t delayCount = 1000000;
    while (delayCount > 0)
    {
    delayCount--;
    }
    }


    void GPIO_Setup ()
    {
    GPIO_InitTypeDef GPIO_Inity;
    GPIO_Inity.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_Inity.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Inity.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_Inity);

    GPIO_Inity.GPIO_Pin = GPIO_Pin_1;
    GPIO_Inity.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Inity.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_Inity);
    }


    int main (void)
    {
    uint8_t read_A0 = 0;
    SystemInit();
    GPIO_Setup();


    while (1)
    {

    read_A0 =GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);

    if(read_A0)
    {
    GPIOC->BSRR = GPIO_Pin_8; // LED On
    delayLoop();

    GPIOC->BRR = GPIO_Pin_8; // LED Off
    delayLoop();

    GPIOC->BSRR = GPIO_Pin_9; // LED On
    delayLoop();

    GPIOC->BRR = GPIO_Pin_9; // LED Off
    delayLoop();
    }
    }
    return 0;
    }

  4. #14
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    GPIO_Inity.GPIO_Pin = GPIO_Pin_1;
    GPIO_Inity.GPIO_Mode = GPIO_Mode_IPD;
    Jetzt steht hier Pin A1 auf IPD. Pin A0 wird nicht mehr initialisiert. Kan das die Ursache sein ?

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    Nein, das ist nicht die Ursache.

    Übrigens in dem orginalen Programm (Toggle-LED), das in Exsamble stheht, ist der PA1 als GEPIO-Pin für Port A eingestellt, und nicht Pin0.
    das hat mir aufgefallen, denn laut der Pinlayout (Datasheet) ist der User_Button mit PA.0 verbunden.

    Das Heisst wenn ich im Programm den Pin 1 als GPIO-Pin für User-Button eingebe soll die LEDS nicht leuchten.
    Tatsach ist, dass sie tortz der Änderung von pin0 auf Pin1 und von pin1 auf pin0 leuchten.

    Ist nicht wahnsinnig????
    ich bin Verrückt geworden.

    Ist das Programm 100% prommlemlos bei dir gelaufen????
    Bei mir das programm meldet kein Fehler bei Debugging, aber die LEDS leuchten nicht wenn der User Butoon gedruckt wird.
    Sogra es geht rein in der schleife liest den Befehl das die LEDS einschalten aber die Leds leuchten nicht.

  6. #16
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Es ist scheinbar so, das die Init von portA nicht immer functioniert. Ich habe auch schon erfahren, das beim debuggen und download, nicht alle register von µ gereset werden. Nach eine hard reset (abklemmen Spannung) hat der µ dan wel functioniert.
    Bei den debugger konnen sie auch schon sehen oder den Eingang A0 hoch oder niedrig ist. Auch die initialisierung von Ports kann hier angesehen werden. Bei mir ist das program problemlos gelaufen. Ich habe wel die Abfrage "INT_count==1" gaendert in "INT_count>0", jetzt functioniert das auch bei mehrmals drucken.
    EDIT :
    Ich habe beim zweite Versuch auch das problem das die LEDS nicht leuchten !! Jetzt habe ich wel ein Fehler gefunden in die Init von Ports :
    /************************************************** *****************************/
    void GPIO_Setup ()
    {
    /* LEDs pin (PC.08 and 09) configuration */
    GPIO_Inity.GPIO_Pin =GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_Inity.GPIO_Mode =GPIO_Mode_Out_PP;
    GPIO_Inity.GPIO_Speed =GPIO_Speed_50MHz;

    /* TIM2 PA.0 configuration*/
    GPIO_Inity.GPIO_Mode =GPIO_Mode_AF_PP;// soll ich PULL-Down oder Pull up werwenden wenn der
    // Eingang als Pull-Down Konfiguriert?
    // Der AF weil bei dieser Pin wir der Alternate Function verwendet
    GPIO_Inity.GPIO_Speed =GPIO_Speed_50MHz;
    GPIO_Inity.GPIO_Pin =GPIO_Pin_0;

    GPIO_Init(GPIOA, &GPIO_Inity);
    GPIO_Init(GPIOC, &GPIO_Inity);

    }
    Da wird erst eine structure fur Port C gefullt, und dan wieder ueberschrieben für Port A !! Damit wirden Port A und Port C als AF_PP definiert !! Einfach die Zeile "GPIO_Init(GPIOA, &GPIO_Inity);" nach oben verschieben, unten den declarierung von der Structure von Port A !! Dann hat er es bei mir wieder functioniert.
    Geändert von RP6conrad (17.07.2011 um 12:32 Uhr)

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    Doch du hast Recht.
    Dein letztes Tipp war echt Goldig.
    Es funktioniert endlich!!!!!!!!!!!!

    Man! wie sollte ich als Anfänger darauf kommen???
    Ohne dein Tipe werde ich es nicht entdecken.

    Vielen Dank.

    Um diese harte Lektion nicht zu vergessen, möchte ich gerne den Grund dafür verstehen.
    Kannst du bitte das erkklären?

    LG

  8. #18
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Das intialisieren von µ ist eigentlich bestimmte register fullem mit die richtige Dateien. Um das zu erleichteren hat ST schone Librarys geschrieben, womit al diese Initialisierungen gemacht werden konnen. Fast alle Functionen nutzen dabei "Structures". Ein Structure ist ein Datensatz in C, welche man selbst zusammenstellen kan. Beispiel : In die TIM library ist diesen Structure programmiert :
    Code:
    /** 
      * @brief  TIM Time Base Init structure definition
      * @note   This sturcture is used with all TIMx except for TIM6 and TIM7.    
      */
    typedef struct
    {
      uint16_t TIM_Prescaler;         /*!< Specifies the prescaler value used to divide the TIM clock.
                                           This parameter can be a number between 0x0000 and 0xFFFF */
      uint16_t TIM_CounterMode;       /*!< Specifies the counter mode.
                                           This parameter can be a value of @ref TIM_Counter_Mode */
      uint16_t TIM_Period;            /*!< Specifies the period value to be loaded into the active
                                           Auto-Reload Register at the next update event.
                                           This parameter must be a number between 0x0000 and 0xFFFF.  */ 
      uint16_t TIM_ClockDivision;     /*!< Specifies the clock division.
                                          This parameter can be a value of @ref TIM_Clock_Division_CKD */
      uint8_t TIM_RepetitionCounter;  /*!< Specifies the repetition counter value. Each time the RCR downcounter
                                           reaches zero, an update event is generated and counting restarts
                                           from the RCR value (N).
                                           This means in PWM mode that (N+1) corresponds to:
                                              - the number of PWM periods in edge-aligned mode
                                              - the number of half PWM period in center-aligned mode
                                           This parameter must be a number between 0x00 and 0xFF. 
                                           @note This parameter is valid only for TIM1 and TIM8. */
    } TIM_TimeBaseInitTypeDef;
    Um diesen Structure zu nutzen machne wir erst eine "Variable Name" das diesen Structure hat : 'TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;"
    Was men jetzt macht bei Init ist diese Structure erst fullen mit die richtige Daten, und dan wird mit eine Function " TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);" diesen Structure genutzt um alle Register zu setzen.
    Wen wir noch eine 2den Timer intialisieren mochte, konnen wir die gleiche "Variable Name" nutzen, und ein zweite mal diesen Structuren mit daten fullen.
    Die Daten von erste Mal werden dan ueberschrieben, aber das ist unwichtig, da wir schon alle Daten in register kopiert sind bei aufrufen von " TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);"
    Die Reihenfolge ist naturlich sehr wichtig !! So, erst die Structure fullen mit Daten, dan die Init Function aufrufen, dan wen notwendig wieder fullen mit Daten für eine Zweite Timer, und dan wieder die Init Function aufrufen. Ich hffe das ich jetzt en bischen Klarheit geschafft haben in diese Materie.

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    Vielen Danke für die Erklärung.

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. ISR per Output Compare funktioniert nicht wie gewünscht
    Von Sebastian132 im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 24.07.2006, 12:22
  2. Fragen zu Compare -> Timer
    Von Rage_Empire im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 21.11.2005, 19:35
  3. Problem mit Timer1 und Compare...
    Von Murus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 12.11.2005, 17:34
  4. Compare Register
    Von chouifi im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 31.10.2005, 14:47
  5. Wie Compare Register Werte sicher ändern?
    Von Werner_Just im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 22.04.2005, 15:29

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests