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
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
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).
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?
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.
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?
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)
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.
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?
welchen Wert hat denn CONTROLLER_DDR? Was ist wenn du stattdessen desen Wert direkt nimmst?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.