Problem mit Eingang-Ports (ATmega8)

Gast #2883729
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
}
#2883739
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
}
#2883769
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)
#2883776
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.
Gast #2883792
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?
#2883795
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 :-)
Gast #2883802
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?
#2883808
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.
Gast #2883829
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! :)
#2883831
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
}
#2883833
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
  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren