picbasic, pic18f452 ve 24c256 sorunu

Başlatan ahmetu, 19 Ağustos 2003, 21:38:16

ahmetu

bu üçlü bir araya geldimi seri eproma ne yazmak ne de okumak mümkün olmuyor, kodu proteus'da simule ettim orada bile çalışmıyor önerisi olan arkadaş varmı?
Bugüne kadar 24c02 kullanmıştım hiç sorun yaşamadım.

byka

dostum 24c256 nın data sheetine iyice baktın mı acaba gözden kacırdıgın bir sey ler olmasın :(
DWIN LCD Satış Türkiye email:info@kamantek.com  web:http://www.kamantek.com/shop/index.php

ahmetu

24c02 ile arasındaki tek fark aynı kabloya dört adet bağlayabilmen, bide adres değişkeninin word olarak tanımlanması gerektiği demek istediğim chip select adresi değil, epromun içindeki verinin adresi, aynı sorunu hitech c ile de yaşamıştım onların forumuna iki kez yazdım hiç kimse cevap veremedi, anladığım kadarıyla sorun SSPCON registerinden yada timing sorunundan kaynaklanıyor ama işin içinden çıkamadım. Picbasic'in seri eprom timingleriyle ilgili sorunları varmış ve hesapta 2.40 versiyonda düzeltmişler ama bende işe yaramıyor.

ahmetu

az önce ccs c compiler indirip kurdum 24c256'ya sorunsuz okuyup yazabiliyor bu da protesu simulasyonunun sonucu

0          [STOPPED    ]: Address select pin(s) changed. New device address determined as 0.
9.20199175 [STOPPED    ]: Start condition detected.
9.20209015 [RX_CMD     ]: Command received: 0xA0 (0b10100000). Device=0, Block=0x00, Address=0xFFFFFFFF RD/WR=Write.
9.20209515 [START_ACK  ]: Start of acknowledge - driving SDA low.
9.20211235 [END_ACK    ]: End of acknowledge. New state is [RX_ADDR(1)].
9.20220835 [RX_ADDR(1) ]: Upper address byte received: 0x00 (0b00000000).
9.20221335 [START_ACK  ]: Start of acknowledge - driving SDA low.
9.20223055 [END_ACK    ]: End of acknowledge. New state is [RX_ADDR(2)].
9.20232595 [RX_ADDR(2) ]: Lower address byte received: 0x01 (0b00000001). Complete address is 0x0001 (1).
9.20233095 [START_ACK  ]: Start of acknowledge - driving SDA low.
9.20234815 [END_ACK    ]: End of acknowledge. New state is [RX_DATA].
9.20244355 [RX_DATA    ]: Data received: 0x00 (0b00000000).
9.20244855 [START_ACK  ]: Start of acknowledge - driving SDA low.
9.20246575 [END_ACK    ]: End of acknowledge. New state is [RX_DATA].
9.20247195 [RX_DATA    ]: Stop condition detected.
9.20247195 [STOPPED    ]: Internal write cycle started.
9.20247195 [STOPPED    ]: Writing data 0x00 (0) to memory at address 0x0001.

ahmetu

pic basicle ise

0 [STOPPED ]: Address select pin(s) changed. New device address determined as 0.

satırından sonrası yok

mhk

Birde bunu denermisiniz.

define osc 20
@       device WDT_OFF

DEFINE I2C_SCL PORTC,3  'For 12-bit core only
DEFINE I2C_SDA PORTC,4  'For 12-bit core only

TRISA = %11111111      ' Set PORTA to all input
TRISB = %11111111          ' PORTB nin tüm bitlerini giriş ve çıkış olarak ayarla
TRISC = %10000000      ' PORTC nin tüm bitlerini çıkış olarak ayarla
TRISD = %00000000      ' PORTC nin tüm bitlerini çıkış olarak ayarla

       ADCON1 = 7      

kontrol  con %10100000
sd       var portc.4
sc       var portc.3

addr var word
deneme var byte
addr=0
'***************** ANA PROGRAM *****************
'***************** ANA PROGRAM *****************
basla:
gosub epromyaz
gosub epromoku

goto basla

'************ EPROMA YAZMA ALT PROGRAMI *********
epromyaz:
for addr = 0 to 65535
I2cwrite sd,sc,kontrol,addr,[1]
next
return


'************ EPROM OKUMA ALT PROGRAMI **********
epromoku:
for addr = 0 to 65535
I2cread sd,sc,kontrol,addr,[deneme]
next
return
end
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

ahmetu

hiç bir değişiklik yok, ben bide deneme için microchipten asm ile yazılmış i2c kodunu indirip denedim çalışıyor işte kod....


   LIST P=18C452
   #include <P18C452.INC>
   list   n=0   ; suppress list file page breaks
   list   ST=off   ; suppress list file symbol table

;************************************************************
; Register File Assignment

EEADDR   equ   0x000   ; Address register
EEDATA   equ   0x001   ; data to read/write
EESLAVE   equ   0x002   ; Device address (1010xxxy)
DelayCtr1   equ   0x003   ; delay routine counter
DelayCtr2   equ   0x004   ; delay routine counter

SlaveAddr   equ   0xA0   ; slave address literal

;************************************************************
; Vector Assignment
   ORG   0x00000
   goto   Start   ; Reset Vector

;************************************************************
; Main Program

   ORG   0x00020      ; Start of Program space
Start
   ; initialize PORTB
   clrf   LATB      ; Clear PORTB output latch
   clrf   TRISB      ; Set PORTB as all outputs
   
   ; configure SSP for hardware master mode I2C
   bsf   SSPSTAT,SMP   ; I2C slew rate control disabled
   bsf   SSPCON1,SSPM3   ; I2C master mode in hardware
   bsf   SSPCON1,SSPEN   ; enable SSP module

   movlw   0x09      ; set I2C clock rate to 100kHz
   movwf   SSPADD
   
   bsf   TRISC,3      ; I2C SCL pin is input
   bsf   PORTC,3      ; (will be controlled by SSP)
   bsf   TRISC,4      ; I2C SDA pin is input
   bsf   PORTC,4      ; (will be controlled by SSP)
   
   movlw   SlaveAddr   ; EEPROM I2C address
   movwf   EESLAVE

Main
   clrf   PORTB      ; initialize variables
   clrf   EEDATA
   clrf   EEADDR

WrEEPROM
   bsf   PORTB,7      ; indicate write, light TX LED
   rcall   Delay
   
   bcf   EESLAVE,0   ; write mode
   rcall   WakeSlave   ; gets slave attention
   rcall   WrADDR      ; sends EEPROM address
   rcall   WrDATA      ; sends data to slave
   rcall   Stop      ; send stop bit
   
   incf   PORTB,F      ; increment count
   incf   EEDATA,F   ; increment data
   incf   EEADDR,F   ; Point to next address
   
   btfss   EEADDR,7   ; at end of EEPROM?
   goto   WrEEPROM   ; no, write more data

RdLoop
   clrf   PORTB      ; initialize variables
   clrf   EEDATA
   clrf   EEADDR

RdEEPROM
   rcall   Delay
   
   bcf   EESLAVE,0   ; write mode
   rcall   WakeSlave   ; gets slave attention
   rcall   WrADDR      ; sends EEPROM address
   rcall   Stop      ; send stop bit
   
   bsf   EESLAVE,0   ; read mode
   rcall   WakeSlave   ; gets slave attention
   rcall   RdDATA      ; receive one data byte, leaves idle

   movf   EEDATA,W   ; get data
   movwf   PORTB      ; move received data to PORTB
   xorwf   EEADDR,W   ; compare data with address
   bz   GoodData   ; branch if DATA = ADDR
   rcall   Errorloop   ; DATA is wrong, indicate error
   
GoodData   incf   EEADDR,F      ; Point to next address
   btfss   EEADDR,7   ; at end of EEPROM?
   goto   RdEEPROM   ; no, read more data
   
   goto   Main      ; do it all over again
   
;************************************************************
; TX LED flashes to indicate error while displaying received data.

Errorloop
   rcall   Delay
   btg   PORTB,7      ; Toggle TX LED
   rcall   Delay
   btg   PORTB,7      ; Toggle TX LED
   rcall   Delay
   btg   PORTB,7      ; Toggle TX LED
   rcall   Delay
   btg   PORTB,7      ; Toggle TX LED
   rcall   Delay
   btg   PORTB,7      ; Toggle TX LED
   rcall   Delay
   btg   PORTB,7      ; Toggle sTX LED
   return

;************************************************************
; sends start bit, slave address
; if ACK not recieved, sends restart, tries again
; execution can get stuck in this loop if slave not present
; can be used to poll slave status (retries until slave responds)

WakeSlave
   bsf   SSPCON2,SEN   ; Send start bit
   btfsc   SSPCON2,SEN   ; Has SEN cleared yet?
   goto   $-2      ; No, loop back to test.

rWakeSlave
   bcf   PIR1,SSPIF   ; clear interrupt flag
   nop
   movf   EESLAVE,W
   movwf   SSPBUF      ; move slave address to SSPBUF
   btfss   PIR1,SSPIF      ; has SSP completed sending SLAVE Address?
   goto   $-2      ; no, loop back to test

   btfss   SSPCON2,ACKSTAT   ; was ACK received from slave?
   return         ; yes, return to calling routine

   bsf   SSPCON2,RSEN   ; send repeated start bit
   btfsc   SSPCON2,RSEN   ; has repeated start been sent yet?
   goto   $-2      ; no, loop back to test

   bra   rWakeSlave   ; send slave address again

;************************************************************
; writes EEPROM memory address, hangs if no ACK

WrADDR
   bcf   PIR1,SSPIF   ; clear interrupt flag

   movff   EEADDR,SSPBUF   ; move EEPROM address to SSPBUF
   btfss   PIR1,SSPIF   ; has SSP completed sending EEPROM Address?
   goto   $-2      ; no, loop back to test

   btfsc   SSPCON2,ACKSTAT   ; has slave sent ACK?
   goto   $-2      ; no, try again
   
   return

;************************************************************
; Sends one byte of data to slave, hangs if no ACK

WrDATA
   bcf   PIR1,SSPIF   ; clear interrupt flag

   movff   EEDATA,SSPBUF   ; move data to SSPBUF
   btfss   PIR1,SSPIF   ; has SSP completed sending data to EEPROM?
   goto   $-2      ; no, loop back to test

   btfsc   SSPCON2,ACKSTAT   ; has slave sent ACK?
   goto   $-2      ; no, try again
   
   return

;************************************************************
; receive one byte from slave
; do not send ACK, send stop bit instead

RdDATA
   bcf   PIR1,SSPIF   ; clear interrupt flag
   
   bsf   SSPCON2,RCEN   ; enable receive mode
   btfss   PIR1,SSPIF   ; has SSP received a data byte?
   goto   $-2      ; no, loop back to test

   bsf   SSPCON2,ACKDT   ; no ACK
   bsf   SSPCON2,ACKEN   ; send ACKDT bit
   
   btfsc   SSPCON2,ACKEN   ; has ACKDT bit been sent yet?
   goto   $-2      ; no, loop back to test
   
   bsf   SSPCON2,PEN   ; send stop bit
   btfsc   SSPCON2,PEN   ; has stop bit been sent?
   goto   $-2      ; no, loop back to test

   movff   SSPBUF,EEDATA   ; save data to RAM
   bcf   SSPCON2,RCEN   ; disable receive mode

   return

   
;************************************************************
; Sends stop bit, waits until sent

Stop
   bsf   SSPCON2,PEN   ; send stop bit
   btfsc   SSPCON2,PEN   ; has stop bit been sent?
   goto   $-2      ; no, loop back to test

   return
   
;************************************************************
; a delay of 98.57mS

Delay
   movlw   0x80
   movwf   DelayCtr2   ; preset
   clrf   DelayCtr1   ; clear counter

Delay1
   decfsz   DelayCtr1   ; decrement counter
   bra   Delay1      ; back to top of loop

   decfsz   DelayCtr2   ; decrement counter
   bra   Delay1      ; back to top of loop

   return


   END

ahmetu

30 ve 37 nci satırlarda : var bunu ; ile değiştirin bide simülasyon yapacaksanız

LIST P=18C452
#include <P18C452.INC>

satırları aynen kalsın 18F452 ile değiştirmeyin bu şekilde çalışıyor.

nonstradam

Ben Picbasic Pro ile 18f452 kullanarak 24c256 ya veri yazıp okuyorum hiç bir sorun yok grafik lcd font datalarını buraya yükledim gayet güzel çalışıyor.

DİKKAT!
4MHz de çalışıyorsanız, Yazma işleminden sonra minimum 5msn beklemeniz lazım.
Beklemezseniz yazmıyor...
4Mhz üzerinde çalışıyorsanız DEFINE I2C_SLOW 1 komutunu ekleyip yine her yazımdan sonra minimum 5 msn beklemiz gerekli .

okumada böyle bir beklemeye gerek yok bende gayet güzel çalışıyor...

ahmetu

artık bana sorun olmuyor çünkü picbasic'i bıraktım (kabak tadı verdi ) tavsiyem herkesin C' ye geçmesi özellikle ccs.

james

Define  LCD_DREG        PORTD  'Lcd data portu PORTD olarak seçilir
DEFINE  LCD_DBIT        0
Define  

LCD_RSREG       PORTE  'RS pininin PORTE ye bağlı olduğu belirtilir
Define  LCD_RSBIT       0      'RS'in PORTE.2 ye bağlı olduğu belirtilir
Define  LCD_EREG        PORTE

'E pininin bağlı olduğu port
Define  LCD_EBIT        2      'E pininin bağlı olduğu bacak
DEFINE  LCD_RWREG       PORTE
DEFINE  LCD_RWBIT       1
Define  

LCD_BITS        8       '8 bitlik veri yolu kullanılır
DEFINE  LCD_COMMANDUS   4000    'Command delay time in us
DEFINE  LCD_DATAUS      100     'Data delay time in us


DEFINE I2C_SCL PORTB,5'For 12-bit core only
DEFINE I2C_SDA PORTB,4 'For 12-bit core only
DEFINE  OSC 3
include

"modedefs.bas"

TRISD=0
TRISE=0
ADCON1=$0E

sclk        var     PORTB.5
sdat        var     PORTB.4
addr        var     word
veri        var    

byte
contwr      con     %10100000
contrd      con     %10100001

Main:
   addr=$0001
   I2CREAD sdat,sclk,contrd,addr,[veri]
   pause 10
   addr=$0000

 
   I2CWRITE sdat,sclk,contwr,addr,[veri]    
   pause   10    
   high portb.7
   Lcdout $FE,1
   Lcdout veri
loop:    goto    loop

yukardaki programda

eksik ne anlamadım.877 ile 3.57 mhz de çalışmıyor.4k7 pullup dirençleri kullandım.
ARAMIYORUM , BULUYORUM

byka

Alıntı yapılan: "ahmetu"artık bana sorun olmuyor çünkü picbasic'i bıraktım (kabak tadı verdi ) tavsiyem herkesin

C' ye geçmesi özellikle ccs.

nedenlerinide soylermisin.Çünkü herkes boyle diyor
C yi hep merak ettim bu gidişle C yi ogrenmeden complier'ını kullanmayı

ogrenecegiz :P
DWIN LCD Satış Türkiye email:info@kamantek.com  web:http://www.kamantek.com/shop/index.php