Register ändert sich nicht

#1947590
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
Angehängte Dateien:
#1948033
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).
Angehängte Dateien:
Gast #1948129
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?
#1948314
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.
#1948371
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.
#1948677
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
#1948760
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

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