Import-Script
17.10.2003, 12:44
Hi! <BR> <BR>Bin schon seit längerem dabei, meinen PC im Auto durch zwei AVR's zu ersetzen, um MP3 Mucke zu hören. <BR> <BR>Es geht im Prinzip um den IDE Teil, der mir Probleme macht: <BR>Ein 8515 (90s8515 oder ATMEGA8515) soll an ein CDROM angeschlossen werden und bekommt noch nen PUMP I dazu (<a href="http://www.mp3pump.de" target=_top>www.mp3pump.de</a>). <BR>Habe 1999 2 Stück von diesen PUMPs gebaut und will die halt nicht wegschmeissen. <BR> <BR>Dieser AVR wird dann über die serielle Schnittstelle mit nem zweiten AVR verbunden, der dann die Playersteuerung übernimmt (dem ersten AVR sagen was er machen soll, Tasten abfragen, Display ansteuern). <BR> <BR>Jetzt zu meinem Problem: <BR>Ich habe das CDROM laut t13 ATA6 angeschlossen und sterbe jedes mal, wenn ich ein Siples "PLAY AUDIO" Paket an das CDROM sende. es geht einfach nicht. <BR>Das einzige was ich bisher geschafft habe ist ein SPINDOWN als direkten ATA Befehl. <BR> <BR>Kann mir jemand helfen? hat jemand Infos oder fertige Implementationen des Packet Interfaces in ASM? <BR> <BR>Kann es sein, dass ich da ein bestimmtes Timing einhalten muss? sende ich die Daten zu langsam? <BR> <BR>Hoffe es stört keinen, wenn ich den kompletten Code mal hier rein setze: <BR> <BR>--------------------------- schnipf <BR> <BR>.include "8515def.inc" <BR> <BR>; // DATENBUS: <BR>; PORT B = IDE LOW BYTE / PUMP DATA (mirrored!!! to AVR) <BR>; PORT C = IDE HIGH BYTE <BR> <BR>; Pin Assignments PORT A <BR>.EQU CS0 = 0 <BR>.EQU CS1 = 1 <BR>.EQU DA0 = 2 <BR>.EQU DA1 = 4 <BR>.EQU DA2 = 3 <BR>.EQU P_CTRL0 = 6 <BR>.EQU P_CTRL1 = 5 <BR> <BR>; Pin Assignments PORT D <BR>.EQU P_DRQ = 2 <BR>.EQU P_STROBE= 5 <BR>.EQU IDE_WR = 6 <BR>.EQU IDE_RD = 7 <BR> <BR> <BR>; IDE Commands <BR>.EQU CMD_PACKET = $A0 <BR>.EQU CMD_SPINDOWN = $E0 <BR>.EQU CMD_SPINUP = $E1 <BR> <BR>; Packet Commands <BR>.EQU ATA_AUDIO_PLAY = $47 <BR> <BR>; // ALLGEMEINE REGISTERDEFINITIONEN <BR>; R01 Mirror <BR>; R20-R21 Pause2ms <BR> <BR>.DEF L = R4 <BR>.DEF H = R5 <BR> <BR>.DEF temp = r16 <BR>.DEF temp1 = r17 <BR>.DEF temp2 = r18 <BR>.DEF temp3 = r19 <BR> <BR> <BR>.CSEG <BR> rjmp reset <BR> <BR>reset: ; Stack Pointer Setup <BR> ldi r16,HIGH(RAMEND) <BR> out SPH,r16 <BR> ldi r16,LOW(RAMEND) <BR> out SPL,r16 <BR> <BR> LDI temp, $FF <BR> MOV H, temp <BR> LDI temp, $00 <BR> MOV L, temp <BR> <BR> ; IO PORT INIT <BR> ldi temp, $ff <BR> out DDRA, temp ;Port A = OUT -> PUMP/ IDE REGISTER SELECT <BR> ldi temp, $00 <BR> out DDRB, temp ;Port B = IN -> IDE LOW <BR> ldi temp, $00 <BR> out DDRC, temp ;Port C = IN -> IDE HIGH <BR> ldi temp, 0b11100000 <BR> out DDRD, temp ;Port D = 5-7 = OUT, rest = IN <BR> <BR> SBI PORTD, IDE_WR <BR> SBI PORTD, IDE_RD <BR> <BR> RCALL Pause100ms <BR> RCALL Pause100ms <BR> RCALL Pause100ms <BR> <BR> ;RCALL IDE_WaitReady <BR> <BR> <BR> <BR>Main: <BR> RCALL Pause100ms <BR> RCALL IDE_InitPacket <BR> RCALL Pause100ms <BR> RCALL Pause100ms <BR> RCALL Pause100ms <BR> RCALL Audio_Play <BR> <BR> <BR>Loop: RJMP loop ; PROGRAM HALT <BR> <BR> <BR> <BR>IDE_InitPacket: <BR> LDI temp, CMD_PACKET <BR> RCALL IDE_SetCommand <BR> ; now Send 12 bytes PACKET <BR> RET <BR> <BR>Audio_Play: <BR> LDI temp1, ATA_AUDIO_PLAY <BR> LDI temp, $00 <BR> RCALL IDE_SetData <BR> LDI temp1, 1 <BR> LDI temp, 1 ; Start Minute <BR> RCALL IDE_SetData <BR> LDI temp1, 1 ; Start Second <BR> LDI temp, 1 ; Start Frame <BR> RCALL IDE_SetData <BR> LDI temp1, 2 ; End Minute <BR> LDI temp, 2 ; End Second <BR> RCALL IDE_SetData <BR> LDI temp1, 2 ; End Frame <BR> LDI temp, 2 <BR> RCALL IDE_SetData <BR> LDI temp1, $00 <BR> LDI temp, $00 <BR> RCALL IDE_SetData <BR> RET <BR> <BR> <BR>IDE_WaitReady: <BR> ; Wait until IDE RESET Complete <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL IDE_GetStatus <BR> SBRS temp, 6 ; RDY=bit6 <BR> RJMP IDE_WaitReady <BR> RET <BR> <BR>IDE_GetStatus: <BR> ; Read the Status register of IDE drive <BR> CBI PORTA, CS0 <BR> SBI PORTA, CS1 <BR> SBI PORTA, DA0 <BR> SBI PORTA, DA1 <BR> SBI PORTA, DA2 ; Set Status register address <BR> RCALL IDE_Read <BR> RET <BR> <BR>IDE_SetCommand: <BR> ; Send IDE Command <BR> CBI PORTA, CS0 <BR> SBI PORTA, CS1 <BR> SBI PORTA, DA0 <BR> SBI PORTA, DA1 <BR> SBI PORTA, DA2 ; Set Command register address <BR> RCALL IDE_Write <BR> RET <BR> <BR>IDE_SetData: <BR> ; Write DATA to IDE drive <BR> CBI PORTA, CS0 <BR> SBI PORTA, CS1 <BR> CBI PORTA, DA0 <BR> CBI PORTA, DA1 <BR> CBI PORTA, DA2 ; Set DATA register address <BR> RCALL IDE_Write <BR> RET <BR> <BR> <BR>IDE_Read: <BR> ; SET PB / PC to INPUT <BR> ldi temp, $00 <BR> out DDRB, temp <BR> out DDRC, temp <BR> ; Set xyz ns read Strobe <BR> RCALL Pause1ms <BR> CBI PORTD, IDE_RD <BR> RCALL Pause10ms <BR> IN temp, PINB <BR> IN temp1, PINC <BR> SBI PORTD, IDE_RD <BR> RCALL Mirror <BR> RET <BR> <BR>IDE_Write: <BR> ; SET PB / PC to OUTPUT <BR> out DDRB, H <BR> out DDRC, H <BR> ; Set xyz ns read Strobe <BR> RCALL Mirror <BR> OUT PORTB, temp <BR> OUT PORTC, temp1 <BR> RCALL Pause1ms <BR> CBI PORTD, IDE_WR <BR> RCALL Pause10ms <BR> SBI PORTD, IDE_WR <BR> RET <BR> <BR>IDE_Reset: <BR> SBI PORTA, CS0 <BR> CBI PORTA, CS1 <BR> CBI PORTA, DA0 <BR> SBI PORTA, DA1 <BR> SBI PORTA, DA2 ; Set Status register address <BR> LDI temp, 0b00000100 <BR> RCALL IDE_Write <BR> RCALL Pause10ms <BR> RCALL IDE_WaitReady <BR> RET <BR> <BR>IDE_Master_Select: <BR> CBI PORTA, CS0 <BR> SBI PORTA, CS1 <BR> CBI PORTA, DA0 <BR> SBI PORTA, DA1 <BR> SBI PORTA, DA2 ; Set Status register address <BR> CLR temp <BR> RCALL IDE_Write <BR> RCALL Pause10ms <BR> RET <BR> <BR> <BR> <BR>Mirror: <BR> CLI <BR> ; Mirror bits in temp <BR> MOV r1, temp <BR> LDI temp, 1 <BR> Mir_Loop: <BR> ROR R1 <BR> ROL temp <BR> BRCC Mir_Loop <BR> SEI <BR> RET <BR> <BR>Pause1ms: <BR> ldi R20, $1F <BR>WGLOOP0: ldi R21, $55 <BR>WGLOOP1: dec R21 <BR> brne WGLOOP1 <BR> dec R20 <BR> brne WGLOOP0 <BR> RET <BR> <BR>Pause10ms: <BR> RCALL Pause1ms <BR> RCALL Pause1ms <BR> RCALL Pause1ms <BR> RCALL Pause1ms <BR> RCALL Pause1ms <BR> RCALL Pause1ms <BR> RCALL Pause1ms <BR> RCALL Pause1ms <BR> RCALL Pause1ms <BR> RCALL Pause1ms <BR> RET <BR> <BR> <BR>Pause100ms: <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RCALL Pause10ms <BR> RET <BR>