www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit LEDS an Port C0-C2


Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Habe eine Mega 128 und drei LEDS mit 1K Wiederständen nach 5 Volt.

Ich initialisere so

#include <avr/io.h>
#include <stdint.h>

uint8_t foo;


int main()
{
//TASTER
DDRD = (1 << DDD0) | (1 << DDD1) ;
//LEDS
DDRC =(0 << DDC0) | (0 << DDC1)| (0 << DDC2);
PORTC |= (1<<PC0)| (1<<PC1)| (1<<PC2);
return (0);
}

Leider tut sich nix??

Was mache ich falsch

An Port D0 und D1 habe ich 2 taster mit Wiederständen gegen 5 Volt So
wie im AVR Tutorial.


Wenn ich die Taster Drücke resetet sich der Mega 128(Kurzschluß???)))

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRC =(0 << DDC0) | (0 << DDC1)| (0 << DDC2);
ist eine umständliche Form der Anweisung
DDRC = 0;
Das Ganze ist damit keine Änderung gegenüber dem Zustand nach einem
Reset, alle Pins von Port C stehen auf Eingang.

Mein Tip: lass die sinnlose aus ,,Symmetriegründen'' geschriebenen
verschobenen Nullen sein.  Eine Null kannst du noch so oft schieben,
es bleibt eine Null, also kann man das auch weglassen.  Wie du eben
gemerkt hast, ist die ,,Symmetrie'' zu den verschobenen Einsen zum
Setzen eines Bits nichts wirklich wert, da sie dir nur den Blick
verschleiert hat, und du gar nicht gemerkt hast, dass da noch was
fehlt.

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... und alle Taster liegen an Ausgängen!
Du hast Ein- und Ausgänge vertauscht. Eingänge bekommen eine 0 und
Ausgänge eine 1 im DDRx-Register.

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert trotzdem nicht bei Taster druck reset Atmega.

LEDS leuchten nicht.

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

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du denn die LEDs angeschlossen?

Ansonsten: Bei PORTC und Leds taucht sofort das Schlagwort
'JTAG' auf. Das hast du doch per Fuse abgeschaltet?
Nimm mal den PORTB als Ausgabe her.

Woher weist du eigentlich, dass der Mega128 resettet?

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mal dir Hexschreibweise probiert bei den LEDS

PORTC=0x03 dann leuchtet die 2.

Warum klappt das nicht mit der anderen schreibweise???(wie oben)

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

@Karl Heinz

Normal hast du Recht, aber beim Mega128 liegt der JTAG auf PORTF.

@Hans Peter

Da sind grundsaetzliche Fehler:

DDRD &= ~(1<<DDRD0) & ~(1<<DDRD1); // Setzt das Datenrichtungsregister
auf Eingang

DDRD |= (1<<LED1) | (1<<LED2); // Setzt das Datenrichtungsregister auf
Eingang


PORTD |= (1<<DDRD0) | (1<<DDRD1); // aktiviert die internen Pullups

PORTD |= (1<<LED1) | (1<<LED2); // schaltet die LEDS aus weil sie gegen
+5V gehen



PORTD &= ~(1<<LED1) & ~(1<<LED2); // schaltet die LEDS ein weil sie
gegen +5V gehen



Gruß,

Dirk

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups,

comment falsch

DDRD |= (1<<LED1) | (1<<LED2); // Setzt das Datenrichtungsregister auf
Ausgang

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Jetzt leuchtets mir ein.

Werde es heute abend probieren

Danke

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe es mal Probiert die Ausgänge funktionieren jetzt.

Es muß aber heißen DDD0 nicht DDRD0 aber kein Problem.

Nur eins habe ich noch die Eingänge


Wenn ich den Taster Drücker resetet sich mein AVR.

Was kann man dagegen tun???

Danke

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich den Taster Drücker resetet sich mein AVR.

Woher weist du das?

> Was kann man dagegen tun???
Du zeigst uns dein jetziges Program, wir sagen dir
was daran falsch ist.

Ich rate mal: du hast den Port an dem die Taster hängen
als Ausgang geschaltet. Die Pins dort sind auf high und
dein Taster schaltet nach Masse -> Kurzschluss. Die Spannung
bricht zusammen -> der µC resettet.

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also

ich habe es so wie oben beschrieben

DDRD &= ~(1<<DD0) & ~(1<<DDD1) & ~(1<<DDD4) & ~(1<<DDD5) & ~(1<<DDD6);
// Setzt das Datenrichtungsregister


Das hesit D0-6 ausgenommenD2 und D3 sind als Eingang programmiert.


Oder ist das falsch????

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das hesit D0-6 ausgenommenD2 und D3 sind als Eingang programmiert.

Äh nein.
Ich bin jetzt zu faul hier auf die Schnelle die ganzen
Negationen und UND Verknüpfungen im Kopf durchzurechnen um
zu sehen wo eine 1 übrigbleibt, aber:
Jörg hat dir schon gesagt, dass du die 0 Bits am besten
in Ruhe lässt, wenns nicht unbedingt sein muss.

Wenn du an PortD D2 und D3 als Ausgang haben willst und
alles andere als Eingang, dann kümmere dich nur um die
Ausgänge:

  DDRD = ( 1 << DDD2 ) | ( 1 << DDD3 );

und fertig. Alles was nicht explizit auf 1 gesetzt wird
ist automatisch 0.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> DDRD &= ~(1<<DD0) & ~(1<<DDD1) & ~(1<<DDD4) & ~(1<<DDD5) &
>         ~(1<<DDD6);
> Das hesit D0-6 ausgenommenD2 und D3 sind als Eingang programmiert.
> Oder ist das falsch????

Alle Bits die auf 1 sind, definieren den zugehörigen Port-Pin
als Ausgang.
Schaun wir mal:

                                      ~
    1 << DDD0      0b00000001     0b11111110
    1 << DDD1      0b00000010     0b11111101

wenn ich die beiden jetzt UND Verknüpfe kommt raus:  0b11111100

Das wäre also: D2 bis D7 sind Ausgang, D0 und D1 sind Eingang.
Die weiteren Terme wirken auf gleiche Weise und setzen ihrerseits
jeweils ein Bit auf 0. D.h. im Endeffekt kommt raus: 0b10001100

Also: D0, D1, D4, D5, D6  als Eingang
      D2, D3, D7          als Ausgang

Aber: das ganze wird noch mit dem momentanen Zustand von DDRD
UND Verknüpft

   DDRD &= .....

und DDRD hat beim Einschalten des AVR den Wert 0.
D.h. deine ganze schöne DD-Maske ist für die Katz. Denn wenn
du die mit 0 ver-undest, bleiben nur 0 Bits übrig.

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Code zur Prot initilisierung

DDRC |= (1<<DDC0) | (1<<DDC1) | (1<<DDC2)| (1<<DDC3);
DDRD |= (1<<DDD7);
PORTD |= (1<<DDD7);
PORTC |= (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3);


Port C0-C3 als Ausgang geht auch
Port D7 als Ausgang geht auch

Port D0-D6 als Eingang geht nicht AVR bricht zusammen reset bei
tastendruck
Schalte alle Ausgänge LEDS aus geht auch

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das Problem behoben

wer lesen kann ist klar im Vorteil

Habe statt 10KOhm nur 10 Ohm eingelötet deshalb der Kurzschluß.

Nun habe ich 10KOHM und es geht.


Danke nochmal

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

Bewertung
0 lesenswert
nicht lesenswert
Wo kommen da jetzt auf einmal Widerstände her?

Wenn du nur einen Schalter an einen Pin hängst, brauchst
du keine externen Pull-up Widerstände. Die hat dein
Prozessor eingebaut. Brauchst du nur einschalten.

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ist richtig aber nun sind sie einmal drin.

Danke

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.