Forum: Compiler & IDEs Atmega 128 als Motorcontroller


von Johannes L (Gast)


Lesenswert?

Guten Abend,

ich benötige Hilfe bei einem kleinen Hard/Software Problem.

Ich habe einen Atmega 128 und habe ein LC-Display an den µC 
angeschlossen.
Verbindung und Programmierung des Displays funktioniert tadelos.

Zusätzlich habe ich drei Kippschalter mit jeweils 3 Pins.
Jeder Kippschalter kann folgende Zustände annehmen High oder Low.
Für jeden Kippschalter habe ich zwei LEDs (grün & rot).
Der mittlere Pin des jeweiligen Kippschalters ist mit einem Eingang des 
µC verbunden. Der Zustand der drei Kippschalter wird mit Hilfe der LEDs 
angezeigt. Entweder schalte ich die Masse einer LED oder VCC (5Volt).
LED - Vorwiderstand = 220Ohm.

Die Zustände der Kippschalter lasse ich mir auf dem Display anzeigen mit 
1/0
Es funktioniert alles sehr gut.
Leider habe ein Problem mit den LEDs. Die LEDs flackern.

Folgender C-Code verwende ich, um den Zustand der Schalter zu prüfen und 
entsprechende Befehle und Ausgänge zu setzen:
1
DDRE=0xff;
2
DDRC=0x00;
3
4
while(1) {   
5
 
6
///////////// Motor Enable /////////////////////////
7
if(PINC & (1<<PINC0))  
8
{
9
   lcd_setcursor( 0, 1 );
10
   lcd_string("Motor    : 1");
11
12
  PORTE  = (1 << PE3 );
13
  PORTE &= ~(1 << PE4);
14
15
} 
16
else
17
{
18
19
   lcd_setcursor( 0, 1 );
20
   lcd_string("Motor    : 0");
21
  
22
  PORTE  = (1 << PE4 );
23
  PORTE &= ~(1 << PE3); 
24
}
25
///////////////////////////////////////////////////////  
26
///////////// Half/Full Step /////////////////////////
27
if(PINC & (1<<PINC1))
28
{
29
30
    lcd_setcursor( 0, 2 );
31
    lcd_string("HALF/FULL: 1");
32
  PORTE  = (1 << PE2 );
33
  PORTE &= ~(1 << PE5);
34
  
35
36
} 
37
else
38
{
39
     lcd_setcursor( 0, 2 );
40
    lcd_string("HALF/FULL: 0");
41
  PORTE  = (1 << PE5 );
42
  PORTE &= ~(1 << PE2); 
43
  
44
}
45
46
//////////////////////////////////////////////
47
///////////// CW/CCW /////////////////////////
48
49
if(PINC & (1<<PINC2))
50
{
51
   lcd_setcursor( 0, 3 );
52
   lcd_string("CW/CCW   : 1");
53
54
   PORTE  = (1 << PE1 ); 
55
  PORTE &= ~(1 << PE6);
56
} 
57
else
58
{
59
    lcd_setcursor( 0, 3 );
60
   lcd_string("CW/CCW   : 0");
61
62
  PORTE  = (1 << PE6 ); 
63
  PORTE &= ~(1 << PE1);
64
}
65
//////////////////////////////////////////////


Sobald ich alle Kippschalter prüfe per Abfrage, flackern die LEDs.

Die Schaltfunktion der LEDs und die Ausgabe auf dem Display funktioniert 
einwandfrei jedoch verstehe ich nicht warum die LEDs flackern?
Sobald ich nur einen einzigen  Kippschalter abfrage und den Code für die 
anderen Kippschalter auskommentiere(/* */) leuchten die beiden LEDs des 
Kippschalter ohne zu flackern. Sobald ich einen weiteren Kippschalter 
prüfen will bekomme ich das flackern.






Ich hoffe jemand kann mir helfen.

von Floh (Gast)


Lesenswert?

Johannes L schrieb:
> PORTE  = (1 << PE3 );

fehlt da jeweils ein | ?
Du willst ja nur eine LED einschalten, und nicht den restlichen Port auf 
0 setzen.

von Karl H. (kbuchegg)


Lesenswert?

Ich hab da jetzt etwas nicht verstanden.

Sind die LEDs an denselben Pins angeschlossen, wie die Schalter?

Oder sind die LEDs am Port E angeschlossen? (das ist das einzige, was 
ich deinem Code entnehmen kann, das du da was schaltest).

In letzterem Fall:
Dir ist klar, dass du hier

  PORTE  = (1 << PE5 );

immer den kompletten Port E bearbeitest. D.h. du setzt zwar 
korrekterweise den Pin PE5 auf 1. Aber: du setzt auch alle anderen Pins 
auf 0. zb auch den Pin, an dem die jeweils andere LED angeschlossen ist.

  PORTE  |= (1 << PE5 );

(und bei den anderen natürlich auch)

von Johannes L (Gast)


Lesenswert?

Guten Morgen,

zur ertsen Frage.

Ich Pins der LEDs sind nicht an den Pins der Schalter angeschlossen. Die 
LED Pins sind am PORTE angeschlossen.

Ich habe immer den ganzen PORTE geschaltet und nicht die einzelnen Pins.
1
PORTE  = (1 << PE5 );

nach einer Änderung auf
1
PORTE  |= (1 << PE5 );

funktioniert alles wunderbar ohne flackern.


Vielen Dank für deine Hilfe. Ich freue mich und kann jetzt zur Hardware 
schreiten.

Ciao

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.