 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
andrej111 trgovec
Pridružen-a: Sob 15 Jan 2005 18:30 Prispevkov: 24 Aktiv.: 0.10 Kraj: Gomilica
|
Objavljeno: Pet Nov 25, 2005 12:23 am Naslov sporočila: |
|
|
Pravijo V SLOGI JE MOČ . !
HVALA BOM PREIZKUSIL |
|
Nazaj na vrh |
|
 |
andrej111 trgovec
Pridružen-a: Sob 15 Jan 2005 18:30 Prispevkov: 24 Aktiv.: 0.10 Kraj: Gomilica
|
Objavljeno: Pet Nov 25, 2005 5:32 am Naslov sporočila: |
|
|
URA JE 5 ZJUTRAJ UPAM DA MI JE USPELO.
$sim
$large
Dim Imp As Long
Declare Sub Write_eeprom(adres As Byte , Value As Byte)
Declare Sub Read_eeprom(adres As Byte , Value As Byte)
'declare constants
Const Addressw = 174
Const Addressr = 175
Dim B1 As Byte , Adres As Byte , Value As Byte
Config I2cdelay = 1
Imp = 0
Config Lcd = 16 * 2
Config Sda = P1.4
' Pin 19 DATA signal for I2CBUS
Config Scl = P1.3
Cls
Locate 1 , 2
Lcd "Stanca 1"
Locate 2 , 1
Lcd "0000000000"
Locate 2 , 14
Lcd "kom"
Call Write_eeprom(1 , 6)
Call Read_eeprom(1 , B1) : Print Value
Call Read_eeprom(6 , B1) : Print Value
Do
Gosub Tipka
Gosub Res
Loop
Tipka:
Debounce P1.0 , 0 , Stevec , Sub
Debounce P1.1 , 0 , Res , Sub
Debounce P1.5 , 0 , Tipalo , Sub
'If P1.0 = 0 Then
'Gosub Stevec
'End If
Return
Tipalo:
If P1.5 = 0 Then
I2csend &H12 , B1
I2creceive &H12 , B1
I2csend &H34 , B1
I2creceive &H34 , B1
I2csend &H56 , B1
I2creceive &H56 , B1
Print ; B1
End If
Return
Stevec:
If P1.0 = 0 Then
Incr Imp
Gosub Prik
End If
Return
Res:
If P1.1 = 0 Then
Imp = 0
Locate 2 , 1
Lcd "000000000"
Gosub Prik
End If
Return
Prik:
Lowerline
If Imp < 10 Then
Locate 2 , 10
Lcd Imp
Return
End If
If Imp > 99999 Then
Locate 2 , 5
Lcd Imp
Return
End If
If Imp > 9999 Then
Locate 2 , 6
Lcd Imp
Return
End If
If Imp > 999 Then
Locate 2 , 7
Lcd Imp
Return
End If
If Imp > 99 Then
Locate 2 , 8
Lcd Imp
Return
End If
If Imp > 9 Then
Locate 2 , 9
Lcd Imp
Return
End If
'sample of writing a byte to EEPROM AT2404
Sub Write_eeprom(adres As Byte , Value As Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Adres 'asdress of EEPROM
I2cwbyte Value 'value to write
I2cstop 'stop condition
Waitms 10 'wait for 10 milliseconds
End Sub
'sample of reading a byte from EEPROM AT2404
Sub Read_eeprom(adres As Byte , Value As Byte)
I2cstart 'generate start
I2cwbyte Addressw 'slave adsress
I2cwbyte Adres 'address of EEPROM
I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , 9 'read byte
I2cstop 'generate stop
End Sub |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Pet Nov 25, 2005 11:11 am Naslov sporočila: |
|
|
Pa se to: tista preverjavnja na sredini programa (od 99999 navzdol) bi bilo bolj elegantno postaviti v znako kot pa pisati petkrat loceno. V C-ju bi to izgledalo recimo takole (tisto med { in } je samo simbolicni zapis, ker ne vem kaj dejansko v Bascomu te stvari naredijo - hocem ti le demonstrirati zapis s FOR zanko, ki jo Bascom zagotovo tudi pozna):
for (i = 9; i <= 99999; i *= 11)
if (imp > i) {
LOCATE(2, 5 + i)
LCD(imp)
}
Koncni rezultat je bolj berljiva koda in krajsi program (= ostane ti vec prostora za druge reci). |
|
Nazaj na vrh |
|
 |
andrej111 trgovec
Pridružen-a: Sob 15 Jan 2005 18:30 Prispevkov: 24 Aktiv.: 0.10 Kraj: Gomilica
|
Objavljeno: Pet Nov 25, 2005 12:01 pm Naslov sporočila: |
|
|
Zanimivo in elegantno ni kaj. Rutina me asocira na C. Kdor zna zna. Jaz sem šele na začetku.
Sicer pa začel sem z elektronkami. Se sam sebi presenečam. No ja želim slediti zadevam koliko le morem. Hvala za nasvet. |
|
Nazaj na vrh |
|
 |
andrej111 trgovec
Pridružen-a: Sob 15 Jan 2005 18:30 Prispevkov: 24 Aktiv.: 0.10 Kraj: Gomilica
|
Objavljeno: Pet Nov 25, 2005 2:04 pm Naslov sporočila: |
|
|
Sokrat, okrog i2c je vse ok? Lahko malo preveriš? Se mogoče še da kaj strnit?
Bi bolj elegantno izgledalo..
Hvala |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Pet Nov 25, 2005 2:33 pm Naslov sporočila: |
|
|
Jaz basica res ne poznam, tako da mi ni jasno, kaj pomenijo tiste stevilke (1, 6, 2, itd.; npr. parametri Write_eeprom(), pa se kaj drugega najbrz tudi. V C-ju so take stvari precej nedvoumne, tukaj pa zgleda vse nekoliko zmedeno.
Po zapisu te funkcije sklepam, da vpises tri bajte loceno (na tri zaporedne naslove ?), z vsakokratnim naslavljanjem, kar je nepotrebno; lahko namrec posljes samo prvi naslov in potem vpises tri bajte zaporedoma (vsaj kar se I2C protokola tice - ali Bascom to zna pa ne vem). Tako se bos izognil trikratni pavzi na koncu in trikratnemu posiljanju dveh bajtov headerja (en za napravo in en za interni naslov).
Torej, ce zelis izboljsati ucinkovitost programa, potem podaj long kot parameter funkciji, ki zapise podatke v EEPROM, ta pa naj ga razbije na koscke in relevantne tri bajte poslje v enem "paketku". Alternativa temu bi bil kazalec na seznam podatkov za oddajo (bolj "univerzalna" C-jevska resitev, a ne vem ali Bascom pozna kazalce ali ne in ali ima smisel komplicirati, glede na to, da bo podatkov zmeraj enako).
Za podrobnejsi opis zapisa/branja v/iz I2C EEPROM/a (kar se tice I2C protokola) si oglej datasheet za doticni cip (pri vsakem je naslavljanje malce drugacno, odvisno od interne organizacije in kapacitete, koncept sekvencnega dostopa pa je seveda isti pri vseh). |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Pet Nov 25, 2005 2:44 pm Naslov sporočila: |
|
|
Andrej, živjo!
A imaš ti pol še kako tipalo priklopljeno na I2C vodilo?
Jaz ne vidim, da bi potem kje vmes med programom, ko stisneš tipko, šlo stvar pisat v EEPROM?!
To je takole:
main:
Do
Debounce Tipka, 0, Pisieeprom
...
loop
Pisieeprom:
Call Writeeeprom(adresa,vrednost)
goto main:
Ti si napisal, da ti samo na začetku programa bere in piše to je pa tudi vse.
Malce preglej.
LP GOrazd _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
andrej111 trgovec
Pridružen-a: Sob 15 Jan 2005 18:30 Prispevkov: 24 Aktiv.: 0.10 Kraj: Gomilica
|
Objavljeno: Pet Nov 25, 2005 8:08 pm Naslov sporočila: |
|
|
GORAZD,
KO JE P1.0=0 POTEM
PIŠE BYTE V EEPROM
A NI TAKO ?
Do
Gosub Tipka
Gosub Res
Debounce P1.5 , 0 , Pisieep , Sub
Loop |
|
Nazaj na vrh |
|
 |
andrej111 trgovec
Pridružen-a: Sob 15 Jan 2005 18:30 Prispevkov: 24 Aktiv.: 0.10 Kraj: Gomilica
|
Objavljeno: Pet Nov 25, 2005 8:40 pm Naslov sporočila: |
|
|
Zakaj mi ne vpisuje vseh treh bytov? |
|
Nazaj na vrh |
|
 |
andrej111 trgovec
Pridružen-a: Sob 15 Jan 2005 18:30 Prispevkov: 24 Aktiv.: 0.10 Kraj: Gomilica
|
Objavljeno: Pet Nov 25, 2005 10:27 pm Naslov sporočila: |
|
|
Sokrat, moram te razočarati glede rutine v c-ju za prikaz.
zadeva v bascomu žal ne deleju error 177 kar pomeni illegal operation
for (i = 9; i <= 99999; i *= 11)
if (imp > i) {
LOCATE(2, 5 + i)
LCD(imp)
} |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Pet Nov 25, 2005 11:08 pm Naslov sporočila: |
|
|
Ja seveda da ne dela v Bascomu, saj gre za dva razlicna jezika - to je tako kot ce bi Kitajcu narocil nekaj po slovensko in pricakoval, da bo on to kar razumel. Jaz sem ti to napisal za ilustracijo, kako se formira FOR zanko v basicu, bos moral pa prebrati kje druge (v navodilih od Bascoma najbrz, ali pa v kaksni splosni literaturi za basic). Ne mores kar skopirati kode iz enega jezika (npr. C-ja) v drugega (npr. basic) - to ne gre, razen ce sta jezika res sorodna (razlicni dialekti basica, C-ja, pascala, itd.). |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Pet Nov 25, 2005 11:57 pm Naslov sporočila: |
|
|
No no no...to ti pa ne bo delalo.
Poglej, najprej ti razjasnim uporabo ukaza debounce:
Debounce P1.0, 0, naredinekaj
Tako je to. Debounce, I/O pin (lahko tudi tipka, če prej uporabiš alias - Tipka ALIAS P1.0; potem gleda stanje (1 ali 0) ter kam naj skoči e.g. naredinekaj. Ti imaš tam napisano na koncu sub, in ti bo vedno skakalo na sub. Tam pa, kjer imaš za P1.0 (prik) ti bo pa šlo čez tiste If zanke, ter čez subrutini za EEPROM, kar ni uredu.
Ti moraš narediti takole:
Tipka alias P1.0
V DO LOOP zanki preverjaš stanje tipke
Glavni program:
Do
Debounce tipka, 0,pisieeprom
loop
Pisieeprom:
call writeeeprom (adresa1,podatek1)
call writeeeprom (adresa2,podatek2)
call writeeeprom (adresa3,podatek3)
goto glavni program
In to je to. AdresaX ter podatekX določiš sam, kaj ti kam shranjuje.
LP Gorazd _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
andrej111 trgovec
Pridružen-a: Sob 15 Jan 2005 18:30 Prispevkov: 24 Aktiv.: 0.10 Kraj: Gomilica
|
Objavljeno: Sob Nov 26, 2005 1:18 am Naslov sporočila: |
|
|
Bi to naj bilo tako?
$sim
$large
Dim Imp As Long
Declare Sub Write_eeprom(adres As Byte , Value As Byte)
Declare Sub Read_eeprom(adres As Byte , Value As Byte)
'declare constants
Const Addressw = 174 ' OD KOD DOBIM TE PODATKE 174,175 ?
Const Addressr = 175
Dim B1 As Byte , Adres As Byte , Value As Byte
'Dim &H12 As Byte , &H34 As Byte , &H56 As Byte
Tipka Alias P1.0
Res Alias P1.1
Config I2cdelay = 1
Imp = 0
Config Lcd = 16 * 2
Config Sda = P1.4
' Pin 19 DATA signal for I2CBUS
Config Scl = P1.3
Cls
Locate 1 , 2
Lcd "Stanca 1"
Locate 2 , 1
Lcd "0000000000"
Locate 2 , 14
Lcd "kom"
'Call Write_eeprom(1 , 6)
'Call Read_eeprom(1 , B1) : Print Value
'Call Read_eeprom(6 , B1) : Print Value
Main:
Do
Debounce P1.5 , 0 , Pisieeprom
Debounce P1.1 , 0 , Res
Debounce P1.5 , 0 , Tipalo
Gosub Tipka
Gosub Res
Loop
Tipka:
' , Sub
'Debounce P1.0 , 0 , Stevec
If P1.0 = 0 Then
Gosub Stevec
End If
Return
Tipalo:
If P1.5 = 0 Then
I2csend &H12 , B1
I2creceive &H12 , B1
I2csend &H34 , B1
I2creceive &H34 , B1
I2csend &H56 , B1
I2creceive &H56 , B1
Print ; Imp
End If
Return
Pisieeprom:
Call Write_eeprom(1 , B1)
Call Write_eeprom(2 , B1)
Call Write_eeprom(3 , B1)
Print Imp ; "dd"
Goto Main
Stevec:
If P1.0 = 0 Then
Incr Imp
Gosub Prik
End If
Return
Res:
If P1.1 = 0 Then
Imp = 0
Locate 2 , 1
Lcd "000000000"
Gosub Prik
End If
Return
Prik:
Lowerline
If Imp < 10 Then
Locate 2 , 10
Lcd Imp
Return
End If
If Imp > 99999 Then
Locate 2 , 5
Lcd Imp
Return
End If
If Imp > 9999 Then
Locate 2 , 6
Lcd Imp
Return
End If
If Imp > 999 Then
Locate 2 , 7
Lcd Imp
Return
End If
If Imp > 99 Then
Locate 2 , 8
Lcd Imp
Return
End If
If Imp > 9 Then
Locate 2 , 9
Lcd Imp
Return
End If
'sample of writing a byte to EEPROM AT2404
Sub Write_eeprom(adres As Byte , Value Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Adres 'asdress of EEPROM
I2cwbyte Value 'value to write
I2cstop 'stop condition
Waitms 10 'wait for 10 milliseconds
End Sub
'sample of reading a byte from EEPROM AT2404
Sub Read_eeprom(adres As Byte , Value Byte)
I2cstart 'generate start
I2cwbyte Addressw 'slave adsress
I2cwbyte Adres 'address of EEPROM
I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , 8 'read byte
I2cstop 'generate stop
End Sub
kJE V SIMULATORJU SI LAHKO OGLEDAM VPISANE PODATKE V EXTERNI EEPROM
ALI BASCOM SIMULATOR TEGA NE OMOGOČA ? |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Sob Nov 26, 2005 12:19 pm Naslov sporočila: |
|
|
Andrej živjo!
Preberi si tole debato na elektronu :
http://www.elektro-n.com/forum2/viewtopic.php?t=8357&highlight=long
Tukaj je opisano, kako varablo long razbiti v posamezne byte.
V tvojem primeru, lahko to vključiš kot funkcijo ter jo kličeš.
Če boš tako shrankjeval:
call writeeeprom (1,b1)
call writeeeprom (2,b1)
call writeeeprom (3,b1)
ne bo s tega nič, ker ti je v vse tri lokacije zapisalo vrednost spremenljivke b1.
Torej, ko boš ti varjablo imp hotel shraniti, jo boš moral najprej po postopku, ki ti ga opisuje zgornji link razbiti na posamezne byte, potem šele te zapisati v EEPROM.
Za maskiranje zapisa (ti odpadejo tiste 0000000) pa si poglej malce ukaz "FUSING". V Bascomu ne boš mogel simulirati delovanja I2C naprave, kot je tvoj 24cXX.
LP GOrazd _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
andrej111 trgovec
Pridružen-a: Sob 15 Jan 2005 18:30 Prispevkov: 24 Aktiv.: 0.10 Kraj: Gomilica
|
Objavljeno: Sob Nov 26, 2005 12:48 pm Naslov sporočila: |
|
|
HVALA GORAZD
JA PROBLEM JE V TEM TI MI OPISUJEŠ TA NAČIN SOKRAT PA DRUGEGA
SEDAJ VEČ NE VEM KAKO IN KAJ. SE PRAVI TISTA RUTINA ZA RAZBIJANJE
LONGA V BYTE KI JO JE NAVEDEL SOKRAT NI PRIMERNA ZA BASCOM ALI PA
PA JAZ TEGA NE ZNAM UPORABITI . BOM SEDAJ PREIZKUSIL NAČIN IZ LINKA
LP
ANDREJ |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|