Mar Posted December 17, 2009 Share Posted December 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 to comment
vsurducan Posted December 18, 2009 Share Posted December 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 to comment
Guest blacksword Posted December 19, 2009 Share Posted December 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 to comment
Mar Posted December 20, 2009 Author Share Posted December 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 to comment
Liviu M Posted December 20, 2009 Share Posted December 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 to comment
Mar Posted December 21, 2009 Author Share Posted December 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 to comment
Liviu M Posted December 21, 2009 Share Posted December 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 to comment
Mar Posted December 21, 2009 Author Share Posted December 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 to comment
Liviu M Posted December 21, 2009 Share Posted December 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 to comment
Guest blacksword Posted December 21, 2009 Share Posted December 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 to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now