Forum: Mikrocontroller und Digitale Elektronik ATmega128 Ports schalten?


von Andi (Gast)


Lesenswert?

Hallo,
wenn ich an meinem ATmega128 die Ports schalten will geht das erst beim
zweiten mal! Was ist da falsch??? Das ist auch schon im Simulator so,
also dürfte es kein HW Problem sein.

z.B.:
DDRC = 0xFF;  -> DDRC bleibt 0x00
DDRC = 0x00;  -> DDRC bleibt 0x00
DDRC = 0xFF;  -> Endlich hat’s der Port gerafft
(oder ich raff es nicht ;)

Das gleiche Problem habe ich auch bei den PORT Registern

Gruß
 Andi

von crazy horse (Gast)


Lesenswert?

hm, hast du die Portstruktur der AVRs begriffen oder probierst du nur so 
rum?

von Andi (Gast)


Lesenswert?

>hm, hast du die Portstruktur der AVRs begriffen oder probierst du nur so
>rum?

Jein, bis jetzt hatte ich das Problem noch nicht (ATmega8). Prinzipell 
hab ich das schon begriffen (Dachte ich zumindest :)

Komisch ist auch das der Simulator das gleiche macht.
Optimierung hab ich aus un im assabler steht auch die richtigen Befehle.

von Artur Funk (Gast)


Lesenswert?

Was du da machst, hat nichts mit Ports-Schalten zu tun, du schaltest 
somit die Datenrichtung der Ports um. Und es kann gut sein, dass es am 
Simulator liegt. Hast du schon mal probiert die breakpoints eine Zeile 
früher zu setzen?

von Udo (Gast)


Lesenswert?

die DDRx Register dienen dazu, um zu bestimmen, ob die PIN's des Ports 
Eingänge oder Ausgänge sind.
Bei als Ausgänge bestimmte PIN's musst du mit PORTx die Zustände 
schalten.

von Andi (Gast)


Lesenswert?

Das ich Die DDR hingeschrieben habe war nur als Beispiel gedacht.

ich hab da was im Datenblatt gefunden:
When switching between tri-state ({DDxn, PORTxn} = 0b00) and output high 
({DDxn, PORTxn} = 0b11), an intermediate state with either pull-up 
enabled ({DDxn, PORTxn} = 0b01) or output low ({DDxn, PORTxn} = 0b10) 
must occur. ....

Switching between input with pull-up and output low generates the same 
problem. The user must use either the tri-state ({DDxn, PORTxn} = 0b00) 
or the output high state ({DDxn, PORTxn} = 0b11) as an intermediate 
step.

ich schaue mal ob es damit zusammenhängt, wobei mir das komisch 
erscheint. Da ich ja sowieso nicht in beiden Registern gleichzeitig 
rumfummel kann. Da ist ja klar das ich einen zwischen Zustand bekomme.

von Andi (Gast)


Lesenswert?

Bitte nicht Schlagen....
ich hab das Problem gefunden....
ich sag nur:
if(...)
  // tuwas
PORTA = 0x00;

man sollte halt das if(...) mit auskommentieren, wenn es nicht zutrifft.
ist schon blöd wenn man so doof ist ;)

Vielen Dank an alle
Gruß
  Andi

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.