atmega i lcd + pamiec

Jul 19, 2013 70 Replies

Te¿ by mo¿na. Zdaje siê, ¿e wewnêtrznie to jest i tak 6-bitów na kolor, czyli 18 bpp. Jednak mi³o by by³o trzymaæ standard 24bpp na wypadek polepszenia siê w 2020 roku jako¶ci wy¶wietlaczy LCD. Ja my¶la³em, ¿e typ procesora np. 32-bitowy oznacza szeroko¶æ szyny danych. Zdajê sobie sprawê, ¿e pewnie niektórzy producenci maj± na my¶li co¶, co oznaczaj± jako wewnêtrzna szyna danych. Po co mi wewnêtrzna szyna danych 32-bitowa, jak z trudno¶ci± da siê wys³aæ

16-bitow± dan± na zewn±trz i to jeszcze nie z fmax? Muszê przyznaæ, ¿e standard 8-bitowy i 16-bitowy by³ znacznie prostrzy w realizacji szybkich rozwi±zañ. W szczególno¶ci przy tym projekcie, zastanawia³em siê, czy nie daæ 3 mikrokontrolerów 8-bitowych pracuj±cych @10MHz REAL PORT SPEED. np. PIC18F1320 lub dwóch 16-bitowych @40MHz np.dsPIC33. Mog³yby byæ te¿ nawet 2 ró¿nych firm, we wiadomym celu. Jak zaj±³em siê tymi pseudo 32-bitowymi, to czêsto brakuje mi takich rozwi±zañ, które by³y realizowane sprzêtowo w 8-bitowych. Kto¶ tu pisa³, ¿e nie potrzeba, bo RISC to mo¿e jaki¶ mikrokod zrobiæ i tak b êdzie szybko. No dobrze, ale te 8,16-bitowe to te¿ RISC i nie musza mieæ mikrokodu, a pracuj± z t± sam± prêdko¶ci±.

Ok, udalo sie zalatwic drugi i dziala. Pytanie teraz czy da sie zrobic tak, ze wrzucam obrazek do flash lub ram atmegi a potem skopiowac do zewmetrznego eepromu? Ii potem zmiana w sofcie ze zrodlo znajduje sie na eepromie. Czy moze zaladowac bezposrednio do eeprom (nie mam programatora niestety) i odczytywac?

W dniu 2013-08-01 15:12, Sylwester Łazar pisze:

Uszkodzony, nic nie zmienialem w konfiguracji, podlaczony nowy ruszyl z reki:)

No to musze przekopac historie internetu:)

Pamiec po ic2, dokladnie taka:

formatting link

W dniu 2013-08-01 15:10, wchpikus pisze:

Moge przelutowac sterownik, tylko nie moglem znalesc na siecie samego chipa.. T6963CFG. Przelutowanie to pikus:)

Fajnie. Mam pytanie: czy poprzedni wy¶wietlacz by³ faktycznie zepsuty, czy okaza³o siê, ¿e co¶ innego jest przyczyn± niepowodzenia?

Ju¿ kto¶ pisa³: oczywi¶cie, ¿e tak.

Mo¿na bezpo¶rednio za pomoc± kabla LPT, ale trzeba pod³±czyæ przewody i znale¼æ program. S.

W dniu 2013-08-01 15:11, wchpikus pisze:

Ma ktos lub zna jakas prosta obsluge BMP085 w Bascomie?

20k samej obslugi tego czujika...to jakas paranoja:(

wchpikus snipped-for-privacy@wytnijto.wp.pl> napisa³(a):

Gdzie jest paranoja? Wszystko masz jasno opisane w datasheecie, zaimplementuj to, co tam pisz±. Komunikacja jest po I2C, Bascom na pewno to obs³uguje. Potem zostaje Ci kalibracja, obliczenie temperatury i ci¶nienia. Najpierw opanuj odczyt i zapis rejestrów czujnika po I2C.

W dniu 2013-08-08 12:18, Grzegorz Niemirowski pisze:

Mam kilka przykladow, ale nie ogarniam za bardzo... mozesz podac mi jakis prosty przyklad?

mam taki, ale troche za duzo wazy jak dla mnie, tem moge usunac, wysokosc tez... Niestety po niemiecku bazgrane:)

'-------------------------------------------------------------------------------- 'ďđîăđŕěěŕ äë˙ îďđîńŕ äŕň÷čęŕ BMP085 'ń äŕň÷čęŕ ďđčíčěŕĺňń˙ çíŕ÷ĺíčĺ ňĺěďĺđŕňóđű, ŕáńîëţňíîăî äŕâëĺíč˙ č âűńîňű íŕä óđîâíĺě ěîđ˙ 'äŕííűĺ ďîëó÷ĺííűĺ ń ńĺíńîđŕ îňďđŕâë˙ţňń˙ â ňĺđěčíŕë 'AVRproject.ru 2012 '--------------------------------------------------------------------------------

$regfile = "m32def.dat" $crystal = 1000000

Config Graphlcd = 240 * 64 , Dataport = Portc , Controlport = Portd , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6 Cls Cursor Off

'ęîíôčăóđŕöč˙ I2C Config Sda = Portb.6 Config Scl = Portb.7 I2cinit

Config Porta.2 = Output 'podswietlenie Podsw Alias Porta.2 Podsw = 0

Dim Ac1 As Integer Dim Ac1a As Long Dim Ac2 As Integer Dim Ac3 As Integer Dim Ac4 As Word Dim Ac5 As Word Dim Ac5a As Single Dim Ac6 As Word Dim B1 As Integer Dim B2 As Integer Dim B3 As Long Dim B3a As Long Dim B4 As Long Dim B5 As Long Dim B6 As Integer Dim B6a As Long Dim B7 As Long Dim Mb As Integer Dim Mc As Integer Dim Mc2 As Long Dim Md As Integer Dim Adres As Byte Dim Wert As Byte Dim Ut As Long Dim X1 As Long Dim X1t As Single Dim X2 As Long Dim X3 As Long Dim T As Single Dim T2 As Long Dim Temperatur As String * 6 Dim Luftdruck As String * 8 Dim Druck As Single

Dim P As Long Dim P2 As Long Dim 2potenz15 As Long Dim 2potenz11 As Integer Dim 2potenz13 As Integer Dim 2potenz8 As Integer Dim 2potenz4 As Integer Dim 2potenz2 As Integer Dim 2potenz16 As Long Dim 2potenz12 As Integer Dim Potenz5255 As Single Dim Altitude As Single Dim Altitudes As String * 8 Dim Msb As Long Dim Lsb As Long Dim Up As Long Dim Druckvar As Byte Declare Sub Berechne_temp Declare Sub Berechne_druck Declare Sub Schreibe_bmp085(byval Adres As Byte , Byval Wert As Byte) Declare Sub Lese_bmp085(byval Adres As Byte , Wert As Byte) Declare Sub Lese_roh_daten Declare Sub Messen Declare Sub Lese_kalib_data

Const Addr_schreiben = &B11101110 'ŕäđĺń ěčęđîńőĺěű + çŕďčńü Const Addr_lesen = &B11101111 'ŕäđĺń ěčęđîńőĺěű + ÷ňĺíčĺ

Call Lese_kalib_data

Do

Call Messen T = T / 10 Temperatur = Fusing(t , "###.##") Potenz5255 = 1 / 5.255 Altitude = P / 101325 Altitude = Altitude ^ Potenz5255 Altitude = 1 - Altitude Altitude = Altitude * 44330 Druck = P Druck = Druck / 100 Luftdruck = Fusing(druck , "####.##") Altitudes = Fusing(altitude , "#####.##")

Locate 1 , 1 Lcd "Temp " ; Temperatur ; " C," Locate 2 , 1 Lcd " Pressure " ; Luftdruck ; " Pa," Locate 3 , 1 Lcd ; " Altitude " ; Altitudes ; " m." Wait 1

Loop

Sub Messen Locate 2 , 1 Lcd "Messen"

'Čçěĺđĺíčĺ ňĺěďĺđŕňóđű Call Schreibe_bmp085(&Hf4 , &H2E) Adres = &HF6 Call Lese_roh_daten 'Print "msb " ; Msb 'Print "lsb " ; Lsb Shift Msb , Left , 8 'Print "msb shift " ; Msb Ut = Msb + Lsb Call Berechne_temp

'Čçěĺđĺíčĺ äŕâëĺíč˙ Call Schreibe_bmp085(&Hf4 , &H74 ) Adres = &HF6 Call Lese_roh_daten Shift Msb , Left , 16 Shift Lsb , Left , 8 Up = Msb + Lsb Shift Up , Right , 6 'Print "msb " ; Msb ; "lsb " ; Lsb ; "up " ; Up Call Berechne_druck End Sub

Sub Berechne_temp 'X1 Ut = Ut - Ac6

2potenz15 = 2 ^ 15 Ac5a = Ac5 / 2potenz15 X1t = Ut * Ac5a 'Print "X1 " ; X1t

'X2

2potenz11 = 2 ^ 11 Mc2 = Mc * 2potenz11 X3 = X1t + Md X2 = Mc2 / X3 'Print "X2 " ; X2 'B5

B5 = X1t + X2 'Print "B5 " ; B5 'T

2potenz4 = 2 ^ 4 T2 = B5 + 8 T = T2 / 2potenz4

End Sub

Sub Berechne_druck 'B6 B6 = B5 - 4000 'X1

2potenz12 = 2 ^ 12 B6a = B6 * B6 B6a = B6a / 2potenz12 X1 = B2 * B6a X1 = X1 / 2potenz11 'X2 X2 = Ac2 * B6 X2 = X2 / 2potenz11 'X3 X3 = X1 + X2 'B3 Ac1a = Ac1 * 4 Ac1a = Ac1a + X3 Shift Ac1a , Left , 2 Ac1a = Ac1a + 2 B3 = Ac1a / 4 'X1 die zweite 2potenz13 = 2 ^ 13 B6a = B6 / 2potenz13 X1 = Ac3 * B6a 'X2 die zweite B6a = B6 * B6 B6a = B6a / 2potenz12 X2 = B1 * B6a 2potenz16 = 2 ^ 16 X2 = X2 / 2potenz16 'X3 die zweite X3 = X1 + X2 X3 = X3 + 2 2potenz2 = 2 ^ 2 X3 = X3 / 2potenz2 'B4 B4 = X3 + 32768 B4 = B4 * Ac4 B4 = B4 / 2potenz15 If B4 <= 0 Then B4 = B4 * -1

'Print B4 'B7 B7 = Up - B3 B3a = 50000 Shift B3a , Right , 2 ' B7 = B7 * B3a If B7 <= 0 Then B7 = B7 * -1

'Print B7 If B7 < &H80000000 Then P = B7 * 2 'Print "p1 " ; P P = P / B4 'Print "p1 " ; P Else P = B7 / B4 'Print "p2 " ; P P = P * 2 'Print "p2 " ; P End If

'Print P 'nochmal X1

2potenz8 = 2 ^ 8 P2 = P / 2potenz8 X1 = P2 * P2 'Print X1

X1 = X1 * 3038 X1 = X1 / 2potenz16 'Print X1

' nochmal X2 X2 = -7357 * P X2 = X2 / 2potenz16

'Print X2 P2 = P P = X2 + 3791 P = P + X1 P = P / 2potenz4 P = P + P2

End Sub

Sub Lese_kalib_data Locate 1 , 1 Lcd "Lese_kalib_data "

Adres = &HAA 'Ac1 lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 Ac1 = Msb + Lsb

Adres = Adres + 1 'Ac2 lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 Ac2 = Msb + Lsb

Adres = Adres + 1 'Ac3 lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 Ac3 = Msb + Lsb

Adres = Adres + 1 'Ac4 lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 Ac4 = Msb + Lsb

Adres = Adres + 1 'Ac5 lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 Ac5 = Msb + Lsb

Adres = Adres + 1 'Ac6 lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 Ac6 = Msb + Lsb

Adres = Adres + 1 'B1 lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 B1 = Msb + Lsb

Adres = Adres + 1 'B2 lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 B2 = Msb + Lsb

Adres = Adres + 1 'MB lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 Mb = Msb + Lsb

Adres = Adres + 1 'MB lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 Mc = Msb + Lsb

Adres = Adres + 1 'Md lesen Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert Shift Msb , Left , 8 Md = Msb + Lsb

Adres = Adres + 1 End Sub

Sub Lese_roh_daten Call Lese_bmp085(adres , Wert) Msb = Wert Adres = Adres + 1 Call Lese_bmp085(adres , Wert) Lsb = Wert End Sub

Sub Schreibe_bmp085(byval Adres As Byte , Byval Wert As Byte) I2cstart I2cwbyte Addr_schreiben I2cwbyte Adres I2cwbyte Wert I2cstop Waitms 10 End Sub

Sub Lese_bmp085(byval Adres As Byte , Wert As Byte) I2cstart I2cwbyte Addr_schreiben I2cwbyte Adres I2cstart I2cwbyte Addr_lesen I2crbyte Wert , Nack I2cstop Waitms 10 End Sub

wchpikus snipped-for-privacy@wytnijto.wp.pl> napisa³(a):

Nie rozumiem czego oczekujesz, przecie¿ znalaz³e¶ gotowce. Chcesz, ¿eby kto¶ z grupy uprosci³ Ci tego gotowca? Tak jak wspomnia³em, podstaw± jest komunikacja I2C. W tym kodzie co wklei³e¶ masz procedury do odczytywania i zapisywania rejestrów czujnika:

W datasheecie masz dok³adny opis tych rejestrów. Masz napisane co trzeba do tych rejestrów pisaæ i jak przetwarzaæ odczytane dane. Skoreluj sobie informacje z datasheeta z tym kodem, który masz. Przecie¿ nazwy zmiennych s± takie same, a kod wcale nie jest d³ugi. Na stronie 13 masz ramkê "calculate true pressure", obliczenia, które tam s±, znajdziesz bez trudu w tym kodzie co wklei³e¶. Reszta kodu to deklaracje zmiennych, komunikacja po I2C i obs³uga wy¶wietlacza.

Ok, poradzilem sobie. Pytanie, czy ktos mial tak, ze przeklamywal o 18 jednostek cisnienia wg tego co podaja na stacji pogody? Moze cos zle przeliczam..

18hPa to różnica wysokości ok. 150m. IMGW podaje ciśnienie skorygowane do poziomu morza, zazwyczaj wyższe. U mnie poprawka wynosi +19hPa.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required