Mar Postat Decembrie 17, 2009 Partajează Postat Decembrie 17, 2009 Am scris urmatorul asm cod ca sa comunic cu un 25C080 si 18F452 dar nu pot sa scriu si sa citesc din locatia de memorie 10 (0Ah). Programul trebiue sa scrie la adresa de memorie 0Ah cifra 2 (32h) si apoi sa afiseze pe LCD. Va rog sa va uitati peste el si sa-mi spuneti unde gresesc.Pic-ul utilizeaza un rezonator (quartz) 10MHz, este probabil prea rapid pentru eeprom deoarece nu afiseza nimic pe LCD? movlw 90hmovwf 0xF94 ; set input TRISC ( RX and SDI)movlw 80hmovwf 0xFC7 ; SMP=1 from SSPSTATmovlw 31hmovwf 0xFC6 ; SSPEN=1, ckp=1, FC/16 from SSPCON1write_10bcf 0xF83, 1 ; low chip selectmovlw 01h ; write status register (WRSR)call outputmovlw 06h ; enable write operation (WREN)call outputmovlw 02h ; write data to memory ...(WRITE)call outputmovlw 00h ; write MSB addresscall outputmovlw 0Ah ; write LSB addresscall outputmovlw 33h ; write datacall outputbsf 0x F83, 1 ; high chip selectbcf 0xF83, 1 ; low chip selectmovlw 04h ; disable write operation (WRDI)call outputbsf 0xF83,1 ; high chip selectcall delay ; 5ms delayreturnread_10bcf 0xF83, 1 ; low chip selectmovlw 05h ; read status register (RDSR)call outputmovlw 03h ; read data from memory (READ)call outputmovlw 00h ; read MSB addresscall output movlw 0Ah ; read LSB addresscall outputmovwf label ; RAM memorybsf 0xF83,1 ; high chip selectreturnoutputmovwf 0xFC9 ; SSPBUF registerloopbtfss 0xFC7, 0 ; test buffer full status bitbra lopretlw 0 Multumesc Link spre comentariu
vsurducan Postat Decembrie 18, 2009 Partajează Postat Decembrie 18, 2009 Doua chestiuni imi mai aduc aminte la SPI: doar SDI este configurat automat prin intializarea modului SPI, SDO si SCK nu, deci astea trebuie initializate din TRIS,verifica in datasheet ca-i asa si la PIC-ul tau.Apoi sunt situatii cand trebuie sa trimiti un caracter dummy ca sa initializezi comunicatia. Apoi nu se vede ce-i cu CKP si CKE.Cand faci hi-lo un pin IO fara macar un nop intre instructiuni nu-i prea in regula...Daca ai programat bine SMP nu-i prea repede, uita-te pe "oscioloscop" Link spre comentariu
Vizitator blacksword Postat Decembrie 19, 2009 Partajează Postat Decembrie 19, 2009 C18 - main.c #include "p18f452.h"#include "delays.h"#include "spi.h"#define LCD_RW PORTBbits.RB6 #define LCD_RS PORTBbits.RB5 #define LCD_E PORTBbits.RB4 #define SPI_CS PORTCbits.RC2#pragma config OSC = HSvoid afisare(unsigned int);void comanda(unsigned int);void lcd_initializare(void);void main(){ int i;//port lcd TRISB=0; PORTB=0;//tris CS TRISCbits.TRISC2 = 0;//spi SPI_CS = 0; OpenSPI(SPI_FOSC_4, MODE_00, SMPMID); SPI_CS = 1;//scrie SPI_CS = 0; putcSPI(SPI_WREN); SPI_CS = 1; SPI_CS = 0; putcSPI(2); putcSPI(0x00); putcSPI(0x0A); putcSPI(0x32); SPI_CS = 1; //delay 5ms Delay100TCYx(125);//citeste SPI_CS = 0; putcSPI(3); putcSPI(0x00); putcSPI(0x0A); i = getcSPI(); SPI_CS = 1; //lcd lcd_initializare(); afisare(i); while(1){ };}void lcd_initializare(void){LCD_E = 0;LCD_RS = 0;LCD_RW = 0;Delay10KTCYx(10);comanda(0b00000010);comanda(0b00101000);comanda(0b00001100);comanda(0b00000001);comanda(0b00000010);}//afisare pe 4 bitivoid afisare(unsigned int caracter){PORTB=caracter >> 4;LCD_RS = 1;LCD_E = 1;LCD_E = 0;LCD_RS = 0;PORTB=caracter & 0x0f;LCD_RS = 1;LCD_E = 1;LCD_E = 0;LCD_RS = 0;Delay100TCYx(625);}//comenzi pe 4 bitivoid comanda(unsigned int comanda){PORTB=comanda >> 4;LCD_E = 1;LCD_E = 0;PORTB=comanda &0x0f;LCD_E = 1;LCD_E = 0;Delay1KTCYx(10);} Link spre comentariu
Mar Postat Decembrie 20, 2009 Autor Partajează Postat Decembrie 20, 2009 Din TRIS am setat SDI pe input si SDO si SCK pe output.Spune-mi te rog ce este caractedul dummy?Am verificat pe osciloscop si pic-ul trimite SCK si SDO dar nu primeste nimic de la memorie.Acu ori nu e initializarea memoriei corecta desi cred ca am respectat toate instructiunile de initializare ori viteza e prea mare. Dar nici asa nu inteleg de ce nu primesc ceva de la memorie deoarece am testat memoria la diferite viteze (Fosc/ 4 si Fosc/16) . Link spre comentariu
Liviu M Postat Decembrie 20, 2009 Partajează Postat Decembrie 20, 2009 Frecventa maxima (pentru 5V) e 3 MHz. FC/16 e, zic eu, suficient de mic.Chip select (CS) e legat/setat bine (o schema cu legaturile poate n-ar strica)? Face ce trebuie (se duce in 0) pe perioada comunicatiei (asta verificat cu osciloscopul pe pinul CS al memoriei)?Pinul HOLD cum il tii?SCK cate pulsuri da (SO-memorie e activ in ultimii tacti (24-31))?Hai, baga mai multe date, poate iese ceva. Link spre comentariu
Mar Postat Decembrie 21, 2009 Autor Partajează Postat Decembrie 21, 2009 In fisierul pdf este schema pe care am utilizat-o si pe osciloscop pentru SCK si SDO imi afiseaza la fel ca in fisier. Dar la SDI nu vad nimic. Nu este cazul sa pui fisiere care exista pe net ca aplicatii la producator http://ww1.microchip.com/downloads/en/A ... 01006a.pdf Sofian Link spre comentariu
Liviu M Postat Decembrie 21, 2009 Partajează Postat Decembrie 21, 2009 1. In pdf nu vad nici un 18F452. Chiar ma interesa schema folosita de tine.2. N-ai zis nimic de CS (chip select). Esti sigur ca asta face ce-i trebuie? Simptomele descrise de tine (nici un raspuns) seamana a circuit "neadresat" (de asta se ocupa CS). Link spre comentariu
Mar Postat Decembrie 21, 2009 Autor Partajează Postat Decembrie 21, 2009 Din fisierul pdf , schema de conectare a eepromului am utilizat-o ca referinta.De asemenea formasemnalului din fisierul atasat le obtin si eu pe osciloscop, dar nu si semnalul SDI de la eeprom.Acest lucru ma face sa cred ca nu am initializat bine memoria, insa nu stiu ce nu e bine.Probabil WREN, WRDI, WRSR, RDSR etc. trebiue puse in alta ordine.In locul procesorului de acolo am inlocuit pic-ul meu (18F 452) si am schimbat pinii SCK,SDI si SDO.Adica: SCK de la eeprom -> pin 18 (RC3) SCK 18F452 SDI de la eeprom -> pin 24 (RC5) SDO 18F452 SDO de la eeprom -> pin 23 (RC4) SDI 18F452Secventa de program de mai sus este facuta de mine pentru PIC18F452.Pentru CS am ales pinul 20 (RD1) si l-am setat pe low in timpul comunicatiei, dar pentru comoditate se poate seta orice alt pin. Link spre comentariu
Liviu M Postat Decembrie 21, 2009 Partajează Postat Decembrie 21, 2009 Si pana la urma, CS se duce in 0 sau nu? Te-ai uitat si la el cu osciloscopul?Ca restul de semnale par in regula (banui ca HOLD si WP le-ai legat ca in PDF).Si pana la urma SDO memorie e chiar in three-state (undeva intre 0 si 1), sau e stabil in 0/1?In rest, nu prea vad ce ai putea sa setezi in memorie ca sa nu raspunda chiar deloc (am vazut ca poti inhiba scrierea, da' citirea nu; recunosc, n-am citit toata documentatia memoriei). Link spre comentariu
Vizitator blacksword Postat Decembrie 21, 2009 Partajează Postat Decembrie 21, 2009 Am scris urmatorul asm cod ca sa comunic cu un 25C080 si 18F452 dar nu pot sa scriu si sa citesc din locatia de memorie 10 (0Ah). Programul trebiue sa scrie la adresa de memorie 0Ah cifra 2 (32h) si apoi sa afiseze pe LCD. Va rog sa va uitati peste el si sa-mi spuneti unde gresesc.Pic-ul utilizeaza un rezonator (quartz) 10MHz, este probabil prea rapid pentru eeprom deoarece nu afiseza nimic pe LCD? MultumescPosteaza, te rog, tot codul folosit.(daca C-u' nu este agreat) Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum