Witam. Select Case
'$sim $regfile = "m32def.dat" $crystal = 16000000 Rem ============================================= 'Ustawienia wyświetlacza LCD 4*20 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 Config Lcd = 20 * 4 Cls Cursor Off Waitms 500 Locate 1 , 1 Lcd " Monitor i Balancer" Waitms 200 Locate 2 , 1 Lcd " Li-ion, Li-Fe, Pb." Waitms 200 Locate 3 , 1 Lcd "Karol Ferenc 2014(c)" Waitms 200 Locate 4 , 1 Lcd "wersja 2.0 - U.L.A." Waitms 1000 Cls Waitms 100 'Config Portc = Output 'wszystkie końcówki jako wyjścia ' Portc = &B11100000 Config I2cdelay = 20 Config Sda = Portc.1 Config Scl = Portc.0 Config Single = Scientific , Digits = 3 'Const Addressw = 210 'slave write address 210 'Const Addressr = 211 'slave read address 211 Const Addressw = 208 'slave write address Const Addressr = 209 'slave read address Rem **************** Zmienne ************** Dim Pomiar1 As Byte Dim Pomiar2 As Byte Dim Pomiar3 As Byte Dim Pomiar4 As Byte Dim Nap1 As Long Dim Nap2 As Long Dim Nap3 As Long Dim V1 As Single Dim Vref As Single Do ' Gosub B1 ' Gosub B2 ' Gosub B3 ' Gosub B4 V1 = 0 Vref = 0 I2cinit I2cstart I2cwbyte Addressw '&HD2 Adrest układu MCP3421 A1T 'I2cwbyte &B10010000 'Adres 12bit 'I2cwbyte &B10010100 'Adres 14bit 'I2cwbyte &B10011000 'Adres 16bit I2cwbyte &B10011100 'Adres 18bit 3,75 SPS I2cstop I2cstart I2cwbyte Addressr '&HD3 Adrest układu MCP3421 A1T I2crbyte Pomiar1 , Ack ' górna wartość I2crbyte Pomiar2 , Ack ' średnia wartość I2crbyte Pomiar3 , Ack ' dolna wartość I2crbyte Pomiar4 , Nack ' koniec pomiaru I2cstop Nap1 = 65536 * Pomiar1 Nap2 = 256 * Pomiar2 Vref = Nap1 + Nap2 Vref = Vref + Pomiar3 Vref = Vref * 2.048 Vref = Vref * 5 V1 = Vref / 131071 If Pomiar1 = 255 Then V1 = 0 Vref = Fusing(v1 , "#.###") Locate 1 , 1 : Lcd "B1=" ; V1 ; " " Waitms 100 'Return Loop End Dlaczego wybór padł na MCP3424 bo sterowanie odbywa się przez I2c i ma przyzwoite parametry.
|
|||
Odp. Balanser Li.xxx, Atmega32+MCP3424
To chyba nieskomplikowane.. Bartek Ci to pomoże napisać. Rozumiem, że te adresy zmieniać się maja tutaj?
BARTek
Moja strona
Zgadza się. To te miejsce
Zgadza się. To te miejsce
Tak sobie siedzę przerabiam ten program, jedno dodaje drugie usuwam i sprawdzam w symulatorze i jak na razie jeszcze nie osiągnąłem rezultatu.Oto fragment przeróbki. Na wyświetlaczu nic niema poza startowym ekranem.
Balancer
Prosze. Testnij ;)
BARTek
Moja strona
Teraz to już postęp, wszystko
Teraz to już postęp, wszystko się wyświetla na lcd tylko jak pominę tą linię
Odp. Balancer
Wiesz co, jak bym przeczytał notę do tego układu to już cale bym to napisał :P i nic by nie zostało dla Ciebie.
A tak to tylko przeczytalem to co zamieściłes :D Nie wiem o co tam chodzi z brakiem tego odczytu. Ma być robiony co jakiś czas czy jak?
Poniżej kod na dwa układy ;)
BARTek
Moja strona
Jestem Ci bardzo wdzięczny za
Jestem Ci bardzo wdzięczny za wszelką okazaną mi pomoc, a co do tego przetwornika MCP3424 to podaję link - http://ww1.microchip.com/downloads/en/DeviceDoc/22088b.pdf
Może ja czegoś po prostu nie zrozumiałem z tych informacji. Jeśli po twojej analizie będzie konieczna zmiana w sofcie to byłbym bardzo wdzięczny.
Odp. Balancer
Nigdy nie używałem zewnętrznego ADC. Tak pobieżnie patrząć to SPS oznacza Samples Per Second - ilośc odczytów na sekundę. Jeśli sam wybierasz SPS 3,7 to nie można chyba odwiedzać ADC częściej niż co 300ms. Jeśli dane nie są gotowe to zwraca bład czy jakoś tak. Nie musisz chyba znać napięcia co 100ms. Spróbuj pozmieniać czasy. Czytanie całości mi się nie uśmiecha ..ale może z ciekawości :)
BARTek
Moja strona
Balancer
Witaj Bartek, sam program który przerobiłeś jest cacy! Natomiast jeśli chodzi o dziwne liczby na wyświetlaczu np. Vin=0.5V to pokazywał 1307.xxxxx-e takie śmieci lub jak to określiłeś błędem zwrotnym. Jak zmieniłem
Procek atmega128 lub atxmega128a1 , wyświetlacz graficzny 192x64, klawiatura 4x4.? chodzi oto że projekt będzie rozwijany i uniwersalny.
Moje założenie to zasilacz 0-30V , 0-10A, ładowarka, balancer itp.
Odp. Balancer
Wszystko można. Program przepisałem tak że czytanie odbywa się sekwencyjnie po jednym odczycie czyli nie trwa długo. Można bezproblemowo dodać obsługe klawiatury a wyświetlanie przesunąć do osobnego podprogramu.
Nie wiem czy nie będzie Ci przeszkadzać że Xmegi sa 3,3 volt`owe.
Można oczywiście działać na dużym procesorze, ale ja jeszcze nie napisałem programu który byłby większy niż 64KB. Bardziej przydają się dodatkowe piny mikrokontrolera.
Zastanawiałbym się jak bym miał coś kupić, ale jak już coś masz to składaj na tym co masz :D
BARTek
Moja strona
Balancer
Faktycznie xmegi są zasilana 3.3Vi to jest trochę kłopotliwe, można by stosować translatory napięć, ale za to powiększają się i koszty i PCB itd.
Zastosuje atmega128 bo taki posiadam, a ilość pinów sterujących jest w zupełności wystarczająca nawet z wyświetlaczem graficznym i tą klawiaturą, i pomiarem temp 2xDS18B20. Ciekawi mnie jeszcze jedna sprawa, czy odblokowanie przerwań i timerów nie będzie zakłócało pracy odczytu przetworników bo jak prubuję włączyć np.
Enable Interrupts
to głupoty chińszczyzna wyświeta się. Posiadam jeszcze przetwornik MCP3208 12bit i MCP3304 13bit, ale ich sterowanie odbywa się w spi no i dla mnie to też czarna magia. Co do tego mcp3208 to program balancera i sam balanser spisuje się lepiej i odczyty są szybsze w porównaniu MCP3424 który próbuję uruchomić. Teraz cały czas testuję w symulatorze w przeróżnych wariantach tego mcp3424.Odp. Balancer
Tak się dzieje bo, pewnie nieświadomie, używasz programowej I2C.
I2C wymyślił i opatentował Philips. Atmel nie mógł go na początku używać więc by móc się komunikować z układami wyposażonymi w te magistrale obsługiwał je programowo. Po pewnym czasie opracowali swoje rozwiązanie i nazwali TWI (Two Wire Interface). Od tej pory sa one wbudowane jako osobny moduł sprzętowy jak Timer, Uart lub SPI. Moduł TWI nie ma problemów z przerwaniami. Działa obok jak piec w kotłowni. Softwarowe/programowe I2C to nic innego jak program który macha pinami i jego działanie można przerwać własnie przerwaniem. Teraz to do czego zmierzam.
Jeśli procesor posiada sprzętowe TWI to należy z niego korzystać. Włącza się je powołując do programu bibliotekę która to obsługuje. Co ciekawe nawet kod programu się zmniejsza ;) Trzeba jednak podłączyć się do pinów oznaczonych w nocie jako SDA i SCL.
To trzeba wpisać gdzieś na początku programu zanim użyjesz I2C
Jeśli tylko masz chęci to za niedługo będziesz wiedział tyle samo albo więcej :)
Warto mieć pod ręką polskiego Helpa (jak nie znajdziesz to daj znać na maila to Ci linknę ;) i skrót do Wiki Bascom w przeglądarce :D http://wiki.mcselec.com/bavr/BASCOM-AVR_Help
Tam można przeczytać o innych bibliotekach do TWI (I2Cv2.lib, I2c.lib)
SPI jest proste. Mniej "typowe" układy można obsłużyć poleceniami Shiftout i Shiftin. Kliknij na opis w wiki ;)
Na końcu przerwania trzeba przemyśleć. Czyli te cykliczne ustawić na największe czasy jakie Ci są potrzebne, albo możesz ustawić. Programowanie to chęci plus umiejętności i pomysłowość w rozwiązywaniu problemów ;)
Niech Ci lutownica dobrze grzeje a procesor słucha hahahahaha :D
BARTek
Moja strona