PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega32, PORTC pullup will einfach nicht!?



-schumi-
29.05.2012, 07:51
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):

#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:

#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)

021aet04
29.05.2012, 08:08
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

-schumi-
29.05.2012, 09:17
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):

/* 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^^

021aet04
29.05.2012, 09:25
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

-schumi-
29.05.2012, 09:32
Verwendest du den Port nur für die Taster?
Ne, an dem Port hängt auch noch ein LCD, das funzt super. Das LCD wird aber vor den Tasten initialisiert, also das macht nicht wieder alles kaputt


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:

TAST_PORT |= TAST_1 | TAST_2;
Mit "#define TAST_PORT PORTC" ergibt das:

PORTC |= TAST_1 | TAST_2;
#define TAST_1 ( PIN 0)

PORTC |= ( PIN 0) | TAST_2;
#define TAST_2 ( PIN 1)

PORTC |= ( PIN 0) | ( PIN 1);
#define PIN 1<<

PORTC |= ( 1<< 0) | ( 1<< 1);

Müsste doch gehen??

021aet04
29.05.2012, 10:10
Verwendest du den Port nur für die Taster?
Ne, an dem Port hängt auch noch ein LCD, das funzt super. Das LCD wird aber vor den Tasten initialisiert, also das macht nicht wieder alles kaputt
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

-schumi-
29.05.2012, 10:40
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 :)

#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^^