- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 32

Thema: SMT32 - Ports konfigurieren, Frage zur C-Syntax

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Haha...super, daß bringt mich doch schon wieder viel weiter. Vielen Dank.

    Was würde ich ohne euch bloß machen...wie hat man sich solches Wissen eigentlich früher ohne Internet angeeignet, wo man noch nichtmal einfach so ein Datenblatt runterladen konnte? Man hat doch sicherlich nicht 1500 Seiten Dokumentation mit der Post vershickt...? Und wenn, dann sicherlich nur an Firmen...

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Man hat doch sicherlich nicht 1500 Seiten Dokumentation mit der Post vershickt...? Und wenn, dann sicherlich nur an Firmen...
    ich könnte mal in den Keller meiner Eltern gehen, mein alter Herr hat auch gern gebastelt und kann ein Lied davon singen bzw. einen Schrank mit Dokumenten nach dir werfen

    damals gabs ja auch noch net soooo komplexe chips, da war 386er PC in Mode
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Zitat Zitat von White_Fox Beitrag anzeigen
    Was würde ich ohne euch bloß machen...wie hat man sich solches Wissen eigentlich früher ohne Internet angeeignet, wo man noch nichtmal einfach so ein Datenblatt runterladen konnte? Man hat doch sicherlich nicht 1500 Seiten Dokumentation mit der Post vershickt...? Und wenn, dann sicherlich nur an Firmen...
    Ich bin seit 1976 beruflich bei den µPs dabei. Da hat sich einiges angesammelt.
    Damals waren die Chips noch wesentlich einfacher und vieles waren noch Datenblätter. Meist waren nur die Programmierunterlagen ein Buch.
    Was man heute in einem einzelnen µC hat, wäre damals eine Leiterplatte, in mindestens der Grösse eines Kuchenblechs gewesen.
    3x 16-Bit Timer gab es in einem 40-Pin Gehäuse. 2x 8-Bit Ports gab es auch in dieser Grösse.

    Doch, damals wurde alles per Post verschickt. Anfangs gab es Datenbücher, die bekam man bis Ende der 70er einfach so zugeschickt, wenn wieder neue aufgelegt wurden, Dazwischen gab es mal ein Datenblatt für neue Chips.
    Als Entwickler musste man auch viel per Telefon nachfragen. Da gab es öfters auch mal Datenblätter für Chips, welche dann gar nie hergestellt wurde. Man hatte deshalb zwangsweise Kontakt mit den Lieferanten und Vertretungen. Als schlauer Entwickler hat man immer zuerst nachgefragt, was überhaupt lieferbar ist.

    TI war z.B. Spezialist im Herstellen von ICs für Grosskunden, welche dann auch frei verkauft wurden. Allerdings wurde der Chip dann nicht mehr produziert, wenn der Grosskunde die Fabrikation eingestellt hat.
    Intel war etwas mühsam mit den Handbüchern. Man hat ein Handbuch bestellt und dann stand vorne drin, welche man noch alle zusätzlich braucht Also zweite Bestellung machen. Mit der dritten Bestellung hatte man dann meist alles nötige zusammen. Das dauerte dann schnell mal 2-3 Wochen.

    Allerdings war damals alles noch übersichtlicher. Bei maximal 64KB Speicherbereich, kannte man seine Bits noch persönlich.

    1976 war die Hobby-Scene noch sehr klein und ie meisten hatten beruflich mit Computern zu tun. Die meisten hatten auch nicht einmal einen Computer um die Software zu entwickeln. Das wurde damals noch von Hand assembliert und als Hex-Code eingetippt (z.B. KIM-1).
    Ein KIM-1 kostet um die CHF 750.- und war ein Schnäppchen. Ein 6502, 1 KB RAM, ein Monitor-Programm, ein paar Timer und 16-Bit I/Os, eine 6-Stellige 7-Seg Anzeige für Adresse und Daten, sowie eine Hex-Tastatur. Wer es sich leisten konnte, konnte auch einen Fernschreiber als Terminal anschliessen.

    Der Apple ][ wurde erst 1977 entwickelt und der IBM-PC kam 1981 auf den Markt.

    Die heutige Technologie und ihre Verbreitung hat erst vor 30-40 Jahren angefangen. Den µP, also eine ganze CPU auf einem Chip, gibt es erst seit 1972. Allerdings war das ursprünglich eine Fehlentwicklung. Bull wollte von Intel einen Chipsatz für ein Terminal. Bei Intel kam man dann auf die Die etwas programmierbares zu machen und entwickelte den 4004, ein 4-Bit Prozessor. Bull war dann aber das Terminal zu langsam und sie wollten die Entwicklung nicht... Also musste Intel den Flop selber vermarkten um die Entwicklungskosten wieder einzuspielen.

    MfG Peter(TOO)

    - - - Aktualisiert - - -

    Zitat Zitat von Ceos Beitrag anzeigen
    damals gabs ja auch noch net soooo komplexe chips, da war 386er PC in Mode
    Zum 80386 selbst, gab es zwei Handbücher von Intel, jeweils 500-1000 Seiten stark. eines behandelte nur die Hardware und das Zweite nur den Befehlssatz.
    Dann gab es noch ein paar zur Programmierung in Assembler und App-Notes.
    Neu beim 80386 war, dass die FPU mit auf dem Chip war. Beim 8086 war die FPU (80387) komplexer als die CPU und entsprechend teuer (so Mitte 80er 500-600 CHF).

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473

    Timer 2 - Interrupt

    Da ich hier bisher viel gute Hilfe bekommen habe, meldi ch mich mal wieder.

    Ich will mit dem Timer2 einen Interrupt generieren, komme aber mit den Registern irgendwie nicht klar.

    Was ich dem Reference-Manual
    http://www.st.com/content/ccc/resour...DM00135183.pdf
    bisher entnehmen konnte war:
    • Autoreload-Register (ARR), enthält den Wert mit dem das Zählregister jedesmal wieder neu geladen wird
    • Prescaler (PSC), Vorteiler
    • Counter-Register (CNT), Zählregister des Timers
    • Controllregister 1/2 (CR1, CR2), verschiedene Einstellungen


    Ich finde zwar die entsprechenden Register- und Bitbezeichnungen in der Headerdatei, aber nur für allgemein für alle Timer. Ich finde keine Definition, wie ich die Register für Timer2 beschreiben kann. Auch wie ich eine Funktion per Interrupt aufrufe ist mir noch nicht ganz klar. Dieses Konstrukt
    Code:
    extern "C" void TIM2_IRQHandler(){
    }
    hab ich so noch nie genutzt. Wie funktioniert das?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Wenn du mit den Registern ein Interrupt-Betrieb für Timer2 konfigurierst, wird die Funktion mit dem Namen TIM2_IRQHANDLER 'automatisch' aufgerufen. Also einfach eine Funktion so definieren:
    Code:
    void TIM2_IRQHandler() {
      // mach was... 
    }
    Ausschnitte aus nem alten Projekt von mir mit nem STM32F107:
    Code:
    // ...
    #include  <stm32f10x.h>     // sfr nach keil 
    #include  "STM32F107_rcc.h"   // strukturen der sfr 
    #include  "STM32F107_gpio.h"   // strukturen der sfr 
    #include  "STM32F107_tim.h"   // strukturen der sfr 
    int main() {
      //...
    
     // Timer 2 für Zeitmessung 
       
      #define VORTEILER_TIM2   ((SystemCoreClock / 10000)-1)   // Teilung auf 10 kHz 
      #define TIM2_PRIO     0x10             // höchste Priorität 
      #define TIM2_INTERV    1              // 1ms 
      #define VORLADEWERT_TIM2   (TIM2_INTERV*10 - 1)   
     
      RCCst->APB1ENR.tim2 = 1;   // Takt für Timer 2 freigeben 
      TIM2st->DIER.uie    = 1;   // Freigabe: Überlauf von Zähler löst Interrupt aus 
      TIM2st->CR1.dir     = 1;   // Zähler zählt runter 
      TIM2st->PSC         = VORTEILER_TIM2; 
      TIM2st->ARR         = VORLADEWERT_TIM2; 
      TIM2st->CNT         = VORLADEWERT_TIM2; 
      TIM2st->CR1.cen     = 0;   // Timer 2 Zählfreigabe 
      NVIC->IP[2]         = TIM2_PRIO;  // Priorität  
         
      NVIC->ISER[TIM2_IRQn / 32] = 1 <<(TIM2_IRQn % 32); // ISR für Zeitmessung setzen 
      // ...
    }
    void TIM2_IRQHandler(void)        // wird jede ms aufgerufen  
    { 
      TIM2st->SR.uif = 0; 
      zaehler_ms++; 
    }
    Geändert von Sisor (02.07.2016 um 15:31 Uhr)

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Hm...die Bibliothek , die ES nutzt, scheint da etwas anders mit Interrupts umzugehen. TIM2_IRQHandler ist da nur ne stinknormale Funktion.

    Hier ist mal der Code, den ich bisher gebastelt habe.
    Code:
    void TIM2_IRQHandler(void){
      printf("TIM2 Interrupt\n");
    }
    
    void configTakt(){
      RCC->CFGR |= RCC_CFGR_PPRE1_DIV16;        //Takt für APB1 auf 1MHz runterteilen
    }
    
    void configTimer2(){
      RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;       //Takt für Tim2 freigeben
      TIM2->PSC = 10000;                        //Prescaler 10.000
      TIM2->CR1 |= TIM_CR1_CEN;                 //Timer aktivieren
    }
    
    void main(void){
      configTakt();
      configTimer2();
      configLed();
      configButton();
      printf("Einstellung fertig\n");
    
      while(1){
      }
    }

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Das Anschubsen der Serviceroutine muss noch enabled werden:
    Code:
    NVIC->ISER[TIM2_IRQn / 32] = 1 <<(TIM2_IRQn % 32); // ISR für Zeitmessung setzen

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Hallo Sisor

    Erstmal vielen Dank.

    Mir ist die Bedeutung in deiner Codezeile zwar noch nicht ganz klar, aber ich habs einfach mal kopiert und der Kompiler meckert nicht.

    So richtig will es aber immer noch nicht. Hier mal der komplette Code. Muß ich mit dem NVIC noch irgendwas machen?
    Und woher weiß der Kompiler, daß Timer-Interrupts in TIM2_IRQHandler abgearbeitet werden sollen? So richtig ist mir das
    auch nicht klar. Ich hab das aus einem Beispiel, finde in der STM32F4xx aber nichts dazu. (Leider auch nichts ähnliches).

    Mir reicht für den ersten Test eine Ansage vom Debugger in der ISR.

    Code:
    void TIM2_IRQHandler(void){
      printf("TIM2 Interrupt\n");
    }
    
    void configLed(){
      RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;      //Taktversorgung Port A
      GPIOA->MODER |= (GPIO_MODER_MODER5_0);    //A5 => Ausgang
      GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_5);     //A5 0> Push-Pull
      GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR5);     //A5 ohne Pullup-Pulldown
    }
    
    void configButton(){
      RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;      //Taktversorgung Port C
      GPIOC->MODER |= GPIO_MODER_MODER0_0;      //C13 => Eingang
      GPIOC->PUPDR |= GPIO_PUPDR_PUPDR13_1;     //C13 => Pulldown einschalten
    }
    
    void configTakt(){
      RCC->CFGR |= RCC_CFGR_PPRE1_DIV16;        //Takt für APB1 auf 1MHz runterteilen
    }
    
    void configTimer2(){
      RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;       //Takt für Tim2 freigeben
      TIM2->PSC = 10000;                        //Prescaler 10.000
      TIM2->CR1 |= TIM_CR1_CEN;                 //Timer aktivierent
    
      TIM2->DIER |= TIM_DIER_TIE;                //Trigger Interrupt enable
      NVIC->ISER[TIM2_IRQn / 32] = 1 <<(TIM2_IRQn % 32);
      printf("Timer2 Konfi beendet\n");
    }
    
    void configNVIC(){
    }
    
    void main(void){
      configTakt();
      configTimer2();
      configLed();
      configButton();
      printf("Einstellung fertig\n");
      
      while(1){ //Halteschleife da da Debug-Fenster sonst mit Knopf-gedrückt-Meldungen geflutet wird
      }
    
      while(1){
        if(!(GPIOC->IDR & GPIO_IDR_IDR_13)){
          GPIOA->BSRR |= GPIO_BSRR_BS_5;            //Ausgang A5 setzen
          printf("Knopf gedrückt\n");
        }
        else{
          GPIOA->BSRR |= (GPIO_BSRR_BR_5);          //Ausgang A5 zurücksetzen
          printf("Knopf nicht gedrückt\n");
        }
      }
    }

Ähnliche Themen

  1. Syntax-Frage -> writeString(char *string)
    Von Furzgas im Forum Robby RP6
    Antworten: 13
    Letzter Beitrag: 31.12.2009, 08:06
  2. Frage zum Ansteuern von Ports/Programmierfrage
    Von Geimel im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 26.01.2007, 22:29
  3. Kurze Syntax Frage
    Von Brantiko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 18.01.2007, 18:58
  4. Frage zum Programmieren der Ports
    Von Geimel im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 07.08.2006, 19:29
  5. kleine Frage zur Syntax
    Von freddy0815 im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 07.02.2005, 14:19

Berechtigungen

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

12V Akku bauen