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