www.mikrocontroller.net

Forum: Compiler & IDEs Probleme mit Ausgängen


Autor: Daniela (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich hab folgendes Problem:

ich habe ein Programm welches über LEDs die Uhrzeit ausgibt (siehe 
vorherige Foreneinträge).

Am Anfang hat alles wunderbar funktioniert, außer dass die LEDs sehr 
schwach geleuchtet haben.

In der ersten "Version" habe ich das DDRx jeweil bei jedem Ausgang 
einzeln gesetzt.
jetzt sieht es folgendermasen aus:

....
// initalisieren der Ports
void init ( void ) {
  DDRA = 0xFF;
  DDRB = 0xFF;
  DDRC = 0xFF;
  DDRD = 0xFF;
  DDRD &=~ (1 << DDD2); //Eingang
  }
....

Hat auch geholfen, also die LEDs leuchten hell (so wie ich es wollte).

ABER, die LEDs, welche am Port D hängen leuchten nicht mehr.
Ich hab schon auf verschiedene Arten Versucht das Problem zu beheben, 
z.B.
die letzten beiden Zeilen in "DDRD = 0xFB" ändern.

Ich freue mich über jeden Verbesserungsvorschlag!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniela wrote:

> ....
> // initalisieren der Ports
> void init ( void ) {
>   DDRA = 0xFF;
>   DDRB = 0xFF;
>   DDRC = 0xFF;
>   DDRD = 0xFF;
>   DDRD &=~ (1 << DDD2); //Eingang
>   }
> ....
>

Schön, aber dein main fängt so an

int main(void)
{

init();
// Kontroll LED

  DDRD = (1 << PD5);

und damit ist deine ganze DDRD Einstellung in init() Geschichte 
geworden.

Autor: Daniela (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versteh ich das richtig, dass es gehen müsste wenn die Zeile

  DDRD = (1 << PD5);

gelöscht wird? Die brauch ich im Prinzip auch nicht.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> DDRD = 0xFF;
> DDRD &=~ (1 << DDD2); //Eingang

Ich finde es überhaupt eine schlechte Idee, ein Port (und sei es auch 
nur für einen Takt) als Ausgang zu definieren und dann wieder zurück auf 
Eingang.
Wenn an dem Pin etwas hängt, dann kommt es zu einem Kurzschluss.

In der Init Routine sollen alle Pins entsprechend der Hardware von 
Anfang an richtig gesetzt werden.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniela wrote:
> versteh ich das richtig, dass es gehen müsste wenn die Zeile
>
>   DDRD = (1 << PD5);
>
> gelöscht wird? Die brauch ich im Prinzip auch nicht.

Ich hab mir den Rest des Programmes nicht durchgesehen.
Aber wenn du hier eine Zuweisung zu DDRD machst, dann ist deine ganze 
EInstellung des DDRD Registers in init() sinnlos geworden, weil sie hier 
ja überschrieben wird.

Autor: Daniela (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wäre dann
> DDRD &= (1 << DDD2); //Eingang
anstatt
> DDRD &=~ (1 << DDD2); //Eingang
die bessre Lösung?

Sonst habe ich nichts an den DDR-Registern geändert.

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In 99.999% aller Fälle ist es nicht notwendig die Richtung eines 
Portpins im laufenden Programm zu ändern.

Das macht man genau einmal in einer Init-Routine gemäss der 
angeschlossenen Hardware und ändert dann nix mehr dran. Demnach würde 
ich Zugriff auf DDRD ausschließlich in "Init()" machen.

Du bist dir der Funktion der beiden Register "DDRD" und "PORTD" aber 
schon bewusst oder hast du den folgenden Block von irgendwo her kopiert?
// Kontroll LED
  
  DDRD = (1 << PD5);
  PORTD |= (1 << PD5);

Autor: Daniela (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am Anfang habe ich jede LED so "angesteuert."

Die Kontroll LED gibt es inzwischen gar nicht mehr, die hatte ich nur 
drin um zu sehen ob überhaupt was geht. Deshalb hab ich auf die beiden 
Zeilen  auch gar nicht mehr geachtet und jetzt auch komplett gelöscht.

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Am Anfang habe ich jede LED so "angesteuert."
>
> Die Kontroll LED gibt es inzwischen gar nicht mehr, die hatte ich nur
> drin um zu sehen ob überhaupt was geht. Deshalb hab ich auf die beiden
> Zeilen  auch gar nicht mehr geachtet und jetzt auch komplett gelöscht.

Gerade im Fehlerfall ist es hilfreich, den Code im Geiste noch einmal 
nach zu vollziehen und sich über die Bedeutung jeder einzelnen Zeile 
klar zu werden.


http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Daniela (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre auf jeden fall vermeidbar gewesen, aber ich bin auf dem Thema nicht 
so fit (wie man merkt), dass mir so was nur durch lesen klar wird.

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wäre auf jeden fall vermeidbar gewesen, aber ich bin auf dem Thema nicht
> so fit (wie man merkt), dass mir so was nur durch lesen klar wird.

Deshalb der Link auf das Tutorial ;)

Wenn du dir das mal in Ruhe durch gehst und ausprobierst, kommt ganz 
sicher noch der eine oder andere 'AHA'-Effekt.

Viel Erfolg mit deiner Funkuhr ;)

Darf ich fragen, was genau an Port B hängt?

Autor: Daniela (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja klar darfst du da kommt das Signal vom DCF-Modul rein, du meinst doch 
den Eingangsport? Sonst sind überall LEDs oder nichts.

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dem Code nach zu urteilen hängt das DCF-Modul an PortD.2 Alle weiteren 
Pins sind Ausgänge.

Ich frage nur, weil die Ausgabe der Uhrzeit sicherlich etwas eleganter 
als über das 2 dutzend if-else Konstrukte gelöst werden kann ;) Schaut 
ein wenig nach simulierter Analog-Uhr (mit "Zeigern") aus

Autor: Daniela (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist es auch, war die Aufgabe.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm... wrote:

> In 99.999% aller Fälle ist es nicht notwendig die Richtung eines
> Portpins im laufenden Programm zu ändern.

Ein paar Neuner weniger tun es auch. Beispielsweise ist das bei 
bidirektionale Protokollen wie I2C und 1-Wire, bei HD44780-LCDs mit R/W 
und für Powerdown/save-Modi erforderlich.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> etwas eleganter als über das 2 dutzend if-else Konstrukte
>> gelöst werden kann
>> Schaut ein wenig nach simulierter Analog-Uhr (mit "Zeigern") aus
> ist es auch, war die Aufgabe.

Habt ihr schon von Arrays (auf deutsch: Felder) gelernt?

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig verstehe, wird also von PD2 das DCF-Signal gelesen,
an PD0, PD1, PD3, PD5, PD6 und PD7 hängen die LEDs, und PD4 ist nicht
belegt.

Mit
  DDRD = (1 << PD5);

konfigurierst du alle PD-Pins außer PD5 als Eingang, weswegen die
angeschlossenen LEDs nicht oder nur schwach leuchten. Lass also die
Zeile weg, da die Datenrichtung in init schon für alle Ports richtig
konfiguriert wurde.

Und nimm den Raten von Klaus Falser zu Herzen und ersetze
  DDRD = 0xFF;
  DDRD &=~ (1 << DDD2); //Eingang

durch
  DDRD = 1<<DDD0 | 1<<DDD1 | 1<<DDD3 | 1<<DDD5 | 1<<DDD6 | 1<<DDD7;

oder
  DDRD = ~(1<<DDD2 | 1<<DDD4);

Autor: Daniela (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JA es geht!!!!!

tausend mal Dank!

>Habt ihr schon von Arrays (auf deutsch: Felder) gelernt?

Gelernt schon aber können nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.