www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Register ändert sich nicht


Autor: Reinhard Seibt (gotbread)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Reinhard Seibt (gotbread)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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).

Autor: someone (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Reinhard Seibt (gotbread)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Reinhard Seibt (gotbread)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Reinhard Seibt (gotbread)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welchen Wert hat denn CONTROLLER_DDR?
Was ist wenn du stattdessen desen Wert direkt nimmst?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
      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

Autor: Reinhard Seibt (gotbread)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.