Forum: Mikrocontroller und Digitale Elektronik Evalboard AVR Mega128 Board


von Andreas S. (akku75)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe Probleme mit der Programmierung von meinem Evalboard AVR 
Mega128 Board von Deltawave.
Damit ich mal sehe was passiert, wollte ich ein einfache Sache 
programmieren, am Pin 0 von Port G habe ich einen Taster über VCC 
angeschlossen, wenn ich den Taster betätige soll  der Pin 0 vom Port G 
high bekommen und den Ausgang Port D Pin 7 auf high setzen.
Schalten lässt sich einfach nix. Leider ist der Pin 7 an Port D ist 
immer high mit meinem Programm!

Vollständige Datei evalboard.c im Anhang
1
...
2
3
sei();
4
   while(1) {
5
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
6
  PORTG |= 0x01; // pull-up Widerstand aktivieren
7
  if ( (PING & 0x01) == 1) 
8
  { // Zustand auslesen
9
    DDRD |= 0x80; // Pin 7 von Port D als Ausgang nutzen
10
    PORTD |= 0x80; //auf 1 (=high) setzen
11
  }


Brauch dringend Hilfe!!!

Gruß
Andreas

von Marius W. (mw1987)


Lesenswert?

Ist doch klar, dass die LED immer an ist...

Du hast einen Taster vom Eingang nach VCC und gleichzeitig den Pullup 
aktiviert. Also zieht entweder der Pullup oder der Taster den Pin nach 
VCC. Somit bekommste als Ergebnis immer ne 1...

Mach mal den Taster nach GND. Dann sollte das funktionieren. Wenn du den 
Taster drückst hast du dann am Eingang ne 0. Sonst halt deine 1.

MfG
Marius

von Andreas S. (akku75)


Lesenswert?

Hallo Marius,

habe es gerade versucht, es geht einfach nicht!
Pin 7 an Port D ist immer high.

von Helmut L. (helmi1)


Lesenswert?

Wo in deinem Programm setzt du den PIN den wieder auf 0 ?

  if ( (PING & 0x01) == 1)
  { // Zustand auslesen
    DDRD |= 0x80; // Pin 7 von Port D als Ausgang nutzen
    PORTD |= 0x80; //auf 1 (=high) setzen
  } ^^^^^^^^^^^^^^
    Hier wird der nur immer auf 1 gesetzt

Was dur brauchst ist der "else" fall in deinem Programmm

also

else
{
   PORTD &= 0x7f;
}

Das DDR register brauchst du ueberigens nur am Anfang deines Programms 
einmal zu setzen.

Gruss Helmi

von Marius W. (mw1987)


Lesenswert?

Die LED ist high, weil du deine if-Abfrage noch nicht angepasst hast. 
Wir haben hier negative Logik.
Außerdem fehlt der Code, der die LED auch wieder zurücksetzt, falls du 
den Taster los lässt. Hab das mal hinzugefügt.

Das sollte funktionieren:
1
sei();
2
   while(1) {
3
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
4
  PORTG |= 0x01; // pull-up Widerstand aktivieren
5
  if ( (PING & 0x01) == 0) 
6
  { // Zustand auslesen
7
    DDRD |= 0x80; // Pin 7 von Port D als Ausgang nutzen
8
    PORTD |= 0x80; //auf 1 (=high) setzen
9
  }
10
  else
11
  {
12
    PORTD &= 0x7F; // PD7 wieder auf low setzen
13
  }

von akku75 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
euere Tips haben mir sehr weitergeholfen!
Jetzt will ich das Programm so erweitern, dass bei 3 Tastern immer nur 
ein Ausgang high hat! D.h.:Taster 1 muss LED2 oder LED3 zurücksetzen 
usw.
Leider bleibt keine LED dauernd an!
Was mach ich falsch?

[c]
 sei();
   while(1) {
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
  PORTG |= 0x01; // pull-up Widerstand aktivieren
  DDRD &= ~0x40; // Pin 6 von Port D als Eingang nutzen
  PORTD |= 0x40; // pull-up Widerstand aktivieren
  DDRD &= ~0x10; // Pin 4 von Port D als Eingang nutzen
  PORTD |= 0x10; // pull-up Widerstand aktivieren


if ( (PING & 0x01) == 0)
  { // Zustand auslesen
    DDRD |= 0x80; // Pin 7 von Port D als Ausgang nutzen
    PORTD |= 0x80; //auf 1 (=high) setzen
   PORTD &= 0x20; // PD5 wieder auf low setzen
    PORTD &= 0x08; // PD3 wieder auf low setzen
  }

if ( (PIND & 0x40) == 0)
  { // Zustand auslesen
    DDRD |= 0x20; // Pin 5 von Port D als Ausgang nutzen
    PORTD |= 0x20; //auf 1 (=high) setzen
   PORTD &= 0x80; // PD7 wieder auf low setzen
    PORTD &= 0x08; // PD3 wieder auf low setzen
  }

if ( (PIND & 0x10) == 0)
  { // Zustand auslesen
    DDRD |= 0x08; // Pin 3 von Port D als Ausgang nutzen
    PORTD |= 0x08; //auf 1 (=high) setzen
   PORTD &= 0x80; // PD7 wieder auf low setzen
    PORTD &= 0x20; // PD5 wieder auf low setzen
  }
  else
  {
    //PORTD &= 0x7F; // PD7 wieder auf low setzen

  }
[c]

von Marius W. (mw1987)


Lesenswert?

Wenn ich dich richtig verstehe, dann soll die LED eingeschaltet werden 
und solange an bleiben, bis ein anderer Taster gedrückt wird.

Ich habe Ein- und Ausgangsdefinitionen sowie Pullups einfach mal aus der 
while-Schleife herausgezogen, da die nur einmal benötigt werden.

Also hier der Code dazu:
1
  sei();
2
3
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
4
  PORTG |= 0x01; // pull-up Widerstand aktivieren
5
  DDRD &= ~0x40; // Pin 6 von Port D als Eingang nutzen
6
  PORTD |= 0x40; // pull-up Widerstand aktivieren
7
  DDRD &= ~0x10; // Pin 4 von Port D als Eingang nutzen
8
  PORTD |= 0x10; // pull-up Widerstand aktivieren
9
10
  DDRD |= 0x08;  // PD3 als Ausgang
11
  DDRD |= 0x20;  // PD5 als Ausgang
12
  DDRD |= 0x80;  // PD7 als Ausgang
13
 
14
  while(1) {
15
    if ( (PING & 0x01) == 0)
16
    { // Zustand auslesen
17
      PORTD |= 0x80; //auf 1 (=high) setzen
18
      PORTD &= ~0x20; // PD5 wieder auf low setzen
19
      PORTD &= ~0x08; // PD3 wieder auf low setzen
20
    }
21
22
    if ( (PIND & 0x40) == 0)
23
    { // Zustand auslesen
24
      PORTD |= 0x20; //auf 1 (=high) setzen
25
      PORTD &= ~0x80; // PD7 wieder auf low setzen
26
      PORTD &= ~0x08; // PD3 wieder auf low setzen
27
    }
28
29
    if ( (PIND & 0x10) == 0)
30
    { // Zustand auslesen
31
      PORTD |= 0x08; //auf 1 (=high) setzen
32
      PORTD &= ~0x80; // PD7 wieder auf low setzen
33
      PORTD &= ~0x20; // PD5 wieder auf low setzen
34
    }
35
  }

So sollte das eigentlich funktionieren.

MfG
Marius

EDIT: beim Zurücksetzen natürlich negieren! ;-)

von Andreas S. (akku75)


Lesenswert?

Super, funktioniert alles!

Jetzt will ich mit Taster4 die anderen 3 Taster erst freigeben, d.h. 
Taster 4 soll LED4 schalten und die anderen Taster in ihrer Funktion 
frei geben. Wird Taster 4 nochmal gedrückt soll die LED4 ausgehen und 
die 3 Taster werden in ihrer Funktion gesperrt!

Hoffentlich versteht mich jemand?!

Gruß
Andreas

von Marius W. (mw1987)


Lesenswert?

An sich kein Problem, aber eigentlich solltest du da doch auch selbst 
drauf kommen können, oder?

So schwer isses ja nicht. Überleg halt mal einfach, schau dir das 
Tutorial hier an und guck dir an, wie if-Abfragen etc. funktionieren ;-)

MfG
Marius

von Andreas S. (akku75)


Lesenswert?

Hier noch die Portdef.:
1
sei();
2
 while(1) {
3
4
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
5
  PORTG |= 0x01; // pull-up Widerstand aktivieren
6
  DDRD &= ~0x40; // Pin 6 von Port D als Eingang nutzen
7
  PORTD |= 0x40; // pull-up Widerstand aktivieren
8
  DDRD &= ~0x10; // Pin 4 von Port D als Eingang nutzen
9
  PORTD |= 0x10; // pull-up Widerstand aktivieren
10
  DDRD &= ~0x04; // Pin 2 von Port D als Eingang nutzen
11
  PORTD |= 0x04; // pull-up Widerstand aktivieren
12
  
13
  DDRD |= 0x08;  // PD3 als Ausgang
14
  DDRD |= 0x20;  // PD5 als Ausgang
15
  DDRD |= 0x80;  // PD7 als Ausgang
16
  DDRG |= 0x02;  // PG1 als Ausgang
17
 
18
  while(1) {
19
    if ( (PING & 0x01) == 0)
20
    { // Zustand auslesen
21
      PORTD |= 0x80; //auf 1 (=high) setzen
22
      PORTD &= ~0x20; // PD5 wieder auf low setzen
23
      PORTD &= ~0x08; // PD3 wieder auf low setzen
24
    }
25
26
    if ( (PIND & 0x40) == 0)
27
    { // Zustand auslesen
28
      PORTD |= 0x20; //auf 1 (=high) setzen
29
      PORTD &= ~0x80; // PD7 wieder auf low setzen
30
      PORTD &= ~0x08; // PD3 wieder auf low setzen
31
    }
32
33
    if ( (PIND & 0x10) == 0)
34
    { // Zustand auslesen
35
      PORTD |= 0x08; //auf 1 (=high) setzen
36
      PORTD &= ~0x80; // PD7 wieder auf low setzen
37
      PORTD &= ~0x20; // PD5 wieder auf low setzen
38
    }
39
  }

von Andreas S. (akku75)


Lesenswert?

Ich lese ja wie ein Bek..., aber er will mir das Programm nicht 
übersetzen!
Schau doch nochmal drüber!

Danke!
1
sei();
2
 while(1) {
3
4
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
5
  PORTG |= 0x01; // pull-up Widerstand aktivieren
6
  DDRD &= ~0x40; // Pin 6 von Port D als Eingang nutzen
7
  PORTD |= 0x40; // pull-up Widerstand aktivieren
8
  DDRD &= ~0x10; // Pin 4 von Port D als Eingang nutzen
9
  PORTD |= 0x10; // pull-up Widerstand aktivieren
10
  DDRD &= ~0x04; // Pin 2 von Port D als Eingang nutzen
11
  PORTD |= 0x04; // pull-up Widerstand aktivieren
12
  
13
  DDRD |= 0x08;  // PD3 als Ausgang
14
  DDRD |= 0x20;  // PD5 als Ausgang
15
  DDRD |= 0x80;  // PD7 als Ausgang
16
  DDRG |= 0x02;  // PG1 als Ausgang
17
 
18
  while(1) {
19
    if ( (PIND & 0x04) == 0)
20
{   PORTG |= 0x02; //auf 1 (=high) setzen
21
22
    { // Zustand auslesen
23
      PORTD |= 0x80; //auf 1 (=high) setzen
24
      PORTD &= ~0x20; // PD5 wieder auf low setzen
25
      PORTD &= ~0x08; // PD3 wieder auf low setzen
26
    }
27
28
    if ( (PIND & 0x40) == 0)
29
    { // Zustand auslesen
30
      PORTD |= 0x20; //auf 1 (=high) setzen
31
      PORTD &= ~0x80; // PD7 wieder auf low setzen
32
      PORTD &= ~0x08; // PD3 wieder auf low setzen
33
    }
34
35
    if ( (PIND & 0x10) == 0)
36
    { // Zustand auslesen
37
      PORTD |= 0x08; //auf 1 (=high) setzen
38
      PORTD &= ~0x80; // PD7 wieder auf low setzen
39
      PORTD &= ~0x20; // PD5 wieder auf low setzen
40
    }
41
42
else
43
  {
44
    PORTG &= ~0x02; // PG2 wieder auf low setzen
45
  }
46
47
 }

von Marius W. (mw1987)


Lesenswert?

Wenn er das Programm nicht kompiliert, dann poste doch mal die 
Fehlermeldung, die der Compiler dir liefert.

Auf die schnelle sehe ich jetzt, dass vor dem else eine schließende 
geschweifte Klammer fehlt...
Außerdem hast du eine if-Abfrage gelöscht.

MfG
Marius

von Andreas S. (akku75)


Lesenswert?

Hallo,
die fehlende if-Anweisung und die Klamma ist wieder drin!
Es geht aber immer noch nicht so wie ich es brauche!
Durch drücken von Taster4 soll LED4 dauernd angeschaltet sein und die 
anderen 3 Taster in ihrer Funktion freigeben.
Wird Taster4 nochmal gedrückt soll die LED4 ausgehen und
die 3 Taster werden in ihrer Funktion gesperrt und zurückgesetzt!
1
 sei();
2
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen(Taster1)
3
  PORTG |= 0x01; // pull-up Widerstand aktivieren
4
  DDRD &= ~0x40; // Pin 6 von Port D als Eingang nutzen(Taster2)
5
  PORTD |= 0x40; // pull-up Widerstand aktivieren
6
  DDRD &= ~0x10; // Pin 4 von Port D als Eingang nutzen(Taster3)
7
  PORTD |= 0x10; // pull-up Widerstand aktivieren
8
  DDRD &= ~0x04; // Pin 2 von Port D als Eingang nutzen(Taster4)
9
  PORTD |= 0x04; // pull-up Widerstand aktivieren
10
  
11
  DDRD |= 0x80;  // PD7 als Ausgang(LED1)
12
  DDRD |= 0x20;  // PD5 als Ausgang(LED2)
13
  DDRD |= 0x08;  // PD3 als Ausgang(LED3)
14
  DDRG |= 0x02;  // PG1 als Ausgang(LED4)
15
 
16
  while(1) {
17
    if ( (PIND & 0x04) == 0) // (Taster4)
18
 {  PORTG |= 0x02; //auf 1 (=high) setzen // (LED4)
19
20
    if ( (PING & 0x01) == 0) // (Taster1)
21
    { // Zustand auslesen
22
      PORTD |= 0x80; //auf 1 (=high) setzen // (LED1)
23
      PORTD &= ~0x20; // PD5 wieder auf low setzen // (LED2)
24
      PORTD &= ~0x08; // PD3 wieder auf low setzen // (LED3)
25
    }
26
27
    if ( (PIND & 0x40) == 0) // (Taster2)
28
    { // Zustand auslesen
29
      PORTD |= 0x20; //auf 1 (=high) setzen // (LED2)
30
      PORTD &= ~0x80; // PD7 wieder auf low setzen // (LED1)
31
      PORTD &= ~0x08; // PD3 wieder auf low setzen // (LED3)
32
    }
33
34
    if ( (PIND & 0x10) == 0) // (Taster3)
35
    { // Zustand auslesen
36
      PORTD |= 0x08; //auf 1 (=high) setzen // (LED3)
37
      PORTD &= ~0x80; // PD7 wieder auf low setzen // (LED1)
38
      PORTD &= ~0x20; // PD5 wieder auf low setzen // (LED2)
39
    }
40
 }
41
       }

Danke für die Hilfe!
Gruß
Andreas

von Andreas S. (akku75)


Lesenswert?

Hallo?!?

von Helmut L. (helmi1)


Lesenswert?

Erstmal must du deine Tasten entprellen , sonst wird das nix.
Dann must du dir merken ob die Tasten freigeben sind oder nicht und 
davon deine entscheidung abhaengig machen. Und bei Taste 4 must du auch 
noch warten ob die Taste losgelassen wurde.

von Andreas S. (akku75)


Lesenswert?

Hallo Helmut,
kann ich die Taster nicht softwareseitig entprellen?

von Helmut L. (helmi1)


Lesenswert?

>kann ich die Taster nicht softwareseitig entprellen?

Das sollst du ja auch in Software machen.
Schreibe die erstmal eine Routine dazu wo du die 4 Tasten einliest und 
entprellst. Sonst wird das nicht mit der Taste 4 die ja zwischen den 
beiden Funktionen umschaltet.

Gruss Helmi

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.