prepojenie PIC a CDROM cez ATA
Moderátor: Moderátoři
Takto: aky mas HDD?
ked chces precitat sektor musis postupovat takto:
najprv zistit precitanim z registra "status" bit "busy" a cakat az pokial ho HDD nastavi do log.0
potom zapises do prislusnych registrov hodnoty napr. citame sektor 0 LBA=0
register "head" #1110xxxxb =>LBA, HDD MASTER a kde xxxx su najvysie 4bity z 28bitovej LBA adresy
register "cylinder msb" bity 23 az 16 LBA adresy
register "cylinder lsb" bity 15 az 8 LBA adresy
register "sector" bity 7 az 0 Z LBA adr
register "sector counter" obsahuje pocet sektorov kt. chces precitat ak zadas #0 tak musis precitat 256 sektorov, ak zadas #1 tak sa precita jeden sektor
-ked mas toto zapisane zapise do registra "command" cislo prikazu read= #10h
-teraz musis cakat minimalne 400ns na spracovanie
potom citas z registra "status" bity DRQ a BSY, pricom DRQ musi byt log.1 a BSY musi byt log.0, a este bit ERROR musi byt v log.0, inak nemozes pristupit k citaniu dat
ak su spominane bity ok, tak pristupujes k citaniu dat pricom si treba uvedomiz, ze zbernica je 16bitiva, to znamena ze po kazdom "read pulze" precitas 2bajty a ty potrebujes precitat cely sektor tj 512byte, preto musis citane opakovat celkovo 256krat...
ked chces precitat sektor musis postupovat takto:
najprv zistit precitanim z registra "status" bit "busy" a cakat az pokial ho HDD nastavi do log.0
potom zapises do prislusnych registrov hodnoty napr. citame sektor 0 LBA=0
register "head" #1110xxxxb =>LBA, HDD MASTER a kde xxxx su najvysie 4bity z 28bitovej LBA adresy
register "cylinder msb" bity 23 az 16 LBA adresy
register "cylinder lsb" bity 15 az 8 LBA adresy
register "sector" bity 7 az 0 Z LBA adr
register "sector counter" obsahuje pocet sektorov kt. chces precitat ak zadas #0 tak musis precitat 256 sektorov, ak zadas #1 tak sa precita jeden sektor
-ked mas toto zapisane zapise do registra "command" cislo prikazu read= #10h
-teraz musis cakat minimalne 400ns na spracovanie
potom citas z registra "status" bity DRQ a BSY, pricom DRQ musi byt log.1 a BSY musi byt log.0, a este bit ERROR musi byt v log.0, inak nemozes pristupit k citaniu dat
ak su spominane bity ok, tak pristupujes k citaniu dat pricom si treba uvedomiz, ze zbernica je 16bitiva, to znamena ze po kazdom "read pulze" precitas 2bajty a ty potrebujes precitat cely sektor tj 512byte, preto musis citane opakovat celkovo 256krat...
jaaaj ja som ale vol ja som myslel že ked dam 1 tak staci precitat data register raz , nieje ta hodnota 20h na precitanie? http://elektronika.kvalitne.cz/ATMEL/ne ... F_HDD.html
Teraz uz chapem tomu co je tam pisane
Idm to vyskusat, dakujem za vysvetlenie
EDIT: HDD mam 2,5GB western digital.
dakujem za uistenie na ten prikaz 20h
Teraz uz chapem tomu co je tam pisane
Idm to vyskusat, dakujem za vysvetlenie
EDIT: HDD mam 2,5GB western digital.
dakujem za uistenie na ten prikaz 20h
Naposledy upravil(a) mikollar dne 02 pro 2007, 21:37, celkem upraveno 1 x.
mam tento problem. zapisem udaje sector sector count ... atd.
Do comand registru zapisem 30H cakam 400ns
otestujem BUSSY a DRQ ak su 0 a 1 zvolim adresu DATA REGISTER, na datove vodice privediem data a signal RW stiahnem na LOG0 cakam 400ns RW signal spat do LOG1 a odteraz somnou prestane HDD komunikovat.
Prikladam asm kod pre zapis: WAIT je cakanie odpocitava sa register naplneny hdnotou 255 do 0.
Na PORTD su privedene vodice A0 A1 A2, A0 je PORTD,0 , A1 je PORTD,1 , A2 je PORTD,2
Hodnoty adries mam ulozené tu:
MOVLW B'00000000'
MOVWF DATA_R
MOVLW B'00000010'
MOVWF COUNT_R
MOVLW B'00000011'
MOVWF SECTOR_R
MOVLW B'00000100'
MOVWF LOW_R
MOVLW B'00000101'
MOVWF HI_R
MOVLW B'00000110'
MOVWF DHR_R
MOVLW B'00000111'
MOVWF STATUS_R
_WR EQU 0 ;port 0
_RD EQU 1 ; port 1
Prosim v com moze byt problem resp. kde robim chybu?
Dakujem
P.S. vodice CS0 a CS1 su trvalo pripojene na GND a +5V
Do comand registru zapisem 30H cakam 400ns
otestujem BUSSY a DRQ ak su 0 a 1 zvolim adresu DATA REGISTER, na datove vodice privediem data a signal RW stiahnem na LOG0 cakam 400ns RW signal spat do LOG1 a odteraz somnou prestane HDD komunikovat.
Prikladam asm kod pre zapis: WAIT je cakanie odpocitava sa register naplneny hdnotou 255 do 0.
Na PORTD su privedene vodice A0 A1 A2, A0 je PORTD,0 , A1 je PORTD,1 , A2 je PORTD,2
Hodnoty adries mam ulozené tu:
MOVLW B'00000000'
MOVWF DATA_R
MOVLW B'00000010'
MOVWF COUNT_R
MOVLW B'00000011'
MOVWF SECTOR_R
MOVLW B'00000100'
MOVWF LOW_R
MOVLW B'00000101'
MOVWF HI_R
MOVLW B'00000110'
MOVWF DHR_R
MOVLW B'00000111'
MOVWF STATUS_R
_WR EQU 0 ;port 0
_RD EQU 1 ; port 1
Prosim v com moze byt problem resp. kde robim chybu?
Dakujem
P.S. vodice CS0 a CS1 su trvalo pripojene na GND a +5V
Kód: Vybrat vše
WRITE
BSF STATUS,RP0
MOVLW .0
MOVWF TRISB
BcF STATUS,RP0
;--------30H DO COMMAND REG ----------------------------
MOVFW STATUS_R ;do comand registru
MOVWF PORTD
MOVLW 30H ;zapis
MOVWF PORTB
bcf PORTE,_WR ;POTVRD/ZAPIS
CALL WAIT
CALL WAIT
BSF PORTE,_WR ;POTVRD/ZAPIS
ZAPIS CALL WAIT
CALL WAIT
CALL WAIT
CALL WAIT
CALL WAIT
CALL BUSSY ;zisti bussy 0
call DRQ ;zisti DRQ 1
MOVFW DATA_R ;zvolit DATA REGISTER
MOVWF PORTD
MOVLW .0 ;hodnota do DATA REGISTRU
MOVWF PORTB
bcf PORTE,_WR ;POTVRD/ZAPIS
CALL WAIT
CALL WAIT
CALL WAIT
BSF PORTE,_WR ;POTVRD/ZAPIS
DECFSZ TMP3,F ;TMP3 hodnota 0 pre zopakovanie 256 krat
GOTO ZAPIS
RETURN
pri citani sektora z hdd zapisujes do command registru 20h anie 30h!mikollar píše:Do comand registru zapisem 30H cakam 400ns
inak ak ides citat z data registra resp.ostatnych registrov, tak pouzijes riadiaci signal "IORD" tj. z log.1 do Log.0 a zas do log.1, ak ides zapisovat do registrov tak na zapis pouzijes signal "IOWR" z klud. stavu tj. log.1 do log.0 a znova do log.1 atd...
najprv dobre sprav citanie z HDD, a potom sa pustaj do zapisu, ten je zrejme zlozitejsi, ja osobne nemam este vyskusany zapis sektora do hdd...myslim, ze chces z toho spravit mp3 prehravac, takze si myslim, ze na zaciatok citanie staci a este bude zaujmave rozlusknut suborovy sytem FAT16 resp FAT32...
skusil som precitat LBA 0 , vsetkych 512B, stale mi to hadze hodnotu 58h, len na 2 miestach to vyhodi hodnotu 5Ah, HDD je naformatovany na 2 partition FAT16
Zbytok programu je v predchadzajucom prispevku
Mam chybu v zadavani dat do HDD v programe?
Dakujem
Zbytok programu je v predchadzajucom prispevku
Mam chybu v zadavani dat do HDD v programe?
Dakujem
Kód: Vybrat vše
READ
BSF STATUS,RP0
MOVLW .0
MOVWF TRISB
BcF STATUS,RP0
;--------20H DO COMMAND REG ----------------------------
MOVFW STATUS_R
MOVWF PORTA
MOVLW 20H ;CITAJ
MOVWF PORTB
bcf PORTE,_WR ;POTVRD/ZAPIS
CALL WAIT
BSF PORTE,_WR ;POTVRD/ZAPIS
CALL WAIT
CITAJ CALL BUSSY
call DRQ
BSF STATUS,RP0
MOVLW .255
MOVWF TRISB
BcF STATUS,RP0
MOVFW DATA_R
MOVWF PORTA
bcf PORTE,_RD ;POTVRD/ZAPIS
CALL WAIT
CALL WAIT
CALL WAIT
MOVFW PORTB ;POSLI DOLNYCH 8 BITOV NA RS232
CALL SER_TX
MOVFW PORTD ;POSLI HORNYCH 8 BITOV NA RS232
CALL SER_TX
BSF PORTE,_RD ;POTVRD/ZAPIS
CALL WAIT
DECFSZ TMP3,F
GOTO CITAJ
BSF STATUS,RP0
MOVLW .0
MOVWF TRISB
BcF STATUS,RP0
RETURN