Assembler PS1 Controller auslesen

A1140NE

Neues Mitglied
02. Dez. 2012
7
0
0
32
Sprachen
Moin, ich hab gestern einen alten PS1 Controller gefunden und dachte mir ich versuch mich mal dran, es an nen Atmega16 auf 4mhz(interner quarz) anzuschließen.
Hier http://pinouts.ru/Game/playstation_9_pinout.shtml ist erklärt wie der Controller funktioniert.
Nun hab ich folgenden Kot produziert:
Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PSX-Controller-Routines             ;;
;;
;; Pin0 = DATA 
;; Pin1 = CMD
;; Pin2 = ATT
;; Pin3 = CLK
;; Pin4 = ACK
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

.equ C_Port = PORTA  ;Controller Port
.equ C_Pin  = PINA
.equ C_DDR  = DDRA   ;Controller DDR
.equ DATA = 0
.equ CMD  = 1
.equ ATT  = 2
.equ CLK  = 3
.equ ACK  = 4



;sends 0x01 startcommand
C_start:
	push temp1
	ldi temp1, 0b00001110

	out C_DDR, temp1 
	out C_PORT, temp1

	cbi C_PORT, ATT     ; ATT auf low 

	ldi temp1, 0x01
	rcall C_command
	
	pop temp1
	ret


;Sends Command stored temp1
C_command:
	push temp2
	push temp3
	push temp4

	in temp2, SREG

	ldi temp3, 8

C_command1:	

	lsl C_data
	ror temp1       ;LSF to carry	
	in temp4, SREG	
	
	sbrs temp4, 0    ;skip if Carrybit set
	cbi C_Port, CMD  ;clear CMD

	sbrc temp4, 0    ;skip if carrybit cleared
	sbi C_Port, CMD  ;

	cbi C_Port, CLK  ; Clock low 
					 ; Clock-impulse
	sbi C_Port, CLK  ; Clock high

	sbic C_Pin, Data  ;write C_data if C_Pin set
	sbr  C_data, 0

	sbis C_Pin, Data ;clear C_data if C_Pin cleared
	cbr  C_data, 0	
	
	
	dec temp3		 ;loop 
	brne C_command1  ;	

	sbi C_Port, CMD

	rcall mirror     ;C_data mirror
	out SREG, temp2  ;restore registers
	pop temp4
	pop temp3
	pop temp2

	ret


;mirrors C_data
mirror:
	push temp1
	push temp2
	in temp1, SREG
					
	rol C_data  ;bit7 ins carry
	ror temp2 ;carry ins bit0
	rol C_data  ;bit6 ins carry
	ror temp2  ;carry ins bit1
	rol C_data  ;bit5 ins carry
	ror temp2  ;carry ins bit2
	rol C_data ;bit4 ins carry
	ror temp2  ;carry ins bit3
	rol C_data ;bit3 ins carry
	ror temp2  ;carry ins bit4
	rol C_data ;bit2 ins carry
	ror temp2  ;carry ins bit5
	rol C_data ;bit1 ins carry
	ror temp2  ;carry ins bit6
	rol C_data ;bit0 ins carry
	ror temp2  ;carry ins bit7

	mov C_data, temp3
	out SREG, temp1
	pop temp2
	pop temp1
	ret
Aber irgendwie will das ganze nicht wie ich will, ich kann keine Daten aus dem Controller auslesen und weiß auch nicht ob mein Befehl beim Controller ankommt. Was ich mit einem Voltmeter feststellen konnte ist, dass auf DATA durchgehend 0,20 Volt anliegt, obwohl auf der Seite steht, dass es auf High sein sollte und ändern tut sich da auch nicht viel.

Ich hoffe mir kann geholfen werden
 
Hallo,

bevor ich mich in die Waagerechte begebe :boring: nen kleiner Tip ...

Was ich mit einem Voltmeter feststellen konnte ist, dass auf DATA durchgehend 0,20 Volt anliegt, obwohl auf der Seite steht, dass es auf High sein sollte und ändern tut sich da auch nicht viel.

Das ist so als wenn du in nen Einmachglas sprichst und dann den mittleren Druck im Einmachglas mißt. Meinst du das du auf dem Manometer irgendwelche Druckschwankungen deiner gesprochenen Wörter erkennst? geschweige denn die Schallwellen?

Also entweder nen Oszilloskop oder nen Lokikanalysator. Bei nem Voltmeter an einer Datenleitung kannst du dir auch gleich ne Glaskugel nehmen. :p

Gruß
Dino
 
Da ich weder nen Oszilloskop, noch ein Lokikanalysator, muss die Glaskugel herhalten :D
Mir ging es ja nur darum, ob es einen Ausschlag gibt, was ja bedeuten muss das dort am Pin irgendetwas geschiet. Außerdem soll Data ja durchgehend auf High sein, wenn nichts geschiet, dann könnte man ja diese Spannung mit dem Voltmeter messen oder nicht?
 
Hallo,

Mir ging es ja nur darum, ob es einen Ausschlag gibt, was ja bedeuten muss das dort am Pin irgendetwas geschiet. Außerdem soll Data ja durchgehend auf High sein, wenn nichts geschiet, dann könnte man ja diese Spannung mit dem Voltmeter messen oder nicht?
da ein Digitalmultimeter ja eine gewisse Abtastrate hat (Messungen/sec) kann man damit ziemlich daneben liegen. Wenn zB ab und zu Datenpakete wandern und die Abtastrate trifft immer (oder meißt) die 0-Bits, dann mißt du auch nur beinahe Null. Dann nimm eher nen analoges Multimeter. Das ist bei solchen Sachen wesentlich zuverlässiger. Da es keine Abtastrate hat arbeitet es wunderbar deine anliegenden Signale zu einem Mittelwert um. Mit einem Digitalmultimeter hast du nur eine saubere Messung wenn der Pegel über eine Sekunde oder länger sauber anliegt.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)