Forum: Mikrocontroller und Digitale Elektronik Register ändert sich nicht


von Reinhard (gotbread)


Angehängte Dateien:

Lesenswert?

Hallo

ich möchte einen Gamecube-Controller mit einem attiny45 ansprechen.
Das Protokoll habe ich von 
http://int03.co.uk/crema/hardware/gamecube/gc-control.htm

Mein Problem ist, dass der Code weder im Debugger noch real 
funktioniert.
Da der Pin einen externen pullup hat, muss ich ja einfach nur den Pin
als Eingang (high) oder Ausgang (low) schalten. Jedoch ändert sich der
Wert von DDRB nicht.

Nachdem die Funktion "InitController" abgearbeitet ist, hat r20 den Wert
0x0 und r21 den Wert 0x2. mit "out CONTROLLER_DDR, r21" müsste er also
den zweiten Pin als Ausgang schalten.

Ich kann den Code bis da auch durchsteppen (er wird also aufgerufen),
nur egal wie oft ich über den Befehl gehe, es ändert sich nichts. Was
mache ich da falsch (bin noch neuling im AVRasm).

MfG Gotbread

von Oliver (Gast)


Lesenswert?

Reinhard Seibt schrieb:
> Jedoch ändert sich der
> Wert von DDRB nicht.

Deshalb gibt es ja auch noch PORTB und PINB.

guggst du ins Datenblatt oder ins Tutorial.

Oliver

von Reinhard (gotbread)


Angehängte Dateien:

Lesenswert?

PORTB ist für diesen pin 0. d.h. wenn ich das entsprechende Bit in DDRB
auf 0 setze (Eingang) wird der Pin durch einen externen Pullup
hochgezogen (1kohm). Wenn ich das Bit auf 1 setze (aktiver Ausgang), 
müsste
der Pin LOW sein.

Jedoch zeigt der Debugger das DDRB register immer als 0x0 an (siehe 
Bild).

Der C-Teil (der den asm-teil aufruft) funktioniert auch wunderbar, nur
im asm-teil ändert sich DDRB nicht (auch PORTB lässt sich nicht ändern).

von someone (Gast)


Lesenswert?

Wenn sich an der beobachteten Adresse nichts ändert beim out, und die 
werte korrekt sind (beides hast du geprüft), stimmt vielleicht die 
Addresse nicht.

Ist CONTROLLER_DDR = PORTB auch wirklich der beobachtete DDR port? Oder 
hast du da eine Definition für den falschen Kontroller und die falsche 
Adresse?

von Reinhard (gotbread)


Lesenswert?

im sourcefile binde ich den header (tn54def.inc für den attiny45) ein.

ich hab mir außerdem mal den assemblercode des hauptprogramms angeguckt,
dort wird ein zum test eingebautes "DDRB = 2;" zu:

ldi r24,lo8(2)
out 55-32,r24

was die 32 bedeutet, weiß ich nicht, jedoch findet sie sich bei fast 
allen
out-anweisungen.

von Karl H. (kbuchegg)


Lesenswert?

Das ist der Offset in der Adresslage, je nachdem ob man den Port über 
eine out oder eine (ich glaub es war) Speicherschreib-Instruktion 
ansteuert.

Warum meinst du eigentlich, du müsstest da mit Assembler um dich 
schmeissen?

von Reinhard (gotbread)


Lesenswert?

ich versuche mit dem assembler-code das timing genau einzuhalten.
wenn die DDRB geschichte nich wäre, lief das bestimmt schon.
klar könnte man das auch in C machen :)

laut headerfile liegt DDRB an der stelle 0x17 (23). warum nimmt der 
compiler
dann 55? (0x37)

von Karl H. (kbuchegg)


Lesenswert?

Reinhard Seibt schrieb:
> ich versuche mit dem assembler-code das timing genau einzuhalten.
> wenn die DDRB geschichte nich wäre, lief das bestimmt schon.
> klar könnte man das auch in C machen :)

Ich bin mir ziemlich sicher, dass man das auch in C machen kann. Und 
zwar ohne, dass du Timingprobleme bekommst.

> laut headerfile liegt DDRB an der stelle 0x17 (23). warum nimmt der
> compiler
> dann 55? (0x37)

Weil im Header File die Adresslage eingtragen ist, wenn man den Port 
über eine Speicheradresse addressiert. Bei IN/OUT gibt es da einen 
Offset.

von Reinhard (gotbread)


Lesenswert?

wenn ich es in asm nicht zum laufen bekomme, nehm ich C, aber das ist ja
nicht die lösung des register-problems, header und definitionen sind 
alle
richtig, woran kann es den noch liegen?

von Walter (Gast)


Lesenswert?

welchen Wert hat denn CONTROLLER_DDR?
Was ist wenn du stattdessen desen Wert direkt nimmst?

von Karl H. (kbuchegg)


Lesenswert?

Reinhard Seibt schrieb:
> wenn ich es in asm nicht zum laufen bekomme, nehm ich C, aber das ist ja
> nicht die lösung des register-problems, header und definitionen sind
> alle
> richtig, woran kann es den noch liegen?

Das ist der gcc Assembler?

Dann liegt es daran, dass du in der libc Doku den Abschnitt über 
Assembler Programmierung nicht gelesen hast
1
      out     _SFR_IO_ADDR(CONTROLLER_DDR), r21

lies dir dir libc Doku durch, du wirst sie brauchen! Ohne hat es wenig 
bis gar keinen Sinn, sich in der Assembler Programmierung in einem C 
Programm zu versuchen.
http://www.nongnu.org/avr-libc/user-manual/pages.html

von Reinhard (gotbread)


Lesenswert?

es handelt sich in der tat um den gcc assembler.

auf diese lösung wäre ich nicht gekommen, ich les sie mir gleich
(morgen) durch.

da das problem damit hoffendlich gelöst ist, danke an euch
für eure geduld :)

ps. auch wenn ich das register direkt angesprochen hatte änderte
sich nichts

MfG Gotbread

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.