Forum: Mikrocontroller und Digitale Elektronik Atmega 2560 Port problem


von Christoph H. (christoph_b)


Lesenswert?

Hallo

Ich habe folgendes problem

Ich habe mir nun das myAVR MK3 Board mit dem Atmega 2560 gekauf.

Nun habe ich die ersten Erfahrungen mit dem Programmieren in C gemacht.

Ich würde gerne mit meinen 3 Schaltern 3 LED schalten

Laut Datenblatt von myAVR ist der Taster 3 auf K2,der Joystick auf K3-K7

Hir der Code:
1
#include <avr/io.h>
2
3
4
5
6
7
8
int main (void)
9
10
{
11
12
13
14
  //Port-B als Ausgang konfigurieren (für 7-Segment-Anzeige)
15
  DDRB=0xFF;
16
17
  //Port-L als Ausgang konfigurieren
18
  DDRL |= 0xFF;
19
20
  //Port-K als Eingang konfigurieren
21
  DDRK=0x00;
22
  
23
24
  // PULL UP
25
  PORTK = 0xFF;
26
  
27
  while (1)
28
29
  {
30
31
32
    if ((PINK&4)==0)  //Taste S0 gedrückt
33
      PORTL |= (1<<PL7);        //LEDs einschalten
34
    else
35
      PORTL &=~(1<<PL7);  
36
    
37
38
    if ((PINK&2)==0)
39
      PORTL |= (1<<PL1);
40
    else
41
      PORTL &=~(1<<PL1);
42
43
    if ((PINK&1)==0)
44
    {
45
      PORTL |= (1<<PL5);
46
      PORTL |= (1<<PL4);
47
    }
48
    else
49
    {
50
      PORTL &=~(1<<PL5);
51
      PORTL &=~(1<<PL4);
52
    }
53
54
55
56
57
}
58
59
60
61
  return 0;
62
}



Der Taster 1 wird mit PINK&1 geschaltet. Klappt
Der Taster 2 wird mit PINK&2 geschaltet. Klappt
Der Taster 3 wird mit PINK&3 geschaltet. Klappt nicht
Der Taster 3 wird mit PINK&4 geschaltet. Klappt
PINK&5-7 geht nicht.

Das selbe bei Port E. E1=0,E2=1 E3 geht nicht E4=2
E5 bis E7 keine Funktion

Einen Defekt schließe ich aus da das Testprogramm durchläuft.

Wie mache ich den Fehler.

MFG Christoph

von spess53 (Gast)


Lesenswert?

Hi

>Der Taster 1 wird mit PINK&1 geschaltet. Klappt
>Der Taster 2 wird mit PINK&2 geschaltet. Klappt
>Der Taster 3 wird mit PINK&3 geschaltet. Klappt nicht
>Der Taster 3 wird mit PINK&4 geschaltet. Klappt

Verabschiede dich einfach mal von Dezimalzahlen:

1   0b00000001
2   0b00000010
3   0b00000011
4   0b00000100

Fällt dir etwas auf?

MfG Spess

von Christoph H. (christoph_b)


Lesenswert?

hilft trotzdem nicht.

1   0b00000001 geht
2   0b00000010 geht
3   0b00000011 geht nicht
4   0b00000100 geht ( aber nur an Port 3)

MFG Christoph

von ... (Gast)


Lesenswert?

In Deinem Source steht nirgendwo was von "PINK&3". Also poste den 
richtigen Code und nicht irgendwas!

Aber selbst wenn sowas dastünde macht das nicht was Du denkst. PINK&3 
fragt 2 Eingänge gleichzeitig ab!
Frag die Eingänge am besten genauso ab, wie Du die Ausgänge 
setzt/löschst. Also "PINK & (1 << PK1)" etc.

Und lies Dir das mal durch:
http://www.mikrocontroller.net/articles/Bitmanipulation
Insbesondere Punkt 6.

von Thomas E. (thomase)


Lesenswert?

Christoph B. schrieb:
> hilft trotzdem nicht.

Kann auch nicht. Weil dir nichts aufgefallen ist.

Christoph B. schrieb:
> 0b00000011 geht nicht

Damit maskierst du nicht Pin2 sondern Pin1 und Pin0.

Christoph B. schrieb:
> 4   0b00000100 geht ( aber nur an Port 3)

Damit maskierst du Pin2

Jetzt überleg dir mal, wie man Pin3 maskiert.

mfg.

von spess53 (Gast)


Lesenswert?

Hi

>4   0b00000100 geht ( aber nur an Port 3)

Weil du folgendes brauchst:

0b00000001     1
0b00000010     2
0b00000100     4
0b00001000     8
0b00010000    16
0b00100000    32
0b01000000    64
0b10000000   128

MfG Spess

von Helfender (Gast)


Lesenswert?

Lies mal was über das Ausmaskieren von Bits aus Bytes; dort liegt der 
Fehler:

Bit 0 = Byte & 1 (bzw. 0x01)
Bit 1 = Byte & 2 (bzw. 0x02)
Bit 2 = Byte & 4 (bzw. 0x04)
Bit 3 = Byte & 8 (bzw. 0x08)
Bit 4 = Byte & 16 (bzw. 0x10)
usw.

Ein "Byte & 3" hat für Bit 3 hier nichts zu suchen; damit werden 
stattdessen die Bits 0 und 1 ausmaskiert.

> if ((PINK&1)==0)

Das sollte man besser und verständlicher so schreiben:

>> if ((PINK & (1 << PK0)) == 0)

von Christoph H. (christoph_b)


Lesenswert?

OK Danke

Wieso geht das denn bei den Ausgängen??
PL1=LED1
PL2=LED2
PL3=LED3...

von Karl H. (kbuchegg)


Lesenswert?

Christoph B. schrieb:
> hilft trotzdem nicht.
>
> 1   0b00000001 geht
> 2   0b00000010 geht
> 3   0b00000011 geht nicht
> 4   0b00000100 geht ( aber nur an Port 3)


        ^^^^^^^^
        |||||||+---- Bit 0     .... Eingang 1
        ||||||+----- Bit 1     .... Eingang 2
        |||||+------ Bit 2     .... Eingang 3
        ||||+------- Bit 3     .... Eingang 4
        |||+-------- Bit 4     .... Eingang 5
        ||+--------- Bit 5     .... Eingang 6
        |+---------- Bit 6     .... Eingang 7
        +----------- Bit 7     .... Eingang 8

Wenn du also feststellen willst, was sich am Eingang 3 tut, musst du das 
entsprechende Bit Nummer 2 abfragen.

Das machst du aber nicht mit

  PINK & 3

denn 3 hat das Bitmuster 0b00000011

Mit den beiden 1-en fragst du Bit 0 und Bit 1 ab (also Eingang 1 und 
Eingang 2). Das brauchst du aber nicht. Du brauchst Eingang 3. Dazu 
müsstest du eine Maske von 0b00000100 haben, also dezimal 4

Deine Abfrage für Eingang 3 müsste also lauten

  PINK & 4

und jetzt verstehst du hoffentlich auch, warum diese Form nicht so gut 
ist. Mittels

  PINK & ( 1 << 2 )

wird unmittelbar deutlich, dass du Bit 2 vom PINK abfragen willst. Die 2 
da drinnen sagt dir das unmittelbar.

von Karl H. (kbuchegg)


Lesenswert?

Christoph B. schrieb:
> OK Danke
>
> Wieso geht das denn bei den Ausgängen??
> PL1=LED1
> PL2=LED2
> PL3=LED3...

Es geht genau gleich.

Um eine LED einzuschalten schreibst du

   PORTL |= ( 1 << PL1 );

(PL1 ist nur eine andere Schreibweise für 1, ein #define sorgt dafür, 
dass man anstelle von 1 auch PL1 schreiben kann. Aber prinzipiell ist es 
genau das gleiche)

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.