Sari la conținut
ELFORUM - Forumul electronistilor

Mcu pic16f877a si Card Sd (MMC)


Drk_alien

Postări Recomandate

Eu am conectat pinii asa cum arata exemplul asta. E posibil sa configurezi pinii in functie de preferinta?

Ai dreptate, e posibil sa nu fi conectat eu bine pinii ...

De preferat ar fi sa ii pot eu configura, dar cum?...e posibil?

Posted Image

Am gasit configuratia asta.Cred ca asta e ceea ce am eu nevoie. :freaza: . Cand ajung acasa asta e primul lucru pe care il fac. :rade:

Posted Image

Mersi...... revin cu detalii.

Link spre comentariu
  • Răspunsuri 30
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Drk_alien

    16

  • Liviu M

    10

  • deejay2k1

    1

  • nooob64

    1

Top autori în acest subiect

Imagini postate

Functiile pe care le-ai folosit tu sunt pentru portul SPI hard. In descrierea lor, scrie clar:

You need PIC MCU with hardware integrated SPI.

Daca vrei sa folosesti port SPI soft, trebuie sa folosesti functii din biblioteca softSpi,caz in care poti sa-ti alegi singur pinii la care sa legi slave-ul. Eu unul as folosi varianta hard, ca la o adica poti folosi intreruperile pentru optimizarea procesului.
Link spre comentariu

Am incercat aseara noile conexiuni dar nu am reusit nimik.Am conectat asa: Cs->RB2 ( am incercat si cu RC0 cum arata in exemplul cu pic18f4520 - just in case ) Sck->RB1 Mosi(Data in)-> RB0 Miso(Datat out)->RC7Pentru a vedea pana unde ajunge codul si daca s-a initializat cardul am folosit un display de nokia 3310 pt a afisa mesaje. Atunci cand aveam conexiunea facuta si in cod afisam doar un mesaj de test pt display pic-ul porneste, cand am adugat codul care initializeaza Spi-ul, pic-ul a murit, nici macar nu a mai afisat mesajul de test de dinainte de a ajunge la linia de cod care initializeaza SPI-ul. :nas: Nu inteleg de ce se intampla asta. Nu am nici cea mai vaga idee.Cand am scos liniile de cod care initizeaza spi-ul, pic-ul merge ca uns. :cry: .Nu prea stiu ce sa mai fac. Acesta e punctul culminant al proiectului pt ca doar partea cu cardul mai trebuie sa functioneze si apoi ma incep sa scriu intregul cod.ps: vreau sa fac un editor de text ( folosesc: display nokia 3310, tastatura ps2, si cardul pentru a salva fisierul text )

Link spre comentariu

Salut,

 

Semnalele de comunicatie SPI sunt denumite cam ciudat:

- MISO inseamna Master Input Slave Output. Asta inseamna ca pinul MISO al cardului trebuie legat la SDI, care in cazul PIC18F4550 e RB0;

- MOSI inseamna Master Output Slave Input. Legatura se face intre MOSI card si SDO PIC18F4550, aduca pinul RC7.

- CLK e clar, e clockul, se leaga la RB1

- Avand un singur slave, poti lega CS-ul cardului direct la masa. Daca nu, poti folosi pinul SS al picului - RA5.

Dupa parerea mea, ai legat cardul gresit.

 

Pentru discutii asupra eventualelor probleme din cod e nevoie de... cod. :rade:

Asa ca daca nu-i prea secret, posteaza si bucata de cod buclucasa.

 

Succes,

Livu

 

PS Desi am folosit des comunicatia SPI si ma impac binisor cu ea, n-a fost niciodata folosind PIC-uri, asa ca sunt sanse sa fi spus si prostii. Sper insa ca nu.

Link spre comentariu

Diseara o sa pun codul, acum sunt la munca.Nu e nimik secret...doar ca e ceva cod si nu cred ca o sa il citeasca cineva...dar o sa scot tot ce nu e necesar.Daca o sa imi reuseasca, :dans: ,am sa postez tot proiectul pe forum.Nici nu stii cat ma bucur ca ai rabdare cu mine ....mersi.

Link spre comentariu

Asta este codul

sbit Mmc_Chip_Select           at LATC0_bit;  // for writing to output pin always use latch (PIC18 family)sbit Mmc_Chip_Select_Direction at TRISC0_bit;const LINE_LEN = 43;char err_txt[20]       = "FAT16 not found";char file_contents[LINE_LEN] = "XX MMC/SD FAT16 library by Anton Rieckertn";char           filename[14] = "MIKRO00x.TXT";          // File namesunsigned short loop, loop2;unsigned long  i, size;char           Buffer[512]; // Creates new file and writes some data to itvoid M_Create_New_File() {  filename[7] = 'A';  Mmc_Fat_Set_File_Date(2010, 4, 19, 9, 0, 0); // Set file date & time info  putstr("2|");  Mmc_Fat_Assign(&filename, 0xA0);          // Find existing file or create a new one  Mmc_Fat_Rewrite();                        // To clear file and start with new data  for(loop = 1; loop <= 99; loop++) {    UART1_Write('.');    file_contents[0] = loop / 10 + 48;    file_contents[1] = loop % 10 + 48;    Mmc_Fat_Write(file_contents, LINE_LEN-1);   // write data to the assigned file  }}void main() {  ADCON1 |= 0x0F;                  // Configure AN pins as digital  CMCON  |= 7;  TRISB = 0;  TRISD = 0;  UART1_Init(19200);      // Initialize UART module at 19200  delay_ms(100);  LCD_innit();  LCD_set_XY(0,0);  putstr("1|");  SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);  //daca comentez tot codul de aici in jos   putstr("2|");  // use fat16 quick format instead of init routine if a formatting is needed  if (Mmc_Fat_Init() == 0) {    // reinitialize spi at higher speed    SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);    //--- Test start    putstr("Test Start.");    //--- Test routines. Uncomment them one-by-one to test certain features    M_Create_New_File();  }  else   {    putstr("eroare");  }}

Pe scurt functia putscr("text") afiseaza pe ecranul de 3310 un "text".

Functiile sunt declarate mai sus dar nu cred ca au vreun rost pt a fi listate deoarece pt a conecta pic-ul cu display-ul folosesc pinii RB7-RB3.

Problema apare atunci cand se apeleaza o functie din libraria mmc, in acest caz cand se ajunge la "if (Mmc_Fat_Init() == 0)" ...dar daca linia in care apare if-ul nu e comentata nu se ajunge nici la " putstr("1|");" ....practic nici nu se initializeaza displayul, pt ca pixelii ar trebuii sa isi schimbe culoarea chiar daca nu se afiseaza ceva.

E foarte ciudat pt ca in cazul asta nici nu pot debuga programul. :sparge:

Am legat firele asa cum mi-ai zis , am pus cs-ul si pe masa si pe ra5...tot degeaba..

...pe scurt pic-ul moare daca in cod apelez undeva o functie de genul "Mmc_Fat_Init()"...care e din libraria mmc.

Link spre comentariu

Hm, in conditiile in care si display-ul comunica tot prin spi, poate n-ar fi rau sa postezi si partea de configurare (hard) a lui.

Link spre comentariu

Asta e restul de cod care vine deasupra celui de dinainte.

// LCD module connectionssbit sce at LATB7_bit;sbit res at LATB6_bit;sbit dc1 at LATB5_bit;sbit sdin at LATB4_bit;sbit sclk at LATB3_bit;sbit sce_Direction at TRISB7_bit;sbit res_Direction at TRISB6_bit;sbit dc1_Direction at TRISB5_bit;sbit sdin_Direction at TRISB4_bit;sbit sclk_Direction at TRISB3_bit; void LCD_write_byte(unsigned char dt, unsigned char command){        unsigned char i;        sce=0;        dc1=command;        for(i=0;i<8;i++)        {                if(dt&0x80)                        sdin=1;                else                        sdin=0;                dt=dt<<1;                sclk=0;                sclk=1;        }        dc1=1;        sce=1;        sdin=1;}const char table[480] = {                               0x00,0x00,0x00,0x00,0x00,        // 20 space                ASCII table for NOKIA LCD: 96 rows * 5 bytes= 480 bytes                                                        0x00,0x00,0x5f,0x00,0x00,        // 21 !                        Note that this is the same set of codes for character you                                                        0x00,0x07,0x00,0x07,0x00,        // 22 "                        would find on a HD44780 based character LCD.                                                         0x14,0x7f,0x14,0x7f,0x14,        // 23 #                        Also, given the size of the LCD (84 pixels by 48 pixels),                                                        0x24,0x2a,0x7f,0x2a,0x12,        // 24 $                        the maximum number of characters per row is only 14.                                                         0x23,0x13,0x08,0x64,0x62,        // 25 %                                                        0x36,0x49,0x55,0x22,0x50,        // 26 &                                                        0x00,0x05,0x03,0x00,0x00,        // 27 '                                                        0x00,0x1c,0x22,0x41,0x00,        // 28 (                                                        0x00,0x41,0x22,0x1c,0x00,        // 29 )                                                        0x14,0x08,0x3e,0x08,0x14,        // 2a *                                                        0x08,0x08,0x3e,0x08,0x08,        // 2b +                                                        0x00,0x50,0x30,0x00,0x00,        // 2c ,                                                        0x08,0x08,0x08,0x08,0x08,        // 2d -                                                        0x00,0x60,0x60,0x00,0x00,        // 2e .                                                        0x20,0x10,0x08,0x04,0x02,        // 2f /                                                        0x3e,0x51,0x49,0x45,0x3e,        // 30 0                                                        0x00,0x42,0x7f,0x40,0x00,        // 31 1                                                        0x42,0x61,0x51,0x49,0x46,        // 32 2                                                        0x21,0x41,0x45,0x4b,0x31,        // 33 3                                                        0x18,0x14,0x12,0x7f,0x10,        // 34 4                                                        0x27,0x45,0x45,0x45,0x39,        // 35 5                                                        0x3c,0x4a,0x49,0x49,0x30,        // 36 6                                                        0x01,0x71,0x09,0x05,0x03,        // 37 7                                                        0x36,0x49,0x49,0x49,0x36,        // 38 8                                                        0x06,0x49,0x49,0x29,0x1e,        // 39 9                                                        0x00,0x36,0x36,0x00,0x00,        // 3a :                                                        0x00,0x56,0x36,0x00,0x00,        // 3b ;                                                        0x08,0x14,0x22,0x41,0x00,        // 3c <                                                        0x14,0x14,0x14,0x14,0x14,        // 3d =                                                        0x00,0x41,0x22,0x14,0x08,        // 3e >                                                        0x02,0x01,0x51,0x09,0x06,        // 3f ?                                                        0x32,0x49,0x79,0x41,0x3e,        // 40 @                                                        0x7e,0x11,0x11,0x11,0x7e,        // 41 A                                                        0x7f,0x49,0x49,0x49,0x36,        // 42 B                                                        0x3e,0x41,0x41,0x41,0x22,        // 43 C                                                        0x7f,0x41,0x41,0x22,0x1c,        // 44 D                                                        0x7f,0x49,0x49,0x49,0x41,        // 45 E                                                        0x7f,0x09,0x09,0x09,0x01,        // 46 F                                                        0x3e,0x41,0x49,0x49,0x7a,        // 47 G                                                        0x7f,0x08,0x08,0x08,0x7f,        // 48 H                                                        0x00,0x41,0x7f,0x41,0x00,        // 49 I                                                        0x20,0x40,0x41,0x3f,0x01,        // 4a J                                                        0x7f,0x08,0x14,0x22,0x41,        // 4b K                                                        0x7f,0x40,0x40,0x40,0x40,        // 4c L                                                        0x7f,0x02,0x0c,0x02,0x7f,        // 4d M                                                        0x7f,0x04,0x08,0x10,0x7f,        // 4e N                                                        0x3e,0x41,0x41,0x41,0x3e,        // 4f O                                                        0x7f,0x09,0x09,0x09,0x06,        // 50 P                                                        0x3e,0x41,0x51,0x21,0x5e,        // 51 Q                                                        0x7f,0x09,0x19,0x29,0x46,        // 52 R                                                        0x46,0x49,0x49,0x49,0x31,        // 53 S                                                        0x01,0x01,0x7f,0x01,0x01,        // 54 T                                                        0x3f,0x40,0x40,0x40,0x3f,        // 55 U                                                        0x1f,0x20,0x40,0x20,0x1f,        // 56 V                                                        0x3f,0x40,0x38,0x40,0x3f,        // 57 W                                                        0x63,0x14,0x08,0x14,0x63,        // 58 X                                                        0x07,0x08,0x70,0x08,0x07,        // 59 Y                                                        0x61,0x51,0x49,0x45,0x43,        // 5a Z                                                        0x00,0x7f,0x41,0x41,0x00,        // 5b [                                                        0x02,0x04,0x08,0x10,0x20,        // 5c Yen Currency Sign                                                        0x00,0x41,0x41,0x7f,0x00,        // 5d ]                                                        0x04,0x02,0x01,0x02,0x04,        // 5e ^                                                        0x40,0x40,0x40,0x40,0x40,        // 5f _                                                        0x00,0x01,0x02,0x04,0x00,        // 60 `                                                        0x20,0x54,0x54,0x54,0x78,        // 61 a                                                        0x7f,0x48,0x44,0x44,0x38,        // 62 b                                                        0x38,0x44,0x44,0x44,0x20,        // 63 c                                                        0x38,0x44,0x44,0x48,0x7f,        // 64 d                                                        0x38,0x54,0x54,0x54,0x18,        // 65 e                                                        0x08,0x7e,0x09,0x01,0x02,        // 66 f                                                        0x0c,0x52,0x52,0x52,0x3e,        // 67 g                                                        0x7f,0x08,0x04,0x04,0x78,        // 68 h                                                        0x00,0x44,0x7d,0x40,0x00,        // 69 i                                                        0x20,0x40,0x44,0x3d,0x00,        // 6a j                                                        0x7f,0x10,0x28,0x44,0x00,        // 6b k                                                        0x00,0x41,0x7f,0x40,0x00,        // 6c l                                                        0x7c,0x04,0x18,0x04,0x78,        // 6d m                                                        0x7c,0x08,0x04,0x04,0x78,        // 6e n                                                        0x38,0x44,0x44,0x44,0x38,        // 6f o                                                        0x7c,0x14,0x14,0x14,0x08,        // 70 p                                                        0x08,0x14,0x14,0x18,0x7c,        // 71 q                                                        0x7c,0x08,0x04,0x04,0x08,        // 72 r                                                        0x48,0x54,0x54,0x54,0x20,        // 73 s                                                        0x04,0x3f,0x44,0x40,0x20,        // 74 t                                                        0x3c,0x40,0x40,0x20,0x7c,        // 75 u                                                        0x1c,0x20,0x40,0x20,0x1c,        // 76 v                                                        0x3c,0x40,0x30,0x40,0x3c,        // 77 w                                                        0x44,0x28,0x10,0x28,0x44,        // 78 x                                                        0x0c,0x50,0x50,0x50,0x3c,        // 79 y                                                        0x44,0x64,0x54,0x4c,0x44,        // 7a z                                                        0x00,0x08,0x36,0x41,0x00,        // 7b <                                                        0x00,0x00,0x7f,0x00,0x00,        // 7c |                                                        0x00,0x41,0x36,0x08,0x00,        // 7d >                                                        0x10,0x08,0x08,0x10,0x08,        // 7e Right Arrow         ->                                                        0x78,0x46,0x41,0x46,0x78};void clockdata(char bits_in){        int bitcnt;        for (bitcnt=8; bitcnt>0; bitcnt--)                {                        sclk = 0;                                                                //Set Clock Idle level LOW.                        if ((bits_in&0x80)==0x80) {sdin=1;}                // PCD8544 clocks in theMSb first.                        else {sdin=0;}                        sclk = 1;                                                                //Data is clocked on the rising edge of SCK.                        bits_in=bits_in<<1;                                                // Logicalshift data by 1 bit left.                }}      void writecom(char command_in){        dc1 = 0;                                // Select Command register.        sce = 0;                                // Select Chip.        clockdata(command_in);        // Clock in command bits.        sce = 1;                                // Deselect Chip.}  void LCD_set_XY(unsigned char X, unsigned char Y){          writecom(0x40|(Y&0x07));        // Y axis        writecom(0x80|(X&0x7f));        // X axis}void writedata(unsigned char data_in){        dc1 = 1;                                // Select Data register.        sce = 0;                                // Select Chip.        clockdata(data_in);                // Clock in data bits.        sce = 1;                                // Deselect Chip.}void putchar(char character){        int tablept, count, char_column;        if ((character<0x20)||(character>0x7f)) {return;}                // Exit function if character is not found.        tablept = ((5*character) - 160);                                                // Point to the columns of the character in the table.        for (count=5;count>0;count--)                                                        // Draw the columns to print the character.        {                char_column = table[tablept];                writedata(char_column);                tablept++;        }        writedata(0x00);                                                                                // 1 pixel spacing per character.}  void putstr( char *s){        while(*s) {putchar(*s++);}                                                                // Points to one ASCII to be written one at a time.} void clearram(void){        int ddram;        LCD_set_XY(0,0);         // Cursor Home.        for (ddram=504;ddram>0;ddram--)        {writedata(0x00);}                // 6*84 = 504 DDRAMaddresses.}void LCD_innit(){      res = 1;                // Set _RES HIGH.        sce = 1;                // Disable Chip.        res = 0;                // Reset the LCD.        Delay_ms(100);        // Wait 100ms.        res = 1;                // Awake LCD from RESET state.        writecom(0x21);                // Activate Chip and H=1.        writecom(0xC2);                // Set LCD Voltage to about 7V.        writecom(0x13);                // Adjust voltage bias.        writecom(0x20);                // Horizontal addressing and H=0.        writecom(0x09);                // Activate all segments.        clearram();                        // Erase all pixel on the DDRAM.        writecom(0x08);                // Blank the Display.        writecom(0x0C);                // Display Normal.        LCD_set_XY(0,0);                // Cursor Home.}
Link spre comentariu

Salut,imi pare rau, nu vad nimic in neregula.Pentru ca zici ca totul "ingheata" cand "activezi" functiile MMC dar inainte sa le folosesti si pentru ca ultima comanda executata pare a fi putstr(), singura idee pe care o mai am ar fi sa schimbi numele functiilor putchar() si putstr() (in nokia_putchar si nokia_putstr, de exemplu), ca sa fii sigur ca mikroc n-are alte functii similare "interne" pe care sa le apeleze in locul celor pe care le vrei tu.Daca nici asta nu e, nu mai stiu ce sa zic (in afara de sa-ti scrii singur functiile de comunicatie cu cardul).Succes,LiviuLE Am gasit la mikre bibliotecile cu functii si cele 2 mentionate de mine mai sus nu par a fi implementate in niciuna, asa ca probabil ideea de mai sus n-o sa imbunatateasca nimic, da' nu te costa prea mult sa incerci.

Link spre comentariu

Inainte de asta am incercat sa fac debug punand in poarta A 5v. Tot ingheata si asa (adica nu pune ). Asta fara sa folosesc displayul sau functiile lui. Deci sigur nu are legatura cu asta. :cry: ...nu stiu ce sa mai fac.Ar trebuii sa fie usor sa folosesc un stik de memorie si sa scriu prin usb in loc de card?( si comunicarea cu cardul ar trebuii sa fi fost desutl de usoara) Ma gandesc la asta ca o varianta secundara pt proiectul meu.

Link spre comentariu

Nu cred ca poti folosi USB-ul din PIC pentru comunicatia cu un stick.Pentru a comunica cu un stick ai nevoie de un USB-host si eu nu stiu sa poti face un usb-host folosind PIC-ul asta. Da' eu nu le stiu chiar pe toate, e adevarat.M-am mai uitat putin si in data-sheet, si in codul tau si:- modului MSSP (spi) si EUSART (rs232) au un pin comun - RB1. Ori incerci cu softSpi, ori renunti (temporar) la rs232, sa vezi daca merge.Pe de alta parte, cititind eu inca putinprin helpul de la biblioteca MMC la mikroe, am gasit

Library uses SPI module for communication. The user must initialize the appropriate SPI module before using the MMC Library.

Am senzatia ca tu nu faci chiar toate initializarile porturilor. Sau?De exemplu, pinii trebuie configurati cu ajutorul registrilor TRIS ca intrari/iesiri (vezi pagina 197 din data-sheet-ul picului):- SDI e configurat automat cand activezi modului MSSP (sper ca spiInit asta face).- SDO - must have TRISC7 cleared - asta nu faci (sau n-am vazut eu unde)- SCK (master mode) must have TRISB1 cleared - asta faci.- Cu SS m-am grabit, e musai sa fie RA5 numai in slave mode, nu e cazul. Aici poti folosi orice pin (configurat ca iesire si definit ca in codul tau
sbit Mmc_Chip_Select           at LATxy_bit;  // for writing to output pin always use latch
Link spre comentariu

Cred ca o noua varianta pe care as putea sa o incerc ar fi, sa folosesc softSPI si sa initializez toti pinii, pinii soft sa fie exact cei hardware.Eu nu folosesc rs232, placa mea e simpla. Are doar condensatorii, oscilatorul , o rezistenta de 10K la alimentarea picului de la programator...si atat :ras: Alimentez modulul cu voltajul pe care il primeste microcontrollerul la pinul +5v de la modulul SD.

Link spre comentariu

Daca nu folosesti rs232 de ce initializezi portul?

Asta este codul

 // Creates new file and writes some data to itvoid M_Create_New_File() ...    UART1_Write('.');  ...  UART1_Init(19200);      // Initialize UART module at 19200  ...
Esti sigur ca nu folosesti portul USART?
Link spre comentariu

Era o linie de cod data in exemplul aratat in libraria mmc.Eu am copiat codul de acolo si am scos ce nu e esential dar se pare ca am uitat unele lucruri. :jytuiyu

Eu am incercat acelasi lucru cu display-ul de nokia 3310, sa afisez text ca sa vad pana unde ajunge programul.

 

Poate influenta initializarea portului?....hmmm...Nu prea stiu in detaliu ce fac aici :bataie , ceea ce nu mi se intampla des.

Asa arata "constructia".

http://thumbp14-bf1.mail.yahoo.com/tn?sid=1224466339&mid=AFzTi2IAAYHTUTeatwQPeyl1w%2Bs&midoffset=2_0_0_1_90276&partid=2&f=1617&fid=Inbox&w=768&h=559

Link spre comentariu

Pai sterge-o si vezi daca se schimba ceva.Si nu uita de

- SDO - must have TRISC7 cleared - asta nu faci (sau n-am vazut eu unde)

Succes!
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări