Atmega 2560 Port problem

OP #2197116
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
Gast #2197140
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
Gast #2197150
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.
Gast #2197159
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)
#2197161
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.

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