- Labornetzteil AliExpress         
Ergebnis 1 bis 6 von 6

Thema: PortD als Eingang mit Pullup bei Atmega88 geht nicht!?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    16.11.2006
    Beiträge
    12

    PortD als Eingang mit Pullup bei Atmega88 geht nicht!?

    Anzeige

    Powerstation Test
    Hallo,

    ich möchte den PortD des Atmega88 als Eingang mit den internen Pullups nutzen. Das scheint allerdings nicht so einfach zu sein.

    Dies ist mein C Code den ich benutze um die Ein-Bzw. Ausgänge zu stellen:
    Code:
    	//Ausgänge einstellen
    	DDRC |= ((1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5));
    	DDRB |= ((1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB4) | (1<<DDB5));
    	DDRD |= ((1<<DDD7) | (1<<DDD6) | (1<<DDD5));
    	DDRD &= (~((1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0)));
    
    	//Pullupwiderstände der Taster
    	PORTD |= ((1<<PD0) | (1<<PD1) | (1<<PD2) | (1<<PD3) | (1<<PD4));
    	PORTB |= (1<<PB6);
    Ich weiß dass es teilweise doppelt ist und manche Klammern zu viel sind - aber ich hab alles schon ausprobiert - an den Bitoperatoren liegt es nicht.

    Effekt:
    PIND0 zieht den Pullup auf ca. 2,5V (von 3,3 VCC) also eigentlich schon komisch. Der Pin funktioniert aber ganz normal.

    PIND1-4 ziehen gar nicht hoch - liegen also bei 0 V und funktionieren dementsprechend auch gar nicht.

    PINB6 zieht auf die 3,3 V hoch und funktioniert ganz normal.

    Es scheint also ein Problem mit dem PORTD zu geben.

    Ich finde allerdings keine Lösung - ich habe es auch schon mit einem Atmega168 versucht, der dem 88 ja entspricht aber hier ist es das selbe Phänomen.

    Laut Datenblatt sollten die Eingänge aber normal nutzbar sein - ich finde auch nichts dass man die Sonderfunktionen deaktivieren muss.

    Wie kann ich den PortD nutzen?

    Gruß
    Stomper

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Was hast du sonst noch aktiviert, MCUCR ?
    Die Pin sind nicht beschalten? IN der Simulation macht er es richtig.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Schnell noch mal das Testboard mit einem Mega88 probiert, alle PullUp aktiv.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    54
    Beiträge
    524
    Hallo,

    zeig auch mal wie du die Ausgänge von PortD ansprichst. Nicht das du dir da deine Pullups ein paar Zyklen später wieder abschaltest.

    Gruß

    Jens

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    16.11.2006
    Beiträge
    12

    DAANKE!

    OHHH MANN... danke Leute ich hab den Fehler.

    "Simulation" und "Paar Zyklen weiter wieder abschalten" waren die Stichwörter die mich dazu getrieben haben alles nochmal durchzusehen und zu simulieren.

    Ergebnis: Aus noch unerklärlichen Gründen schalten die Pullups ab, sobalt ich die Funktion DrawDisplay aufrufe (selbst geschriebene Funktion). Als ich sie durchgesehen habe, fand ich folgendes:
    Code:
    PORTD = (1<<PIND7);
    Und dann wars mir klar

    Habs jetzt in den richtigen Operator |= geändert und jetzt läuft alles.

    Also danke für die Hinweise.

    Gruß
    Stomper

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Hallo Stomper,

    ich bin ja selbst noch nicht fit in C. Der Code in Deinem ersten Posting ist ja richtig. Für mich ist der nur nicht sehr leserlich. Abgesehen davon, dass Du Port C und B aufsteigend indizierst und Port D absteigend.

    Die Portinitialisierung sieht bei mir anders aus, wenn ich einen kompletten Port initialisiere, bei einzelnen Bits mach ich es wie Du. Meine Initialisierung funktioniert natürlich - sinngemäß - ebenso wie Deine. Überleg mal bitte, ob Du das vielleicht übersichtlicher findest:
    Code:
    /* Vorgesehene/belegte Anschlüsse am (ATMega168)-L168:
                   ==================                     
               /RESET   1   28   PC5,(SCL)             
            RxD,(PD0)   2   27   PC4,(SDA)             
            TxD,(PD1)___3   26___PC3                   
                  PD2   4   25   PC2, LCD 24x2, pin for RS line
                  PD3   5   24   PC1, LCD 24x2, pin for RW line
                  PD4___6   23___PC0, LCD 24x2, pin for ENABLE line
                  VCC   7   22   GND                   
                  GND   8   21   AREF                  
           XTAL1  PB6___9   20___VCC                   
           XTAL2  PB7  10   19   PB5, Eingang/Taster = SCK gegen GND
                  PD5  11   18   PB4, LCD 24x2, pin for 4bit data bit 0
                  PD6__12   17___PB3, LCD 24x2, pin for 4bit data bit 1
                  PD7  13   16   PB2  LCD 24x2, pin for 4bit data bit 2
                  PB0  14   15   PB1  LCD 24x2, pin for 4bit data bit 3       */
    /* ============================================================================== */
    
    
    .... das oben steht im Codeheader meines Mainmoduls, im main fängt es etwa so an ....
    
    
    // Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups aktivieren (1)
    // Port B und Port C für LCDisplay angepasst:
      DDRB  = 0b00011110;   // siehe aktuelle Anschlussbelegung oben
            //    A  => PB5=SCK kann als Tastereingang benutzt werden, PullUpB5 = high
      PORTB = 0b11100001;   //    und Port/Pull Ups (1)  aktivieren
                            
      DDRC  = 0b01111111;   // Kein PC7-Pin bei m168PU, PortC bedient im L168
      PORTC = 0b00000000;   //   die 3 LCD-Steuerbits
                            
      DDRD  = 0b11110000;   // Nur RxD und TxD aktiv
      PORTD = 0b00001111;   //    Pull Ups aktivieren
    Wie gesagt, es sind persönliche Ansichten und es ist nur Kosmetik. Die Anschlussbelegung im Code ist natürlich eher überflüssig, ich mache es trotzdem so. Ich finde meine Art der Portinitialisierung übersichtlicher und je übersichtlicher, desto weniger Fehlermöglichkeit *gggg*.

    Viel Erfolg weiterhin.
    Ciao sagt der JoeamBerg

Berechtigungen

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

12V Akku bauen