- LiFePO4 Speicher Test         
Ergebnis 1 bis 8 von 8

Thema: GPIO-Register Ansprechen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Naja,
    1) bei dir wird der gesamte code nur einmal durchlaufen, dann erst wieder nach µC-reset.

    Das übliche Muster für µC-Programme ist sowas wie:
    Code:
    int  main()
    {
    
        init, setup etc.
    
    //-----------------------------------------------------------------------
    // (der folgende Code wird dauernd durchlaufen, bis dass der Tod eintritt)
    //-----------------------------------------------------------------------
        while (1)         
        {
    //   check GPIO
    //   mach dieses oder jenes
        }    
    
    
        return 0;      // reiner formalismus, denn da kommt er eh nie hin
    }
    2)

    da ich deine C-Library nicht kenne, muss ich vermuten, dass diese funktion

    Code:
    read_A0 = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
    ausschliesslich Pin_0 aus dem register liest, also steht danach drin (vermutlich)
    1= nicht gedrückt
    0=gedrückt

    und das kannst du abfragen entweder mit
    Code:
                if (read_A0 == 0x01)      // Pin0=Bit0=1   --> nicht gedrückt
                if (read_A0 == 0x00)      // Pin0=Bit0=0   --> gedrückt
                       bei nur einem Bit ist das gleichbedeutend mit
                if (read_A0)                 //  nicht gedrückt  ( read_A0 <> 0 )
                if (!read_A0)                //  gedrückt         ( read_A0  == 0 )
    würde bei deinem Code dann insgesamt heissen:

    Code:
    int main (void)
    {
         uint8_t read_A0 = 0;         
         SystemInit();
         GPIO_Setup();
    
         while (1)
         {
                read_A0 = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);     
                if (!read_A0)                          //   = 0  => gedrückt
                {
                       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();
                }     
         }         // while() schleife wiederholen
    
         return 0;    
    }
    verwirrt ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    vielen Dank!! endlich funktioniert.
    mal andere Frage.

    Möchte jetzt gerne so probieren, dass die LEDS nach 3-mal Drucken leuchten.
    Dafür habe ich ein Register erstellt der immer beim Betätigung des Buttos einmal nach Links verschoben wird.
    Erst wenn der Register den Wert 0x04 erreicht, sollen die LEDS Leuchten.

    Bei Debugg läuft es wie geplannt, super!.
    Nun Drucke ich zum ersten mal den Button leuchten die LEDS sofort.
    was ist jetzt? simuliert der Debugg das Code falsch oder widerspricht das Code dem Debugg?

    Könntest du mir bitte sagen wo liegt ds Problem.!!!

    Allerdings kann ich Timer/Interrupt dafür einsetzen, aber möchte ich schritt für schritt steigen.

    Beste Grüße.


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


    while (1)
    {

    read_A0 =GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);



    if(read_A0 == 0x01)

    {

    counter= (1 << counter);
    //counter= (1 >> counter);
    }

    if (counter== 0x4)
    {
    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();

    counter = 0;
    }

    }
    return 0;
    }

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    1) Du darfst nur dann das TastenBit auswerten, wenn es sich geändert hat (sonst shiftest du ja bei jeder schleife).
    dazu brauchst du (z.B) eine Variable
    read_A0_old

    2) der anfangswert beim shiften muss "counter=1" sein (nuller shiften ist sinnlos) und abfragen musst du auf "8"

    und dann der relevante Code-Teil:

    Code:
    counter = 1;
    
    while (1)
    {
          read_A0 =GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
          if(read_A0 != readA0_old)
          {
                if(read_A0 == 0x01)
               {
                     counter <<= 1;      // einmal nach links
               }
               read_A0_old = read_A0;          // merken (so oder so)
               if (counter== 0x8)
              {
                         //........lichtspiele...........
                         counter = 1;      // ! anfangswert
              }
        }
    }
    Geändert von PicNick (13.07.2011 um 10:53 Uhr)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    07.07.2011
    Beiträge
    35
    vielen Dank.
    ich bin jetzt bei Capture Compare Unit.

Ähnliche Themen

  1. Register ansprechen ->
    Von peterbauer im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 3
    Letzter Beitrag: 03.03.2009, 18:49
  2. Servo über GPIO mit PWM an RN-Control ansteuern (Frequenz ?)
    Von Chattychan im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 23.07.2007, 10:53
  3. Register
    Von Exodus im Forum Assembler-Programmierung
    Antworten: 4
    Letzter Beitrag: 10.07.2006, 11:09
  4. Interne Register und Register in SRAM
    Von FoCus im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 27.07.2005, 12:06
  5. Register von einem PIC mit einem Atmel direkt ansprechen ...
    Von klucky im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 12.06.2005, 22:20

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad