Hallo,
ich zweifel grade irgendwie an meinem Verstand. Ich habe einen
ATMEGA324PA-AU und möchte einen Drehschalter (6 Schaltschritte, nicht
kurzschließend) an PORTC einlesen. Der gemeinsame Anschluss liegt auf
Masse, die 6 Anschlüsse der Schaltstellungen sind mit den Eingängen PC0
bis PC5 verbunden. An PORTA sind acht LEDs angeschlossen, welche auch
korrekt arbeiten. Das ist wirklich sichergestellt. Ich versuche nun, den
Zustand von PORTC einzulesen und jeweils eine entsprechende LED
anzusteuern. Beim Drehschalter beginne ich mit Stellung 3 zu zählen, die
letzte Stellung ist dann 8. Wenn also die erste Position (PC5, rückwärts
gezählt) eingestellt ist, soll LED3 leuchten. In meinem Programm habe
ich die LEDs über ein Makro definiert, der Einfachheit halber habe ich
diesen Part weggelassen. Funktioniert aber, da es kein Problem ist, die
LEDs mit einem Bitmuster oder einer Hex-Zahl direkt anzusteuern. Wenn
ich nun den Schalter aber drehe, kommen nicht die LEDs wie gewünscht,
sondern die LEDs 3,4,5,6 kommen nacheinander (habe ich mit jeweils
eingebauter verzögerung getestet) und leuchten danach dauerhaft, LED7
und LED8 funktionieren wie gewünscht. Ich habe mittlerweile alles
versucht, komme aber auf keinen grünen Zweig. Ich habe auch bereits den
Controller getauscht, da ich den Verdacht hatte, dass dieser defekt ist.
Macht aber keinen Unterschied. Irgendwie scheinen diese vier Port-Pins
nicht korrekt abgefragt zu werden. Elektrisch gemessen ist an allen Pins
der gewünschte Signalpegel vorhanden.
Die Fuses sind E:FF, H: 99 L:62
Hier der momentan arbeitende Abschnitt aus meinem Code
1 | #define F_CPU 1000000UL
|
2 | #include <avr/io.h>
|
3 |
|
4 | .
|
5 | .
|
6 | .
|
7 |
|
8 | void schalterstellung(void);
|
9 |
|
10 | void schalterstellung()
|
11 | {
|
12 | if((PORTC & (1 << PC5)) == 0)
|
13 | {
|
14 | led_3 = 1;
|
15 | }else led_3 = 0;
|
16 |
|
17 | if((PINC & (1 << PC4)) == 0)
|
18 | {
|
19 | led_4 = 1;
|
20 | }else led_4 = 0;
|
21 |
|
22 | if((PINC & (1 << PC3)) == 0)
|
23 | {
|
24 | led_5 = 1;
|
25 | }else led_5 = 0;
|
26 |
|
27 | if((PINC & (1 << PC2)) ==0)
|
28 | {
|
29 | led_6 = 1;
|
30 | }else led_6 = 0;
|
31 |
|
32 | if((PINC & (1 << PC1)) == 0)
|
33 | {
|
34 | led_7 = 1;
|
35 | }else led_7 = 0;
|
36 |
|
37 | if((PINC & (1 << PC0)) == 0)
|
38 | {
|
39 | led_8 = 1;
|
40 | }else led_8 = 0;
|
41 |
|
42 | return;
|
43 | }
|
44 |
|
45 |
|
46 | int main(void)
|
47 | {
|
48 | DDRA = 0xFF;
|
49 | DDRC = 0x00;
|
50 | while (1)
|
51 | {
|
52 | schalterstellung();
|
53 | }
|
54 | return (0);
|
55 | }
|