Atmega 128 als Motorcontroller

Gast #2696334
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.
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)
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.