Problem mit LEDS an Port C0-C2

Gast #367859
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ß???)))
Moderator Persönliche Seite #367860
Lesenswert?

1
DDRC =(0 << DDC0) | (0 << DDC1)| (0 << DDC2);
ist eine umständliche Form der Anweisung
1
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.
Gast #367865
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
Gast #367868
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
#367869
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.
Gast #367870
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????
#367871
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.
#367872
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.
Gast #367873
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren