- 3D-Druck Einstieg und Tipps         
Seite 7 von 7 ErsteErste ... 567
Ergebnis 61 bis 66 von 66

Thema: projekt: asuro sucht selbständig seine ladestation

  1. #61
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Anzeige

    Powerstation Test
    hi m.a.r.v.i.n,

    bin ich da auf dem richtigen weg?
    Code:
    int LED_PollSwitch (void)
    {
    int yellow, blue, red;
    
    //makrodefinitionen der taster
      #define LCD_KEY_YELLOW   (PIND&(1<<PD6))
      #define LCD_KEY_RED      (PIND&(1<<PD2))
      #define LCD_KEY_BLUE     (PINB&(1<<PB3))
    
    
    //taster pins auf input schalten
      TCCR2 = (1 << WGM21) | (1 << CS20);   //  OC2 PIN deaktivieren, aber 36kHz Timer weiterlaufen lassen (z.B. für Sleep(void) ) 
    
      DDRD &= ~((1<<PD2)|(1<<PD6));      // roten und gelben Taster als Eingang definieren 
      DDRB &= ~(1<<PB3);            // blauen Taster als Eingang definieren 
    
    //taster abfragen
    
    yellow=(LCD_KEY_YELLOW);
    red=(LCD_KEY_RED);
    blue=(LCD_KEY_BLUE);
    
    //taster pins auf output schalten
    
     TCCR2 = (0 << WGM21) | (1 << CS20);   OC2 PIN aktivieren
    
     DDRD &= ~((0<<PD2)|(0<<PD6));      // roten und gelben Taster als ausgang definieren 
     DDRB &= ~(0<<PB3);            // blauen Taster als ausgang definieren 
    
    
    //tasterwert zurückgeben
    
    ???
    
    
    }
    gruß inka

  2. #62
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo inka,

    nicht so ganz, aber fast. So könnte es vielleicht gehen. Ich kann das aber erst heute abend testen.

    Code:
    #include "asuro.h"
    #include "lcd.h"
    #include "i2c.h"
    
    //makrodefinitionen der taster
    #define LCD_KEY_YELLOW   (1<<PD6)
    #define LCD_KEY_RED      (1<<PD2)
    #define LCD_KEY_BLUE     (1<<PB3)
    
    int LCDPollSwitch (void)
    {
    int key = 0;
    
    //taster pins auf input schalten
      TCCR2 = (1 << WGM21) | (1 << CS20);   //  OC2 PIN deaktivieren, aber 36kHz Timer weiterlaufen lassen (z.B. für Sleep(void) )
    
      DDRD &= ~((1<<PD2)|(1<<PD6));      // roten und gelben Taster als Eingang definieren
      DDRB &= ~(1<<PB3);            // blauen Taster als Eingang definieren
    
    //taster abfragen
    
      key  |= (PIND&LCD_KEY_YELLOW);
      key  |= (PINB&LCD_KEY_RED);
      key  |= (PINB&LCD_KEY_BLUE);
    
    //taster pins auf output schalten
    
      TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
    
      DDRD &= ~((1<<PD2)|(0<<PD6));      // roten und gelben Taster als ausgang definieren
      DDRB &= ~(1<<PB3);                 // blauen Taster als ausgang definieren
    
    
    //tasterwert zurückgeben
    
    return key;
    }
    
    int main(void)
    {
      int keys;
    
      Init();
      InitI2C();
      InitLCD();
    
      while(1)
      {
        keys = LCDPollSwitch();
        if (keys & LCD_KEY_YELLOW)
        {
            PrintSetLCD(0,0,"Yellow");
        }
        else if (keys & LCD_KEY_RED)
        {
            PrintSetLCD(0,0,"Red");
        }
        else if (keys & LCD_KEY_BLUE)
        {
            PrintSetLCD(0,0,"Blue");
        }
        Msleep(1000);
      }
      return 0;
    }

  3. #63
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi m.a.r.v.i.n,

    danke, hast mir sehr geholfen. habe ein bischen mit dem code experimentiert, folgendes noch geändert:

    key |= (PIND&LCD_KEY_RED); //PINB in PIND

    und bei der umstellung in outputpins:

    DDRD &= ~((0<<PD2)|(0<<PD6));
    DDRB &= ~(0<<PB3);

    überall 0 eingesetzt...
    Jetzt kann es wieder ein bischen weitergehen...

    btw:
    nicht so ganz, aber fast.
    darüber habe ich mich richtig gefreut. Wenn ich ein paar monate zurückdenke, heute konnte ich sogar die meisten änderungen von Dir nachvollziehen und verstehen...
    gruß inka

  4. #64
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo inka,

    key |= (PIND&LCD_KEY_RED); //PINB in PIND
    das stimmt natürlich.

    DDRD &= ~((0<<PD2)|(0<<PD6));
    DDRB &= ~(0<<PB3);
    Das stimmt so leider nicht. Zum löschen von Bits wird eine 1 an die entsprechende Stelle geschoben. Dann wird das ganze bitweise negiert und mit dem aktuellen Wert UND-verknüft.

    Assonsten funtkioniert das Programm bei mir ganz gut (Wenn man die Wartezeit auf 100ms verkürzt).

  5. #65
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi m.a.r.v.i.n,
    so stand es in deinem code:
    DDRD &= ~((1<<PD2)|(1<<PD6)); // roten und gelben Taster als Eingang definieren
    DDRB &= ~(1<<PB3); // blauen Taster als Eingang definieren

    DDRD &= ~((1<<PD2)|(0<<PD6)); // roten und gelben Taster als ausgang definieren
    DDRB &= ~(1<<PB3); // blauen Taster als ausgang definieren
    ist es nicht so, dass ich bei allen drei pins mit einer "1" auf eingang schalte und mit einer "0" auf ausgang?

    bei dem hier:

    DDRD &= ~((0<<PD2)|(0<<PD6));
    DDRB &= ~(0<<PB3);
    wie kann ich an der hardware erkennen, dass es nicht richtig ist? Also dass der pin 2 und 3 - da habe im gegensatz zu deiner version ja die nullen eingesetzt - nun nicht als ausgänge definiert sind? Eine (irgendwelche) fehlermeldung beim compilieren, oder eine fehlfunktion konnte ich nicht beobachten...

    Zum löschen von Bits wird eine 1 an die entsprechende Stelle geschoben. Dann wird das ganze bitweise negiert und mit dem aktuellen Wert UND-verknüft.
    das verstehe ich nicht: oben im ersten umstellen wird doch mit 3 "1" auf eingang geändert? Oder verwechsle ich da was?
    gruß inka

  6. #66
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo inka,

    ich Schussel. Um die Pins als Ausgang zu schalten, müssen diese natürlich gesetzt werden, nicht gelöscht.

    DDRD |= ((1<<PD2)|(1<<PD6));
    DDRB |= (1<<PB3);
    Zum näheren Verständnis siehe hier:
    http://www.mikrocontroller.net/artic...eiben_von_Bits

    Edit:

    Ob die Ports dann wieder korrekt sind, kann man am einfachsten überprüfen, in dem man in das Programm eine serielle Ausgabe einbaut.

Seite 7 von 7 ErsteErste ... 567

Berechtigungen

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

Solar Speicher und Akkus Tests