- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 7 von 7

Thema: Atmega32, PORTC pullup will einfach nicht!?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449

    Atmega32, PORTC pullup will einfach nicht!?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    ich versteh hier grad nicht warum die PullUps am PORTC des Atmega32 sich nicht aktivieren lassen. Bei den Fuses ist Jtag ausgeschaltet (Im AVR8BurnOMat: Kein Haken bei Jtagen.

    Der Code (Tast.h):
    Code:
    #ifndef _TAST_h_
    #define _TAST_h_
    
    void TAST_INIT (void);
    char TAST1 (void);
    char TAST2 (void);
    
    #define TAST_PORT    PORTC
    #define TAST_DDR    DDRC
    #define TAST_PIN    PINC
    #define TAST_1        ( PIN 0)
    #define TAST_2        ( PIN 1)
    #define PIN            1<<
    
    #endif
    Tast.c:
    Code:
    #include "TAST.h"
    #include <avr/io.h>
    
    void TAST_INIT (void)
    {
        TAST_DDR &= ~(TAST_1 | TAST_2);            // PC0 und PC1 auf Eingang
        TAST_PORT |= TAST_1 | TAST_2;               // PC0 und PC1 Pullups aktivieren
    }
    
    char TAST1 (void)
    {
        return (TAST_PIN&TAST_1)&&1;
    }
    
    char TAST2 (void)
    {
        return (TAST_PIN&TAST_2)&&1;
    }
    Mein Hauptprobramm ruft jetzt erst TAST_INIT() auf, und stellt dann die Rückgabewerte von TAST1() und TAST2() auf einem LCD dar. Das funktioniert auch hervorragend.

    Meine Taster sind jetzt auf GND verbunden. D.h. unbetätigt (Schließer) sollte eine 1 rauskommen, betätigt eine 0. Wenn ich den Taster nicht drücke, zeigt er 1 an. Wenn ich den Taster drücke 0. Wenn ich den Taster wieder loslasse zeigt er die 1 erst wieder nach ca. 5 sec an. (Durch die Innenbeschaltung fließt ja etwas Strom in den Eingang -> quasi extrem hochohmiger Pullup).

    Und wenn ich die 2 Pins berühre springen dir 0er und 1er nur so rum.

    -> Offene Eingänge -> Pullups gehen nicht.

    Aber warum??

    Viele Grüße und vielen Dank schonmal
    -schumi-

    PS: Am PORTB hat das mit den Pullups auf Anhieb perfekt funktioniert (Dort werden Drehgeber ausgewertet, das oben sind die Taster in den Drehgebern)

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    In der Tast.h hast du "#define TAST_1 ( PIN 0)" geschrieben. Sollte das nich eher so sein "#define TAST_1 PC0" ? Klammer entfernen und statt PIN 0 PC0 schreiben.

    MfG Hannes
    Geändert von 021aet04 (29.05.2012 um 10:57 Uhr)

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449
    Das hängt mit dem "#define PIN 1<<" zusammen, somit ergibt ein ( PIN 0) ein (1<<0) = 1.

    Deine Schreibweise ist natürlich eleganter, aber meine funktioniert auch (Tut sie auch bei einigen anderen Bibliotheken die ich geschrieben hab)

    [EDIT]

    Ich hab nochmal nachgeguckt, deine Schreibweise geht nicht, weil (aus iom32.h):
    Code:
    /* PORTC */
    #define PC7     7
    #define PC6     6
    #define PC5     5
    #define PC4     4
    #define PC3     3
    #define PC2     2
    #define PC1     1
    #define PC0     0
    Somit würde nur gehen:
    ( PIN PC0) bzw. (1<<PC0)

    Aber das ändert auch nichts an dem Problem^^
    Geändert von -schumi- (29.05.2012 um 10:35 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Dann hast du selbst einen Fehler eingebaut. Du müsstest dann z.B. " PIN TAST_1 " schreiben. Du hast in der C-Datei nur TAST_1 bzw _2 geschrieben ohne PIN.

    Dein Aufbau ist sehr kompliziert. Du hast auch geschrieben z.B. "#define TAST_PORT PORTC". Verwendest du den Port nur für die Taster?

    MfG Hannes

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449
    Verwendest du den Port nur für die Taster?
    Ne, an dem Port hängt auch noch ein LCD, das funzt super. [EDIT] Das LCD wird aber vor den Tasten initialisiert, also das macht nicht wieder alles kaputt[/EDIT]

    Dann hast du selbst einen Fehler eingebaut. Du müsstest dann z.B. " PIN TAST_1 " schreiben. Du hast in der C-Datei nur TAST_1 bzw _2 geschrieben ohne PIN.
    ich nimm jetz mal als Beispiel:
    Code:
    TAST_PORT |= TAST_1 | TAST_2;
    Mit "#define TAST_PORT PORTC" ergibt das:
    Code:
    PORTC |= TAST_1 | TAST_2;
    #define TAST_1 ( PIN 0)
    Code:
    PORTC |= ( PIN 0) | TAST_2;
    #define TAST_2 ( PIN 1)
    Code:
    PORTC |= ( PIN 0) | ( PIN 1);
    #define PIN 1<<
    Code:
    PORTC |= ( 1<< 0) | ( 1<< 1);
    Müsste doch gehen??
    Geändert von -schumi- (29.05.2012 um 10:41 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Verwendest du den Port nur für die Taster?
    Ne, an dem Port hängt auch noch ein LCD, das funzt super. [EDIT] Das LCD wird aber vor den Tasten initialisiert, also das macht nicht wieder alles kaputt[/EDIT]
    Damit habe ich nur gemeint das du an dem Port bestimmt nicht nur 2 Tasten angeschlossen hast. Da du auch noch ein LCD angeschlossen hast passt der Name des Ports eigentlich nicht (LCD ist keine Taste). Wenn du nur Tasten/Schalter/o.Ä angeschlossen hättest würde der Name passen.



    So wie du es geschrieben hast sollte es funktionieren wenn, du hast recht. Hast du schon mit "PORTC |= (1<<PC0);" versucht? Eventuell übersetzt der Compiler das irgendwie nicht richtig.

    Zur Leichteren Lesbarkeit könntest du auch "#define TAST_1 (1<<PC0)" schreiben.

    PS: Die Ports sind Standartmäßig als Eingang definiert.

    MfG Hannes

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    30
    Beiträge
    449
    Da du auch noch ein LCD angeschlossen hast passt der Name des Ports eigentlich nicht (LCD ist keine Taste)
    Das LCD hat ja auch wieder seine eigene Bibliothek
    Code:
    #define    LCD_DDR        DDRC
    #define LCD_PORT    PORTC
    #define LCD_PIN        PINC
    #define    LCD_EN        ( PIN 3)
    #define LCD_RS        ( PIN 2)
    #define LCD_D0        ( PIN 4)
    #define LCD_D1        ( PIN 5)
    #define LCD_D2        ( PIN 6)
    #define LCD_D3        ( PIN 7)
    Hast du schon mit "PORTC |= (1<<PC0);" versucht?
    Jep. Habs auch schon mit "PORTC |= 0b00000011" versucht (in der Tast.c), hat aber auch nicht geholfen...

    PS: Die Ports sind Standartmäßig als Eingang definiert.
    Ich weis Schadet aber trotzdem nicht das nochmal explizit ins Programm zu schreiben^^

Ähnliche Themen

  1. UART/USART vom ATMega32 will einfach gar nicht
    Von Bamboocha im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 04.06.2010, 11:21
  2. Input PortC auser pin3/2 mit internal Pullup
    Von magic33 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 15.10.2008, 09:13
  3. ATMega32 Portc.2 und 3 ständig auf High
    Von strunz im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 11.05.2007, 14:29
  4. Verstehe Pullup nicht
    Von Murus im Forum AVR Hardwarethemen
    Antworten: 19
    Letzter Beitrag: 12.09.2005, 22:32
  5. Relais an portc (mit JTAG disable) schaltet nicht
    Von Adam im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 17.11.2004, 18:15

Berechtigungen

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

LiFePO4 Speicher Test