PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR & ATAPI



Import-Script
17.10.2003, 12:44
Hi! <BR> <BR>Bin schon seit längerem dabei, meinen PC im Auto durch zwei AVR&#39;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 &#40;90s8515 oder ATMEGA8515&#41; soll an ein CDROM angeschlossen werden und bekommt noch nen PUMP I dazu &#40;<a href="http://www.mp3pump.de" target=_top>www.mp3pump.de</a>&#41;. <BR>Habe 1999 2 St&uuml;ck von diesen PUMPs gebaut und will die halt nicht wegschmeissen. <BR> <BR>Dieser AVR wird dann &uuml;ber die serielle Schnittstelle mit nem zweiten AVR verbunden, der dann die Playersteuerung &uuml;bernimmt &#40;dem ersten AVR sagen was er machen soll, Tasten abfragen, Display ansteuern&#41;. <BR> <BR>Jetzt zu meinem Problem: <BR>Ich habe das CDROM laut t13 ATA6 angeschlossen und sterbe jedes mal, wenn ich ein Siples &#34;PLAY AUDIO&#34; 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 &#34;8515def.inc&#34; <BR> <BR>; // DATENBUS: <BR>; PORT B = IDE LOW BYTE / PUMP DATA &#40;mirrored!!! to AVR&#41; <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&#40;RAMEND&#41; <BR> out SPH,r16 <BR> ldi r16,LOW&#40;RAMEND&#41; <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 -&#62; PUMP/ IDE REGISTER SELECT <BR> ldi temp, $00 <BR> out DDRB, temp ;Port B = IN -&#62; IDE LOW <BR> ldi temp, $00 <BR> out DDRC, temp ;Port C = IN -&#62; 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>

Import-Script
17.10.2003, 12:48
PS: dass die Pausezeiten so lang sind hat den Grund, dass ich damit u.A. noch die Signaländerungen einigermassen gut aufm Oszi kontrollieren konnte. Auch mit Pausezeiten 10ns/100ns/1ms hat es nicht funktioniert.

Import-Script
17.10.2003, 18:08
Malte, <BR> <BR>im mikrocontroller.net-forum koenntest du evtl. <BR>hilfe bekommen...oder &#39;stinken&#39;dir diese genossen? <BR> <BR>viel spass mit der SACHE <BR>ed

Import-Script
17.10.2003, 21:15
@nicht <BR> <BR>1&#41; <a href="http://www.mikrocontroller.net/forum/read-1-42035.html#42035" target=_top>http://www.mikrocontroller.net/forum/read-1-42035.html#42035</a> <BR>2&#41; wieso sollten mir die leute dort stinken? <BR>3&#41; weshalb &#34;SACHE&#34;?

Import-Script
17.10.2003, 21:31
Hallo Malte, <BR>Vielleicht hilft Dir da der ein oder andere alte c&#39;t Beitrag. Mach doch mal ne Stichwortsuche bei Heise. Da war bestimmt schon mal was dabei &uuml;ber das direkte anprogrammieren von ATA-Geräten. Und dann ist meist auch Sourcecode vorhanden. <BR> <BR>Gruß Gerd <BR> <BR>PS: interessanter Link &#40;mp3pump&#41;, den Du da genannt hast.

Import-Script
24.10.2003, 21:33
Hm. habe im c&#39;t Archiv nur ein Beispiel &#40;c&#43;&#43;&#41; gefunden, welches IDENTIFY_DEVICE ausf&uuml;hrt und interpretiert. allerdings geht das &uuml;ber nen Winklotz gerätetreiber. also war das wohl nix. <BR> <BR>Was mich jetzt mal echt verwundert ist, dass ich das Status register nicht lesen kann, geschweige denn dass das cdrom auf irgendwas reagiert was ich mit ihm mache.. <BR> <BR>Also den Code oben habe ich nochmal geringf&uuml;gig korrigiert &#40;CS0 und CS1 waren vertauscht, ansonsten aber alles ok&#41;. Dann eben noch an den notwendigen Stellen &#40;SendPacket etc.&#41; das BSY flag gepr&uuml;ft. aber das bringt mir alles nix, wenn ich immer $FF auf dem Bus bekomme, wenn ich das SREG lesen will. <BR> <BR>Habe auch mal probiert DIOW und DIOR immer low zu halten und nur beim lese/schreibvorgang einen HIGH Puls zu geben. <BR>aber das funkt auch nicht. <BR>Alles was ich bis jetzt hinbekomme ist ein wirklich sauberer hardware reset mit nem Schraubendreher an Pin 1 &amp; 2 ;-&#41; <BR> <BR>Naja... wenn mir sonst keiner helfen kann/will muss ich eben alleine durch. noch ein paar valium gegen den wutanfall nehmen vorher... ;&#41;

Import-Script
25.10.2003, 00:39
Falls evtl. ein paar C-Schnipsel helfen könnten, dann schau doch mal beim yampp &#40;<a href="http://www.yampp.com" target=_top>www.yampp.com</a> , kennste eh bestimmt&#41; rein. Die neuste Version kann auch ein CD-Rom ansteuern. Ich hab mir die Quellcodes zwar runtergeladen, hatte aber noch keine Zeit mich damit zu beschäftigen. <BR> <BR>Steffen

Import-Script
03.11.2003, 00:52
Hi <BR>bist du sicher das DIOR DIOW etc. active high sind? <BR> <BR>Schau dir nochmal das datenblatt an. am betsen erstmal nur ata-3 und dann atapi draufsetzen. Eine active low leitung erkennst du an dem &#39;-&#39; vor dem namen. <BR> <BR>ansonsten kann ich dir noch das onhold projekt bei 8052.com empfehlen <BR> <BR>tobias