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


von Hans Peter (Gast)


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ß???)))

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Uwe Nagel (Gast)


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.

von Hans Peter (Gast)


Lesenswert?

Funktioniert trotzdem nicht bei Taster druck reset Atmega.

LEDS leuchten nicht.

von Karl H. (kbuchegg)


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?

von Hans Peter (Gast)


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)

von Dirk (Gast)


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

von Dirk (Gast)


Lesenswert?

Ups,

comment falsch

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

von Hans Peter (Gast)


Lesenswert?

Ok Jetzt leuchtets mir ein.

Werde es heute abend probieren

Danke

von Hans Peter (Gast)


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

von Karl heinz B. (kbucheg)


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.

von Marcus (Gast)


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????

von Karl heinz B. (kbucheg)


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.

von Karl heinz B. (kbucheg)


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.

von Hans Peter (Gast)


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

von Hans Peter (Gast)


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

von Karl H. (kbuchegg)


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.

von Hans Peter (Gast)


Lesenswert?

Ja ist richtig aber nun sind sie einmal drin.

Danke

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.