Skocz do zawartości

Problem z wyświetleniem napięcia z przetwornika PCF8591(I2C)


razors

Pomocna odpowiedź

Cóż, kostka poszła na pół roku do szafki i dziś trochę grzebania i olśnienie.

Nie wiem dlaczego ale wszystko spowodowane było tym, że prawdopodobnie bascomowa biblioteka do obsługi sprzętowego i2c (twi) ma jakiś błąd (ogólnie ta biblioteka dziwnie się zachowuje na dłuższą metę, jak i wiele innych rzeczy w bascomie, ale to inna sprawa).

Ostatecznie uruchomienie na zwykłym, programowym i2c z rezystorami 4k7, wszystko pięknie ruszyło i jest pełna 8bitowa rozdzielczość 😃

poniżej kody dla potomnych (oba działają)

$regfile = "m644pdef.dat"
$crystal = 16000000
Config Sda = Portc.1
Config Scl = Portc.0
$baud = 9600
'(
Dim Trf(8) As Byte , Ot As Byte , Incs As Bit , Tmp As Byte

Ot = 0
Incs = 1
Tmp = &B01000000
'Tmp = &B00000000
Do
Trf(1) = Tmp
Trf(2) = Ot
Trf(3) = Ot
I2csend &B10010000 , Trf(1) , 3
Trf(1) = Tmp + 0
Trf(3) = Tmp + 1
Trf(5) = Tmp + 2
Trf(7) = Tmp + 3
I2cstart
I2creceive &B10010000 , Trf(1) , 1 , 2
I2creceive &B10010000 , Trf(3) , 1 , 2
I2creceive &B10010000 , Trf(5) , 1 , 2
I2creceive &B10010000 , Trf(7) , 1 , 2
I2cstop
Print "I0: " ; Trf(2) ; "   "
'Print "I1: " ; Trf(4) ; "   "
'Print "I2: " ; Trf(6) ; "   "
'Print "I3: " ; Trf(8) ; "   "
'Print "O0: " ; Ot ; "   "
Waitms 250
If Incs = 1 Then
Incr Ot
If Ot = 255 Then Incs = 0
Else
Decr Ot
If Ot = 0 Then Incs = 1
End If

Loop
')

Const Pcf8591w = &B10010000
Const Pcf8591r = &B10010001

Dim Pom As Byte

I2cinit

Do

I2cstart
I2cwbyte Pcf8591w
I2cwbyte &B00000000
'I2cwbyte &B00000000
I2cstop
'konfiguracja, wybór kanału 1

I2cstart
I2cwbyte Pcf8591r
I2crbyte Pom , Ack
I2crbyte Pom , Nack
I2cstop
'odczyt pomiaru

Print "I0: " ; Pom
Waitms 250

Loop

End
Link do komentarza
Share on other sites

Witam

Jestem początkującym programistom w języku Baskom. Uczę się z książki prof. Góreckiego. Do wykonywania ćwiczeń korzystam z płytki ZL11AVR z procesorem attiny2313. Jedno z ćwiczeń dotyczy programowania woltomierza przy użyciu kostki pcf8591. Niestety układ działa niewłaściwie (program z książki). Przetwornik D/A działa poprawnie natomiast zastrzeżenia mam do precyzji przetwornika A/D. By przetestować kostkę pcf napisałem program (kod poniżej) w którym stałe stabilne napięcie jest odczytywane z wejście I0 (A/D), a następnie wysyłane do wyjścia OUT (D/A). Przy ustawieniu napięcia referencyjnego 2,56V rozdzielczość przetwornika powinna wynosić 0,01V. Po zadaniu napięcia np 0,3V z portu OUT odczytuję zmieniające się losowo napięcia z zakresu 0,3V+-0,1. Podwyższając napięcie np do 1V układ zachowuje się tak samo odczyt: 1V +-0,1. Wykluczyłem uszkodzenie przetwornika, ponieważ sprawdziłem dwie kostki pcf i wyniki były takie same. Sprawdziłem także różne proponowane na forum warianty komunikacji I2C jednak bez pozytywnych rezultatów. Ostatnia rzecz jaka przychodzi mi do głowy tj. wpływ na precyzję działania przetwornika mają momenty wykonywania podprogramów wywoływanych przez timer'y?

Proszę o pomoc jak poprawnie skonfiurować przetwornik pcf..

Pozdrawiam

$regfile = "attiny2313.dat"
Config Sda = Portd.6
Config Scl = Portd.5
Dim Odczyt As Byte
Config Timer0 = Timer , Prescale = 64
Config Timer1 = Timer , Prescale = 64
Enable Interrupts
Enable Timer0
Enable Timer1
On Timer0 Nadaj
On Timer1 Odczytaj


Do : Loop : End


Odczytaj:
I2cinit
I2cstart
I2cwbyte 145
I2crbyte Odczyt , Nack
I2cstop
Return


Nadaj:
I2cinit
I2cstart
I2cwbyte 144
I2cwbyte 64
I2cwbyte Odczyt
I2cstop
Return

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Napięcia mierzę multimetrem (velleman DVM205AM) zarówno I0-GND jak i OUT-GND. W przykładzie z książki wynik pomiaru napięcia miał być wyświetlany na wyświetlaczach diodowych (cytując autora miał być precyzyjny) niestety na wyświetlaczach działa się ta sama sytuacja opisana wcześniej.

Link do komentarza
Share on other sites

Za mną kolejne próby zdiagnozowania problemu. Napięcie mierzyłem milivoltomierzem analogowym i bez zmian wartość napięcia z przetwornika D/A cały czas waha się w szerokim zakresie. Natomiast po uproszczeniu kodu do postaci

$regfile = "attiny2313.dat"
Config Sda = Portd.6
Config Scl = Portd.5
Dim Odczyt As Byte

Do
I2cinit
I2cstart
I2cwbyte 145
I2crbyte Odczyt , Nack
I2cstop
I2cstart
I2cwbyte 144
I2cwbyte 64
I2cwbyte Odczyt
I2cstop
Loop
End

wartość napięcia pod względem stabilność jest zadowalająca w granicach rozdzielczości przetwornika, natomiast występuje błąd offsetu ok. 50mV (tyle też wynosi max błąd offsetu bodany w instrukcji). Jak wyjaśnić takie zachowanie układu porównując różnice w kodach. Proszę o pomoc doświadczonych forumowiczów.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.