RTC a ext.eeprom 24LC16B na společně sběrnici ICC

Odpovědět
johan
Příspěvky: 31
Registrován: 20 bře 2013, 00:19
Bydliště: Ostrava

RTC a ext.eeprom 24LC16B na společně sběrnici ICC

Příspěvek od johan »

Ještě jednou zdravím

V tomto programu jsem spojil spojil hodiny které fungovaly s interní eeprom (picaxe 28x1 256byjtů(16Mhz)) naprosto dokonale.
S programem na vypisování znaků z exter.eeprom, (16Mhz) který funguje samostatně taky naprosto dokonale.

Když jsem je ale spojil (viz níže), ve smyčce "DO" "LOOP" se mi sice všechny znaky zobrazují správně, ale proměnná b18 se mi
nerefrešuje.
Oběví se mi na GLCD jako první znak nula, což je správně, ale dále se mi už další čísla (1-9) nezobrazují....nechápu proč??

"Nebije" se to nějak na ICC sběrnici? (rtc + eeprom 24LC16B)
Mám posit,že rtc vůbec nepracuje

Popisky nemusí být nutně správně, byly jen pro moji orientaci když jsem některé části kodu luštil, např.v b12 jsem měl jiné znaky...
Existuje samozřejmě i jiný "algoritmus" pro vyhledávání v jednotlivých stránkách (blocích) ext.paměti eeprom.
Prozatím jsem Putchar jen "ztriploval" čili: Putchar Putchar1 Putchar2 a to pro výběr v jednotlivých stránkách (blocích)

Díky za jakýkoliv náznak.

Kód: Vybrat vše

'Picaxe 28X1 + GLCD s dvěma řadiči Samsung KS107, tento řadič nemá CG ROM (char generator)
'znaky musíš vytvořit sám(tabulka dole)
'LCD data (DB0 - DB7)jsou zapojena na výstupním(O)portu C0 - C7.
'Řídící signály jsou zapojeny na vstupně-výstupním portu (I/O)

#picaxe 28x1
setfreq em16

Symbol RS =  0 ; D/I    zapisuje data-HIGH nebo instrukce-LOW (příkazy)
'Symbol RW =  1 ; R/W    budeš zapisovat data - permanentně Low!
Symbol EN =  2 ; ENABLE     
Symbol CS1 = 5 ; CS1 (chip select1)  řadič vlevo
Symbol CS2 = 6 ; CS2 (chip select2)  řadič vpravo
Symbol Res = 7 ; RESET  tento vývod není nutný a stačí ho připojit na +5V.permanentně High

let dirsc=%11111111

'--------------------------------------------------------------------------------------

    i2cslave %11010000, i2cslow, i2cbyte    'definovvání RTC DS1307 na sběrnici


let b20 = $00	   'BCD format /sekundy
let b21 = $59	   '           /minuty
let b22 = $23	   '           /hodiny
let b23 = $07      '           /den v týdnu
let b24 = $31      '           /den
let b25 = $12      '           /měsíc
let b26 = $13      '           /rok
'let b27 = %00010000   'Povolen výstup na 1Hz ve 12hod modu

'Gosub WriteToI2C     'zapiš jen jednou do ext.eeprom

GoSub Init
	
  b0 = %00111111   '63 =instrukce pro zapnutí GLCD
  GoSub Wrins    
  
    GoSub ClearLcd
    

    writei2c 0,(b20,b21,b22,b23,b24,b25,b26, b27)  'zapíše čas do DS1307
 

do

   readi2c 0,(b20,b21,b22,b23,b24,b25,b26)    
		
	 
  'Převede BCD hodnotu na jednotlivé ASCII byty.  

BCDTOASCII b20,b19,b18	' sekundy mají dvě cifry 00 proto b10 desítky a b11 jednotky
BCDTOASCII b21,b17,b16	' minuty  mají dvě cifry 00 proto b12 desítky a b13 jednotky
BCDTOASCII b22,b5,b4	
BCDTOASCII b23,b27,b15  ' vrací hodnoty 01-07
BCDTOASCII b24,b6,b7
BCDTOASCII b25,b8,b9	
BCDTOASCII b26,b13,b14	
'----------------------------------------------------------------------------------------
	
b10 = 0    'consoleX  b10= 1 odsadí sloupec o bajt, b10= 2 odsadí sloupec o 2bajty... atd
b11 = 0    'consoleY  b11= 1 odsadí řádek o bajt, b11= 2 odsadí řádek o 2bajty... atd

  'postupně zapisuje na obrazovku,znaky a hodnoty v b12

        b12 = b18 : GoSub PutChar 'jednotky sekund
        b12 = 0  : GoSub PutChar  'mezera
	b12 = 4  : GoSub PutChar1 'D
	b12 = 1  : GoSub PutChar2 'a
        b12 = 14 : GoSub PutChar2 'n
	b12 = 11 : GoSub PutChar2 'k
	b12 = 15 : GoSub PutChar2 'o
	b12 = 0  : GoSub PutChar  'mezera
        b12 = 10 : GoSub PutChar1 'J
	b12 = 1  : GoSub PutChar2 'a
	b12 = 14 : GoSub PutChar2 'n
	
loop	

Init:
	High pinsc En      
	High pinsc CS1
	High pinsc CS2
	'Pause 1000    'Prodleva před clear LCD-může být kratší
	High pinsc RS
	'Pause 500     'Prodleva před clear LCD-může být kratší
    Return

Wrins:
	Pins = b0
	Low pinsc RS       'zápis instrukcí
	
	high pinsc EN   'pulsout C.EN,1  ...mi nešlo
	low pinsc EN
    Return

Wrdata:
	Pins = b0
	High pinsc RS      'zápis dat
		
	high pinsc EN     'pulsout C.EN,1  ...mi nešlo
	low pinsc EN
    Return
    

       GotoX:       'nastavení počátečních instrukcí pro vertical stránky 0-7
      	b0 = b0 And 7
      	b0 = b0 + %10111000 '+184 = page0   (%10111/001 = 185 = page1)
           GoTo Wrins
	
       GotoY:        'nastavení počátečních instrukci pro horizontál stránky adresu0-63
      	b0 = b0 And 63
      	b0 = b0 + %01000000 '+64 = řádek0   (%01/000001 = 65 = řádek1)
           GoTo Wrins


 

ClearLcd:
	For b2 = 0 To 7  'nastavení jednotlivých stránek 0-7.Jako první stránka0
		b0 = b2
	     GoSub GotoX  'nastaví počáteční instrukci "0" pro vertical
		
		b0 = 0
	     GoSub GotoY  'nastaví počáteční instrukci "0" pro horizontál
	
		b0 = 0
	    For b3 = 0 To 63    'začne mazat(zapisovat nuly)Jako první jsou na řadě obě Page0 v CS1 a CS2 
			GoSub Wrdata
	    Next b3
	    
	Next b2
  Return       'odskok - navrat na b10 a b11
  
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
PutMap:
   i2cslave %10100000, i2cfast_16, i2cbyte 'bude číst jen z nulté stránky (bloku)

	b1 = b0 * 8       '4*8=32 toto je počáteční misto pro čtení z writei2c..
     	For b2 = 0 To 7      'popořadě bude nabírat jeden bajt za druhým
	  Readi2c b1,(b0)    '...a hodnota bajtu z tohoto místa
		GoSub Wrdata   'každý bajt zapíše do vertikály (nahoře LSB,dole MSB)
		b1 = b1 + 1  'další místo pro načtení z writei2c je místo 33(33bajt)
	Next b2
	'end
  Return  'zapsal 8.sloupců dat v prvním sektoru vlevo nahoře,Pokračuje na High CS1
'--------------------------------------------------------------------------------

PutChar:
	b0 = b11          'předá hodnotu
	GoSub GotoX
	b0 = b10 * 8      '0*8=0 začne definovat znak od prvního bitu horizontálně
	If b0 < 64 Then
		low pinsc CS2     '0-63,vypne druhý řadič
	Else
		Low pinsc CS1     '64-128,vypne první řadič
		b0 = b0 - 64
	EndIf
	
	GoSub GotoY
	b0 = b12      'b12 consola znaků
	GoSub PutMap
	High pinsc CS1
	High pinsc CS2
	
        b10 = b10 + 1     'odsadí sloupec pro nový znak(už druhý)o 1bajt
	   If b10 = 16 Then   'dořádku se vejde pouze 16 znaků(0-15)
        b10 = 0           'při 17 znaku odřádkuje
	
      	b11 = b11 + 1  'odsadí řádek pro nový znak o 1bajt.K tomu dojde jen v případě že b10=16
	       If b11 = 8 Then 'do sloupce se vejde pouze 8 znaků(0-7)
       	b11 = 0    'při 9 znaku začne opět v prvním sektoru vlevo nahoře
       	
		EndIf
	EndIf
	Return
'-----------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------	

PutMap1:
   i2cslave %10100010, i2cfast_16, i2cbyte 'bude číst jen z první stránky (bloku)

	b1 = b0 * 8       '4*8=32 toto je počáteční misto pro čtení z writei2c..
     	For b2 = 0 To 7      'popořadě bude nabírat jeden bajt za druhým
	  Readi2c b1,(b0)    '...a hodnota bajtu z tohoto místa
		GoSub Wrdata   'každý bajt zapíše do vertikály (nahoře LSB,dole MSB)
		b1 = b1 + 1  'další místo pro načtení z writei2c je místo 33(33bajt)
	Next b2
	'end
  Return  'zapsal 8.sloupců dat v prvním sektoru vlevo nahoře (písmeno D)Pokračuje na High CS1
'--------------------------------------------------------------------------------

PutChar1:
	b0 = b11          'předá hodnotu
	GoSub GotoX
	b0 = b10 * 8      '0*8=0 začne definovat znak od prvního bitu horizontálně
	If b0 < 64 Then
		low pinsc CS2     '0-63,vypne druhý řadič
	Else
		Low pinsc CS1     '64-128,vypne první řadič
		b0 = b0 - 64
	EndIf
	
	GoSub GotoY
	b0 = b12      'b12 consola znaků
	GoSub PutMap1
	High pinsc CS1
	High pinsc CS2
	
        b10 = b10 + 1     'odsadí sloupec pro nový znak(už druhý)o 1bajt
	   If b10 = 16 Then   'dořádku se vejde pouze 16 znaků(0-15)
        b10 = 0           'při 17 znaku odřádkuje
	
      	b11 = b11 + 1  'odsadí řádek pro nový znak o 1bajt.K tomu dojde jen v případě že b10=16
	       If b11 = 8 Then 'do sloupce se vejde pouze 8 znaků(0-7)
       	b11 = 0    'při 9 znaku začne opět v prvním sektoru vlevo nahoře
       	
		EndIf
	EndIf
	Return
'----------------------------------------------------------------------------------
'----------------------------------------------------------------------------------
	
PutMap2:
   i2cslave %10100100, i2cfast_16, i2cbyte 'bude číst jen z druhé stránky (bloku)

	b1 = b0 * 8       '4*8=32 toto je počáteční misto pro čtení z writei2c..
     	For b2 = 0 To 7      'popořadě bude nabírat jeden bajt za druhým
	  Readi2c b1,(b0)    '...a hodnota bajtu z tohoto místa
		GoSub Wrdata   'každý bajt zapíše do vertikály (nahoře LSB,dole MSB)
		b1 = b1 + 1  'další místo pro načtení z writei2c je místo 33(33bajt)
	Next b2
	'end
  Return  'zapsal 8.sloupců dat v prvním sektoru vlevo nahoře (písmeno D)Pokračuje na High CS1
'--------------------------------------------------------------------------------

PutChar2:
	b0 = b11          'předá hodnotu
	GoSub GotoX
	b0 = b10 * 8      '0*8=0 začne definovat znak od prvního bitu horizontálně
	If b0 < 64 Then
		low pinsc CS2     '0-63,vypne druhý řadič
	Else
		Low pinsc CS1     '64-128,vypne první řadič
		b0 = b0 - 64
	EndIf
	
	GoSub GotoY
	b0 = b12      'b12 consola znaků
	GoSub PutMap2
	High pinsc CS1
	High pinsc CS2
	
        b10 = b10 + 1     'odsadí sloupec pro nový znak(už druhý)o 1bajt
	   If b10 = 16 Then   'dořádku se vejde pouze 16 znaků(0-15)
        b10 = 0           'při 17 znaku odřádkuje
	
      	b11 = b11 + 1  'odsadí řádek pro nový znak o 1bajt.K tomu dojde jen v případě že b10=16
	       If b11 = 8 Then 'do sloupce se vejde pouze 8 znaků(0-7)
       	b11 = 0    'při 9 znaku začne opět v prvním sektoru vlevo nahoře
       	
		EndIf
	EndIf
	Return
'-----------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------

WriteToI2C:

'Zápis do EEPROM stačí jen jednou.
'Nastavit 0.stránku (blok)

i2cslave %10100000, i2cfast, i2cbyte

'Zapsat 32 znaků

writei2c $00,(0,0,0,0,0,0,0,0)       'mezera     ascii = 32 dekadicky
'pause 10                                'měla by být takto dlouhá pausa před dalším zápisem
writei2c $08,(0,0,6,95,6,0,0,0)      '!
writei2c $10,(0,7,3,0,7,3,0,0)       '" 
writei2c $18,(0,36,126,36,126,36,0,0)' # 
writei2c $20,(0,36,43,106,18,0,0,0)  ' $ 
writei2c $28,(0,99,19,8,100,99,0,0)  ' % 
writei2c $30,(0,54,73,86,32,80,0,0)  ' & 
writei2c $38,(0,0,7,3,0,0,0,0)       ' '  apostrof
writei2c $40,(0,0,62,65,0,0,0,0)     '( 
writei2c $48,(0,0,65,62,0,0,0,0)     ') 
writei2c $50,(0,8,62,28,62,8,0,0)    ' * 
writei2c $58,(0,8,8,62,8,8,0,0)      ' + 
writei2c $60,(0,0,224,96,0,0,0,0)    ' ,  čárka za slovem
writei2c $68,(0,8,8,8,8,8,0,0)       ' -  pomlčka
writei2c $70,(0,0,96,96,0,0,0,0)     ' .  tečka
writei2c $78,(0,32,16,8,4,2,0,0)     ' /                       1.blok 256 Bajtů
writei2c $80,(0,62,81,73,69,62,0,0)  ' 0 
writei2c $88,(0,0,66,127,64,0,0,0)   ' 1                  
writei2c $90,(0,98,81,73,73,70,0,0)  ' 2 
writei2c $98,(0,34,73,73,73,54,0,0)  ' 3 
writei2c $A0,(0,24,20,18,127,16,0,0) ' 4 
writei2c $A8,(0,47,73,73,73,49,0,0)  ' 5 
writei2c $B0,(0,60,74,73,73,48,0,0)  ' 6 
writei2c $B8,(0,1,113,9,5,3,0,0)     ' 7
writei2c $C0,(0,54,73,73,73,54,0,0)  ' 8
writei2c $C8,(0,6,73,73,41,30,0,0)   ' 9
writei2c $D0,(0,0,108,108,0,0,0,0)   ' :  dvojtečka
writei2c $D8,(0,0,236,108,0,0,0,0)   ' ;  středník
writei2c $E0,(0,8,20,34,65,0,0,0)    ' <
writei2c $E8,(0,36,36,36,36,36,0,0)  ' =
writei2c $F0,(0,0,65,34,20,8,0,0)    ' >
writei2c $F8,(0,2,1,89,9,6,0,0)      ' ?          ascii = 63 dekadicky



'Nastavit 1.stránku (blok)

i2cslave %10100010, i2cfast, i2cbyte

'Zapsat 32 znaků

writei2c $00,(0,62,65,93,85,30,0,0)   ' @         v ascii = 64 dekadicky
writei2c $08,(0,126,17,17,17,126,0,0) ' A
writei2c $10,(0,127,73,73,73,54,0,0)  ' B
writei2c $18,(0,62,65,65,65,34,0,0)   ' C
writei2c $20,(0,127,65,65,65,62,0,0)  ' D
writei2c $28,(0,127,73,73,73,65,0,0)  ' E
writei2c $30,(0,127,9,9,9,1,0,0)      ' F
writei2c $38,(0,62,65,73,73,122,0,0)  ' G
writei2c $40,(0,127,8,8,8,127,0,0)    ' H
writei2c $48,(0,0,65,127,65,0,0,0)    ' I
writei2c $50,(0,48,64,64,64,63,0,0)   ' J
writei2c $58,(0,127,8,20,34,65,0,0)   ' K
writei2c $60,(0,127,64,64,64,64,0,0)  ' L
writei2c $68,(0,127,2,4,2,127,0,0)    ' M
writei2c $70,(0,127,2,4,8,127,0,0)    ' N
writei2c $78,(0,62,65,65,65,62,0,0)   ' O          2.blok 256 Bajtů
writei2c $80,(0,127,9,9,9,6,0,0)      ' P
writei2c $88,(0,62,65,81,33,94,0,0)   ' Q
writei2c $90,(0,127,9,9,25,102,0,0)   ' R
writei2c $98,(0,38,73,73,73,50,0,0)   ' S
writei2c $A0,(0,1,1,127,1,1,0,0)      ' T
writei2c $A8,(0,63,64,64,64,63,0,0)   ' U
writei2c $B0,(0,31,32,64,32,31,0,0)   ' V
writei2c $B8,(0,63,64,60,64,63,0,0)   ' W
writei2c $C0,(0,99,20,8,20,99,0,0)    ' X
writei2c $C8,(0,7,8,112,8,7,0,0)      ' Y
writei2c $D0,(0,113,73,69,67,0,0,0)   ' Z
writei2c $D8,(0,0,127,65,65,0,0,0)    ' [
writei2c $E0,(0,2,4,8,16,32,0,0)      ' \
writei2c $E8,(0,0,65,65,127,0,0,0)    ' ]
writei2c $F0,(0,4,2,1,2,4,0,0)                 ' ^  stříška
writei2c $F8,(128,128,128,128,128,128,128,128) ' _       v ascii = 95 dekadicky



'Nastavit 2.stránku (blok)

i2cslave %10100100, i2cfast, i2cbyte

'Zapsat 31 znaků

writei2c $00,(0,0,3,7,0,0,0,0)        ' `  obrácený apostrof
writei2c $08,(0,32,84,84,84,120,0,0)  ' a
writei2c $10,(0,127,68,68,68,56,0,0)  ' b
writei2c $18,(0,56,68,68,68,40,0,0)   ' c
writei2c $20,(0,56,68,68,68,127,0,0)  ' d
writei2c $28,(0,56,84,84,84,8,0,0)    ' e
writei2c $30,(0,8,126,9,9,0,0,0)      ' f
writei2c $38,(0,24,164,164,164,124,0,0) ' g
writei2c $40,(0,127,4,4,120,0,0,0)    ' h
writei2c $48,(0,0,0,125,64,0,0,0)     ' i
writei2c $50,(0,64,128,132,125,0,0,0) ' j
writei2c $58,(0,127,16,40,68,0,0,0)   ' k
writei2c $60,(0,0,0,127,64,0,0,0)     ' l
writei2c $68,(0,124,4,24,4,120,0,0)   ' m      
writei2c $70,(0,124,4,4,120,0,0,0)    ' n               3.blok 256 Bajtů
writei2c $78,(0,56,68,68,68,56,0,0)   ' o
writei2c $80,(0,252,68,68,68,56,0,0)  ' p
writei2c $88,(0,56,68,68,68,252,0,0)  ' q
writei2c $90,(0,68,120,68,4,8,0,0)    ' r
writei2c $98,(0,8,84,84,84,32,0,0)    ' s
writei2c $A0,(0,4,62,68,36,0,0,0)     ' t
writei2c $A8,(0,60,64,32,124,0,0,0)   ' u
writei2c $B0,(0,28,32,64,32,28,0,0)   ' v
writei2c $B8,(0,60,96,48,96,60,0,0)   ' w
writei2c $C0,(0,108,16,16,108,0,0,0)  ' x
writei2c $C8,(0,156,160,96,60,0,0,0)  ' y
writei2c $D0,(0,100,84,84,76,0,0,0)   ' z
writei2c $D8,(0,8,62,65,65,0,0,0)     ' {
writei2c $E0,(0,0,0,119,0,0,0,0)      ' |
writei2c $E8,(0,0,65,65,62,8,0,0)     ' }
writei2c $F0,(0,2,1,2,1,0,0,0)        ' ~           v ascii = 126 dekadicky

'-----------------------------------Konec ascii tabulky--------------------------------

return
johan
Příspěvky: 31
Registrován: 20 bře 2013, 00:19
Bydliště: Ostrava

Re: RTC a ext.eeprom 24LC16B na společně sběrnici ICC

Příspěvek od johan »

Ahoj
Tak jsem na to po probdělé noci a přečtení si POZORNĚ manuálu, přišel.

Poté co obrátíte cell baterii v rtc tak jak má být,čili plus na plus a mínus na mínus... :evil: ....doporučuji ještě znovu definovat rtc DS 1307 na sběrnici, a to před čtením.

Kód: Vybrat vše

 do

     i2cslave %11010000, i2cslow, i2cbyte
        readi2c 0,(b20,b21,b22,b23,b24,b25,b26)
Ted to šlape naprosto dokonale.
Odpovědět