Forum: Mikrocontroller und Digitale Elektronik Problem mit Eingang-Ports (ATmega8)


von namenlos (Gast)


Lesenswert?

Hallo ihr,
ich brauche Hilfe mit meinem ATMega8. Ich habe Taster an den PORT D 
angeschlossen, jedoch zeigt sich keine Reaktion bei den LEDs an PORT B, 
die nun teilweise ausgehen sollten. Pullup-Widerstände sind ein, dafür 
habe ich bei den Tastern keine externen Widerstände dran gemacht. Könnt 
ihr mir helfen?
1
#include <avr/io.h>
2
#ifndef F_CPU
3
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
4
#define F_CPU 3686400UL
5
#endif
6
#include <util/delay.h>
7
#include <stdint.h>
8
9
void main() {
10
11
DDRC = 0b00000000;
12
13
DDRB = 0b00001111;
14
DDRD = 0b00000000;
15
PORTD = 0xFF;
16
17
18
_delay_ms(1000);
19
while (1) {
20
_delay_ms(1000);
21
if ( !(PIND & (1<<PIND2))) {
22
  PORTB = 0b00000011;
23
}
24
}
25
26
27
28
}

von Karl H. (kbuchegg)


Lesenswert?

namenlos schrieb:

> ich brauche Hilfe mit meinem ATMega8. Ich habe Taster an den PORT D
> angeschlossen, jedoch zeigt sich keine Reaktion bei den LEDs an PORT B,
> die nun teilweise ausgehen sollten.

Lass mal deine ganze Delays weg und sorg dafür, dass die LED auch dann 
irgendwas machen, wenn der Taster nicht betätigt ist.
1
void main() {
2
 
3
  DDRC = 0b00000000;
4
 
5
  DDRB = 0b00001111;
6
  DDRD = 0b00000000;
7
  PORTD = 0xFF;
8
9
  while (1) {
10
    if ( !(PIND & (1<<PIND2))) {
11
      PORTB = 0b00000011;
12
    }
13
    else
14
      PORTB = 0b00000000;
15
  }
16
}

von namenlos (Gast)


Lesenswert?

Hab es versucht. Es ändert sich leider nichts. Interessant ist aber: 
Wenn man
1
if ( PIND & (1<<PIND2)) {
 statt
1
if ( !(PIND & (1<<PIND2))) {
 schreibt, tritt die If-Bedingung ein.

von Karl H. (kbuchegg)


Lesenswert?

Miss mal mit dem Voltmeter direkt am Prozessorpin nach, ob dort der 
Pegel wechselt.

von namenlos (Gast)


Lesenswert?

Ich habe leider kein Voltmeter. Ich habe aber die Vermutung, das man den 
Prozessor mal irgendwie zurücksetzen müsste, oder so.

von Karl H. (kbuchegg)


Lesenswert?

namenlos schrieb:
> Ich habe leider kein Voltmeter. Ich habe aber die Vermutung, das man den
> Prozessor mal irgendwie zurücksetzen müsste, oder so.


Der wird sowieso nach jedem Programmiervorgang 'zurückgesetzt'. Du bist 
dir doch sicher, dass deine Programmänderungen es auch in den µC 
geschafft haben?


(Wenn du kein Voltmeter hast, dann richte dir wenigstens eine einzelne 
LED mit Vorwiderstand als 'Hilfs-Spannung_da-Spannung_nicht_da' Anzeiger 
her)

von namenlos (Gast)


Lesenswert?

Danke für den Tip. Habe das mal gemacht und der Strom fließt eigentlich 
schon zum Pin.

von Al3ko -. (al3ko)


Lesenswert?

sicher, dass der taster richtig angeschlossen (low aktive) ist?

von Karl H. (kbuchegg)


Lesenswert?

namenlos schrieb:
> Danke für den Tip. Habe das mal gemacht und der Strom fließt eigentlich
> schon zum Pin.

Vergiss es. Da hab ich mich verrant.
Mit dem Pullup wirst du die LED nicht zum leuchten bringen.

Was ich vor hatte war eigentlich
die led kommt mit einem Ende an Masse und mit dem anderen tippst du den 
Pin an. Wenn dort 5V anliegen, dann leuchtet die LED. (und so sollte das 
ja auch sein). Drückst du den Taster, dann hört die LDE auf zu leuchten, 
weil dann 0V am Pin anliegen.

Aber wie gesagt so funktioniert das nicht, weil der interen Pullup 
Widerstand zu hoch ist.

Bleibt nur noch eins: Photo vom Aufbau machen.

von namenlos (Gast)


Lesenswert?

Ja. Habe es extra mehrere male geprüft.

von namenlos (Gast)


Lesenswert?

Ich bin ziemlich ratlos. Ich habe mir auch schon andere Tuts angeschaut. 
Sollte ich es vllt. mal mit einem anderen AVR probieren?

von Karl H. (kbuchegg)


Lesenswert?

Ich denke ehrlich gesagt auch, dass du einen SChaltfehler hast.
Mach mal ein Photo (aber so, dass man auch was erkennen kann)

von namenlos (Gast)


Lesenswert?

Foto geht leider nicht, weil ich gerade keine Kamera dabei habe. Aber um 
es nochmal klar zu stellen: Also am Programm liegt es nicht, oder? Und 
der Aufbau mit Low Active ist doch prinzipiell auch richtig, nicht?

von Karl H. (kbuchegg)


Lesenswert?

namenlos schrieb:
> Foto geht leider nicht, weil ich gerade keine Kamera dabei habe. Aber um
> es nochmal klar zu stellen: Also am Programm liegt es nicht, oder? Und
> der Aufbau mit Low Active ist doch prinzipiell auch richtig, nicht?

ABer an irgendwas muss es liegen.
Wenn die Software in Ordnung ist und die Hardware in Ordnung ist, dann 
funktioniert das auch. Das es nicht funktioniert, ist der Beweis, das 
irgendwas faul ist. Dein Programm kennen wir bereits. Aber die Hardware 
nicht.

Und erst mal geht man vom Naheliegenden aus: Da ist irgendwo ein Fehler.
erst wenn sich da nichts finden lässt, rückt die Hypothese dass der µC 
defekt ist, in den Sichtbereich. Normalerweise ist er es nicht, sondern 
irgendwas anderes ist faul. Das Problem sitzt in mehr als 95% immer vor 
dem Monitor :-)

von namenlos (Gast)


Lesenswert?

ok, dann werde ich die Hardware so gut beschreiben wie es geht:
An PortB sind die LEDs. An denen liegt es ganz sicher nicht.

An PortD sind die Taster. Auf der andere Seite der Taster läuft ein 
Kabel zu GND und eines zu VCC.

Viel gibt's da, nicht mehr zu sagen, oder?

von Karl H. (kbuchegg)


Lesenswert?

namenlos schrieb:
> ok, dann werde ich die Hardware so gut beschreiben wie es geht:

Beschreiben hilft nichts.
Das du im Prinzip weißt, wie es aussehen soll, haben wir schon 
mitgekriegt. Die Frage ist: hast du auch das verschaltet, was du glaubst 
verschaltet zu haben? Das ist die entscheidende Frage.

> An PortD sind die Taster. Auf der andere Seite der Taster läuft ein
> Kabel zu GND und eines zu VCC.

? WOzu Vcc.
VOn den Tastern gibt es keine Verbindung zu Vcc. Die Taster verbinden 
den Pin mit GND, wenn der Taster gedrückt ist. Mehr nicht.

von namenlos (Gast)


Lesenswert?

Ein Kabel muss doch Richtung VCC, dachte ich. 
http://www.mikrocontroller.net/wikifiles/a/a2/Active_High.gif

von Karl H. (kbuchegg)


Lesenswert?

namenlos schrieb:
> Ein Kabel muss doch Richtung VCC, dachte ich.
> http://www.mikrocontroller.net/wikifiles/a/a2/Active_High.gif


Du hast aber active low.

Vcc kommt über den eingeschalteten Pullup Widerstand.

(und jetzt wundert mich auch nicht mehr, das da nichts geht :-)

Also: Umbau
Der Taster verbindet den Pin mit Masse. Nicht mehr.

von namenlos (Gast)


Lesenswert?

Achso. Muss dann noch ein weiterer Widerstand zwischen VCC und Taster 
angebracht werden?

von Cyblord -. (cyblord)


Lesenswert?

namenlos schrieb:
> Achso. Muss dann noch ein weiterer Widerstand zwischen VCC und Taster
> angebracht werden?

> Der Taster verbindet den Pin mit Masse. Nicht mehr.

Was verstehst du daran nicht?

von Karl H. (kbuchegg)


Lesenswert?

namenlos schrieb:
> Achso. Muss dann noch ein weiterer Widerstand zwischen VCC und Taster
> angebracht werden?


Nein.
Genau deswegen macht man ja beim AVR Avctive-Low. Weil man ausser dem 
Taster NICHTS zusätzlich braucht. Der Taster schaltet den Pin nach Masse 
durch und mehr braucht man hardwaremässig nicht.

von Cyblord -. (cyblord)


Lesenswert?

Ja ich meine wenn man sich nichtmal nen 5 Euro Multimeter fürs Basteln 
leistet, was soll man da erwarten? Das ist das absolute Minimum. Ohne 
Messgeräte sieht man eben auch wenig und lernt wenig.

gruß cyblord

von namenlos (Gast)


Lesenswert?

Dann weiß ich wirklich nicht, was ich noch machen könnte. Kann auch 
leider kein Foto machen. Ich fürchte, ich bekomme das heute nicht mehr 
hin. Ich werde es morgen nochmal probieren. Auch, wenn ich noch nicht 
weiter gekommen bin, vielen Dank, dass ihr mir einige Ratschläge gegeben 
habt! :-)
Schlaft alle gut! :)

von Karl H. (kbuchegg)


Lesenswert?

namenlos schrieb:
> Dann weiß ich wirklich nicht, was ich noch machen könnte. Kann auch
> leider kein Foto machen. Ich fürchte, ich bekomme das heute nicht mehr
> hin.

Ah geh, das ist doch in 0 komma nix umgebaut!

Alternativ kann man natürlich noch das Programm an deine Schaltung 
anpassen. Aber im Grunde ist das nicht sinnvoll, weil man normalerweise 
Taster eben nicht so anschliesst wie du das gemacht hast.

Aber um dir ein Erfolgserlebnis zu verpassen:
1
#include <avr/io.h>
2
3
int main()
4
{
5
  DDRB = 0b00001111;
6
  DDRD = 0b00000000;
7
8
  while (1) {
9
    if ( (PIND & (1<<PD2)))
10
      PORTB = 0b00000011;
11
    else
12
      PORTB = 0b00000000;
13
  }
14
}

von namenlos (Gast)


Lesenswert?

Jetzt funktioniert es, ohne, dass ich einen Taster drücke. Seltsam.

von Karl H. (kbuchegg)


Lesenswert?

namenlos schrieb:
> Jetzt funktioniert es, ohne, dass ich einen Taster drücke. Seltsam.


Dann sind deine LEDs auch anders rum angeschlossen wie im Tutorial. Dann 
drehst du halt eben beispielsweise die Abfrage um:
1
#include <avr/io.h>
2
3
int main()
4
{
5
  DDRB = 0b00001111;
6
  DDRD = 0b00000000;
7
8
  while (1) {
9
    if ( ! (PIND & (1<<PD2)))
10
      PORTB = 0b00000011;
11
    else
12
      PORTB = 0b00000000;
13
  }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.