No cóż, dobrze jest raz napisać własną porządną wersję obsługi 1wire, a potem uzywac wielokrotnie... ;) BTW Można używać wiele wektorów przerwań na raz, ważne aby procedury ich obsługi trwały krótko, co w Bascomie wymaga nieraz większej dłubaniny (i wymaga dogłebnej wiedzy o tym co robi kompilator z poszczególnymi poleceniami), niż w asm. Pozdrawiam,...
Wracajac do tematu czy moglbym prosic przynajmniej o pseudo kod obslugi przykladowo drgania w przyciskach , wysterowania przekaznika np przez 2s oraz komunikacji 1wire jednym timerem (atmega8 ma az 2 timery wiec pewnie szybko skoncza sie jego mozliwosci chcac napisac kod bez zatrzymywania) Cały dowcip polega na tym że z tego 8 bitowego timera możesz...
[syntax=c]#define ONE_WIRE_SET_LOW ( GPIOA->BRR |= ( 1 << 3 )) #define ONE_WIRE_SET_HIGH ( GPIOA->BSRR |= ( 1 << 3 ))[/syntax] Powinieneś użyć normalnego przypisania "=", a nie logicznej sumy "|=". Nie ma to tutaj specjalnego znaczenia, ale warto o tym pamiętać. Sprawdź w manualu, czy timer którego używasz (jak wszystkie timery na...
Tylko jeżeli będziesz wyłączał przerwania na czas obsługi 1Wire, to zliczanie czasu w przerwaniu będzie zaburzone jeżeli nie zastosowałeś trybu CTC Timera tylko zwykłe przeładowywanie Timera w przerwaniu (dokładnie to będzie się troszkę późniło).
to skąd wiedzą ile czasu minęło, przecież komunikacja osbywa się według określonego schematy czasowego. Kiedy mam procedurę odczytu w programie głównym to wszystko jest ok, kiedy tylko przeniosę rozkaz 1wread() do procedury obsługi przerwania timera2 program się sypie.
A nie lepiej po prostu wszystko na timerach i przerwaniu? Tak co mi na szybko przychodzi do glowy tolinie podpiac pod przerwanie, ustawic na detekcje zmiany zbocza. Zrobic jakas zmienna ktora mowi czy jest to przerwanie startujace czy konczace. Jesli startujace to zczytujesz czy jest to 0 czy 1 i start timera. Jesli przerwanie konczace to stop timer...
Biblioteki do obsługi 1wire nie korzystają z żadnego timera. Dodano po 9 Niestety ten zabieg też nic nie dał.
Tak, ja też uważam że skorzystanie ze sposobu stosowanego w pilotach (oczywiście bez generowania nośnej) .... to dobry pomysł. Prędkości można uzyskać o wiele wiele większe, a zorganizowanie odbioru na przerwaniu ICP jakiegoś timera sprzętowego da bardzo dobry efekt. I będzie to jakaś alternatywa dla 1wire ;) sam niedługo będę musiał nad takim rozwiązaniem...
Tak samo jak z timerami w STM32 z UARTami też nie ma problemu - zwykle są dwa jak nie trzy - w tych najmniejszych, bo w tych większych to jest np 5, a w STM32F4 jest 6. Ciężko znaleźć zastosowanie dla tych nadmiarowych, a UART jest na 1wire lepszy niż timery, bo cały bit jest załatwiony sprzętem jednorazowo, a z timerem trzeba to robić na kilka etapów...
Jedyną przewagą LM35 nad DS18b20 którą dostrzegam to ta, że nie potrzeba implementować protokołu 1-wire który bywa kłopotliwy w zetknięciu z przerwaniami. Oooj tam Kolego kłopotliwy. Zerknij: - [url=http://www.firma.stsystem.pl/compon...
(at)poorchava - a co polecasz 13latkowi, który zaczyna eksperymentować z uC? BASCOM w tym momencie daje najwięcej oczekując najmniej. Oczekując najmniej od programisty oczywiście. Od MCU wymaga całkiem sporo, jako (moim zdaniem) dość ciężki do zoptymalizowania przez kompilator język. Niemniej można zrobić łatwo i przyjemnie dużo rzeczy bez potrzeby...
Witam Mam dwa układy DS1820 podłączone do atmegi48. Obsługa transmisji przez 1wire jest wykonywana cyklicznie w timerze. Problem jest taki, że przy timerze przeskalowanym na 8 co kilka pomiarów pojawiają się dziwne wartości. Gdy przeskaluję timer powyżej 8 to pomiary zawsze dają wynik -1. Używam bascoma. Z góry dziękuję
Z dwoma bajtami uC i Dallas w 5ms wyrobią się spokojnie. Problemem jest brak synchronizacji pomiędzy przerwaniami generowanymi przez Timer a funkcją Waitms. Ponieważ przerwanie występuje teraz co 5ms to można w nim ustawić flagę że własnie się zakończyło. Wtedy w pętli głównej możesz sobie spokojnie liczyć te flagi. 50x 5ms = 250ms co bardzo tu pasuje....
Nie jestem pewny czy procesor zdąży wykonać to co masz w tym przerwaniu , zanim przyjdzie następne (mam na myśli wszystko ).Program w przerwaniu ma być krótki , chyba że pierwsza linijka jest taka " Disable timer0 " , ale w twoim programie taka instrukcja raczej odpada. I jeszcze jedno , co się dzieje jeżeli podczas transmisji po i2c lub 1Wire przyjdzie...
Nie wgrywałem, ale owszem, program taki jak Ty proponujesz będzie działał, ale jeśli pętla w funkcji main będzie miała więcej operacji do wykonania to takie miganie może wystąpić. Wszystko zależy od algorytmów tych operacji... Nawet 1Wire można oprzeć na timerze i pomiędzy kolejnymi bitami powrót z procedury, aby móc coś tam dokonać w międzyczasie.
Tak, będziesz mógł. Jeśli chcesz liczyć w czasie (a nie chcesz) to mierzony przebieg doprowadzasz do wejścia zegarowego timera, w efekcie każdy impuls powoduje zwiększenie wartości licznika o jeden. Skoro chcesz mierzyć szerokość impulsu to wykorzystujesz wejście ICP timera - timer taktujesz z maksymalną częstotliwością, z kolei impulsy z obrotomierza...
Witam Problem jest nastepujacy uzywam timer0 do multiplexowania. co 4ms wywoluje mi sie przerwanie od przepelnienia timera wyswietlajac cyfre na kolejnym wyswietlaczu. Dane do wyswietlenia sa globalne. w petli while co pewien czas(0,5 s ) wywoluje funkcje ktora zczytuje dane z czujnika ds1820 po 1wire. Na wyswietlaczu LED pojawia sie co jakis czas 'zaklocenia'....
Witam, pozwoliłem sobie na drobną modyfikacje Twojego kodu. Dobrze się przyglądnij, porównaj działanie w symulatorze a zobaczysz gdzie jest błąd. Powodzenia!!! $regfile = "m8def.dat" $crystal = 8000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 Config...
Witam, Aaaaaa ten chwyt już przerabiałem, ale chyba nie do końca w ten sposób jak kolega opisał. Mianowicie robiłem odczyt DS'a w przerwaniu, ale z oczekiwaniem 750ms na konwersję temperatury, w tym momencie wychodziła już totalna kaszana. Muszę zatem spróbować zrobić samą procedurę obsługi 1Wire w przerwaniu. Spróbuję w przerwaniu obsługi wyświetlaczy...
(...) odczytu temperatury. Jaki zaproponowałbyś kod (AVR GCC), aby nie trzeba było używać delay'a (może pooling lub maszynę stanu) ? Przy okazji przedstaw optymalną (bez zmiennoprzecinkowych liczb) konwersję danych ze scratpad'a na stopnie (może być złożeniem liczb całkowitych jako stopnie i części ułamkowe). Do obsługi termometrów DS18B20 bez blokowania...
euromatic pisze: "STARE MUSI KIEDYŚ ODEJŚĆ...." a ja mówię rachunek jest prosty: ceny w Seguro 2051 - 6,44 zł ds1820 - 21 zł lm35 - 3,78 zł atmega8 - 18 zł pomijając pozostałe podzespoły popatrzmy na cenę procka i czujnika atmega8 + ds1820 = 39 zł 2051 + ds1820 = 27,44 zł atmega8 + lm35 = 21,78 zł według mnie najlepiej użyć tej ostatniej konfiguracji,...
z ta kalibracjo to ciekawy temat ,ale jak podepne czujnik do termometru zrobionego na rs232 to temperature pokazuje idealnie,a ten kwarc to faktycznie 12.902400 ,tylko zmieniłem go na 11,059 oczywiscie tez zmieniając w kompilatorze. Wybacz kolego , ale Cię troszkę "obsztorcuje" :D 1)Twierdzisz , że używasz DS1820 (9-bit) , a temperaturę obliczasz jak...
na wbudowanych timerach może być problem bo na czas odczytu temperatury z 1wire nie mogą się właczyć żadne przerwania
Ja również miałem problem z multiplesowaniem wyświetlaczy i jednoczesnym odczytem 1wire. Pomysł z wyłaczeniem przerwań od timera na czas transmisji 1wire okazał się prawidłowy. Ponieważ w trakcie pomiaru świeci się jeden wyświetlacz aby efekt był nie zauważalny możemy dokonywać pomiaru temeperatury rzadziej. Oto mój programik : $regfile = "m8def.dat"...
Skoro urządzenie nie odpowiada, to znaczy, że nie rozpoznaje polecenia, czyli polecenie z jakiegoś powodu jest nadane błędnie. Skoro masz oscyloskop to zacząłbym od dokładnego pomierzenia timingów - czasu niskiego wystawianego przez master, czasu trwania bitu 0 i 1 i odstępów między nimi. Jeśli są w granicach określonych przez dokumentację to ok i można...
Wyrzuciłem z programu obsługę mcp9700 (więc i przerwania) i dalej "cisza". Lub jeszcze lepiej - obsługiwać 1wire z wykorzystaniem uartu czy timera. Czy chodzi Ci o to, żeby zamiast funkcji delay używać sprzętowego timera do pomiaru opóźnień? The maximal possible delay is 768 us / F_CPU in MHz. W moim przypadku 768/16=48 us. W przypadku przekroczenia...
Na razie to tylko ćwiczenie mające na celu nauczenie się obsługi magistrali 1wire. Skoro mam w przyszłości z tego korzystać, na pewno użyję timera, ale tu powstaje pytanie: Mam włączyć przerwania i ewentualne opóźnienia w nich realizować?
_delay() w pętli mam tylko tam, gdzie to konieczne - w obsłudze interfejsu 1Wire, aczkolwiek odczyt temperatury z termometru przy użyciu takowego interfejsu może trwać nawet ~800ms.
9V kolego, a stabilizator w układzie jest, tylko kwestia czy go nie spali przy 12 V czekam na odpowiedz na moje zasadnicze pytanie, mianowicie, uruchomienie drugiej linijki w lcd 2x16 przy zastosowaniu drugiego układu, co trzeba zmienic w programie (drugiego programu, dla drugiej linijki) prócz tego ze zmienic 1x16a na 2x16: 'Termometr 2-kanałowy DS18B20,...
... tak samo próbowałem PORTB=0xff bądź 0x0f (bo mam pierwsze cztery piny zajęte) ... . Zauważyłem też, że co jakiś czas wyświetlają się jakieś losowe znaki na wyświetlaczu, co kilkanaście sekund (przy PORTB=0x0f częściej niż bez tego) Jeżeli oprócz wyświetlacza masz zajęte inne piny portu B to nie możesz używać PORTB=0x0f lecz musisz dać PORTB|=0x0f....
ATtiny to tylko trochę odchudzony mega. Timery też ma podobne, a głównie tego potrzebujesz do OW. Z czym konkretnie masz problem?
Bardzo dobrym rozwiązaniem będzie jeśli kod do obsługi wyświetlacza umieścisz w przerwaniu od jakiegoś timera do { . tu w pętli głównej obsługa magistrali 1wire . } loop czas: { . tu obsługa przerwania licznika . } masz uniezależnienie od instrukcji wait mozesz naprzykład ustalić częstotliwość przerwań licznika co 1ms
U mnie trwa ok 400us, czyli bardzo dużo jak na 1wire. I przez to wywala się program. Czyli zrobić tak, że w przerwaniu od timera wysłać jeden bajt, a w przerwaniu od zakończenia transmisji wrzucić resztę 5) bajtów z rozróżnieniem co zostało wcześniej wysłane, żeby wysłać po kolei te 5 bajtów.
Postaraj się policzyć zasoby takie jak timery i przerwania czy Ci wystarczy to co mega ma na pokładzie.
Atmegi mają wewnętrzny układ taktujący 1MHz, do tego trzeba zmienić ustawienia programowania w stk200 (przełączyć fuse na zewnętrzny kwarc). co do zworki - jakaś bzdura, 1wire niewymaga żadnych zworek, 1-wire to kwestja programu, timer służy do odmierzania czasu i niemusi byc połączony z portem. co do i2c- niewiem...
http://obrazki.elektroda.net/60_12870844... Witam. Termometrów na elektrodzie było już dużo, w tym projekcie nie ma nic specjalnego, poza tym że wykorzystuje w miarę nowy procesor LPC1343. Projekt umieszczam w sumie tylko po to żeby podzielić się źródłami. Mam nadzieje że komuś się przydadzą. Jak wiadomo, kto stoi w miejscu, ten się cofa....
no ja nie powiedzialbym zeby uzywanie timera tylko do 1wire bylo jakims super rozwiazaniem ;-) Ja z DS1820 uzywam podanej nizej funkcji opozniajacej napisanej metoda prob i bledow z wykozystaniem miernika czestotliwosci. WinARM, procek na 60MHz (peryferia na 15), optymalizacja s: void delay_10us(unsigned short ile_us) { volatile unsigned...
..... wymagane jest precyzyjne odmierzanie czasu (transmisja, inicjalizacja, itd.) Jak precyzyjne to odmierzanie czasu ma być i jaka jego wielkość? Liczniki programowe z wykorzystaniem sprzętowego timera są bardzo dobrym rozwiązaniem i do obsługi 1WIRE w zupełności wystarczy. Jeżeli zależy Ci na bardzo dużej precyzji uwzględnij w obliczeniach czas...
Przetestuj ten. Tak go poopisywałem, że aż mi się nie podoba :D [syntax=basic4gl]$regfile = "m8def.dat" $crystal = 8000000 $hwstack = 40 $swstack = 16 $framesize = 32 '# wyświetlacz Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 Cls '# timer ' 8000000Hz(8MHz)/256(Prescaler)=...
Czyli rozumiem iż mam podmienić te dwie funkcję w "1wire_basic_UART.c" - a co z resztą zaczynając od main.c czyli: [syntax=c] #include <avr/io.h> #include <util/delay.h> #include "LCD.H" #include "menu.h" #include <avr/interrupt.h> #include "buttons.h" #include <stdio.h> #include <string.h> #include <util/atomic.h>...
Dziękuję kolego e marcus za wszelkie rady i instrukcje, zaraz poprawiam konfiguracje portu b. Według mnie przerywanie co 100ms jest używane przez program w pętli głównej programu, ponieważ co 100ms odwołuje się do 3 pod programów. Popoprawiałem wyszło coś takiego i działa jeszcze raz dziękuje wszystkim za pomoc: [syntax=basic4gl] '************* Konfiguracja...
A to to co? Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Porta.1 , Db7 = Porta.0 , E = Portd.2 , Rs = Portd.3 Config 1wire = Portd.0
Fajnie jest wszystko robić w przerwaniach, ale pod jednym warunkiem - takim, że to, co dzieje się w przerwaniu nie wymaga żadnego oczekiwania, czyli odpadają takie ekscesy jak wyświetlanie na LCD czy transmisja przez UART ( lub jakakolwiek inna powolna - I2C, 1Wire). Za to tym, co na pewno należy zrobić w przerwaniu timera, jest badanie stanu i eliminacja...
Wkońcu to jest Bascom. w bascomie na pożądku dziennym jest mówienie "moduł działa poprawnie gdy inny moduł jest niezaładowany, ponieważ również używa timera i moduły zaczynają interferować niemożna używać ich razem" (zakładając że moduł jest niejawnie dołączany do projektu w bascomie, gdy tylko w kodzie występuje wywołanie funkcji modułu) jeśli program...
Plik mmc.c nie należy do biblioteki. Owszem jest w samplach, ale jest pośrednikiem miedzy sprzętem i biblioteką. Powinno się go dostosować do drivera SPI. U mnie na tym samym SPI siedzi jeszcze LCD z SPLC501 i AT45DB161D więc logiczne jest, że PF też powinien komunikować się w ten sam sposób. W tych źródłach brakuje inicjalizacji i przerwania od timera,...
Nie wiem czy chcesz się nauczyć czy potrzebujesz program. Na początek te uwagi: 1. Nie wiem co tam robi dyrektywa $eeprom. Jest niepotrzebna w tym kodzie 2. Zmienna Ds jest zwiększana w przerwaniu niezależnie od tego czy jesteś w Menu czy nie. Tak więc po powrocie z Menu już na pewno nie zdążysz załapać się na warunek If Ds = 2 i wyzerować jej wartość....
Aaaa to ty tego PCF'a tylko dla tego 1Hz chciałeś ? - pewnie że to przesada. No ale nie ze względu na to że masz ileś tam wolnej pamięci Flash, bo to jest argument który ma się jak pięść do oka niestety. Pomyśl o czymś takim co się nazywa "timery programowe" to będziesz mógł mieć nie tylko 1Hz ale i inne dowolne częstotliwości dla wykonywania różnych...
Też planuję zabrać się za ARM. Mam kilka lamerskich pytanek do bardziej doświadczonych: 1. Do programowania oczywiście najlepiej JTAG Wiggler? Skleciłem już takowy, tylko jeszcze nie przegwizdałem. 2. Klocek AT91SAM7S - na początek, ale czy nada po '51, AT89 i PIC? Może za duży, czy za mały? 3. Płytka rozwojowa ocywiście będzie DIY - kogo można pomęczyć...
Hej, może to oczywista rzecz, ale 1wire jest bardzo ale bo bardzo wrażliwy na odstępstwa czasowe. Poszukaj miarodajnego sposobu odliczania zwłoki czasowej - np. na którymś z dwóch timer-ków wbudowanych w ATmege. pozdrawiam, -- michal
Przy dołączonych peryferiach 1wire jest pewna przeszkoda w komunikacji. Należy na czas komunikacji z układem wyłączyć timer( czyli zatrzymać odmierzanie czasu, sam sprawdź na czas komunikacji zrób disable timer0, a po zakończeniu komunikacji enable timer0). Dlatego do odmierzania czasu powinieneś wykorzystać timer w trybie asynchronicznym, np.: Config...
Nieprawda - 1wire można relizować półsprzętowo na atmedze. Półsprzętowo owszem, interesujące rozwiązanie. W zależności od wykorzystywanych zasobów można zdecydować o użyciu do tego celu właśnie USART-a albo Timer-a.
Nie podałeś zbyt wielu szczegułów. Odbiór robisz poprzez cykliczne sprawdzanie czy coś jest w wuforze wejściowym, za pomocą TTimer? Jeżeli tak to wyłącz na chwile timer i sprawdź czy aplikacja się dalej wiesza. Nie pytam o szczegóły sprzętowe, takie jak dopasowanie RS232 do 1wire, bo napewno to zrobiłeś?
heheh, już tak miałem wcześniej, ale przeniosłem ponownie tak ja mi napisałeś alien_audio i zastanawiałem się co mogłem popsuć, bo na logikę to po prostu MUSI działać :P Widać siedzenie do późna mi nie służy, bo... odliczanie sekundy trwało krócej, przez co 1wire nie zdążył konwertować, a już kolejne dane przychodziły do odczytu :P Tak to jest jak człowiek...
Witam, projektuje urządzenie wykorzystujące pastylki DS1990 i w czasie pisania programu natknąłem się na problem z prawidłowym odczytem numeru klucza po przyłożeniu pastylki do czytnika. Nikiedy na wyswietlaczu otrzymuje calkiem przypadkowe dane. Błąd występuje w przypadku około 5% odczytów. Okrojony do minimum fragment programu: $regfile = "attiny2313.dat"...
Tylko nie wiem jak dopisać je na "sztywno" do tego: No, pomijając że masz źle napisany kod do odczytu temperatury bo twoje Wait 1 stoi nie w tym miejscu ;) .... to jeśli chodzi o pytanie powyżej a raczej odpowiedź na nie - to ja już ci podałem wyżej w tym linku. Poza tym - skoro pierwszy raz zaczynasz bawić się tymi czujnikami to niedługo zadasz kolejne...
witam. próbuję napisać sobie procedurki do obsługi 1wire na podstawie pdfserv.maxim-ic.com/en/an/app162.pdf, ale mam problemy z precyzyjnym odmierzaniem czasu. jaki sposób mierzenia jest najpraktyczniejszy? timery, funkcje z util/delay.h czy jeszcze coś innego? i kolejne pytanie: jak sprawdzić ile faktycznie zajmują poszczególne instrukcje?
Mam nadzieję że to nie pójdzie do kosza: $crystal = 4000000 '4MHz $regfile = "attiny2313.dat" Config 1wire = Portd.5 Config Timer0 = Timer , Prescale = 64 On Timer0 Przerwanie0 Enable Interrupts Enable Timer0 Start Timer0 Porta = 0 Portb = 0 Portd = 0 Config Porta = 0 Config Portb = 0 Config Portd = 0 '**************************** 'Zmienne...
Cześć, Układ zgrabny, ważne, że użytkownik zadowolony. Co do 1wire to myślę, (choć specjalista nie jestem), że można to zrobić bez wyłączania przerwan. Timer konfigurujemy w tryb normal, ale lepiej chyba w CTC, konfigurujemy, żeby uzyskać te 100Hz dla wyświetlaczy, czyli mamy już multipleksowanie zrobione :-), wysyłamy polecenie konwersji, liczymy 100...
Czy ja dobrze widzę, że w każdym obiegu pętli głównej wywołujesz DS1820a() a w niej za każdym rzem robisz reset 1wire? No to pętla ma sporo _delayów do zrobienia. Ja bym w procedurze obsługi timera zrobił multipleks LED'ów i flagę maszyny stanów do obsługi DS1820. Ponadto w pętli głównej w kółko liczysz co ma być wyświetlane na wyświetlaczu jak to się...
Dr_DEAD poruszył bardzo ważną sprawę przerwań. Musisz bardzo dokładnie określić kiedy przerwania musisz włączyć, i kiedy należy je wyłączyć, aby nie blokować systemu, ani transmisji 1wire. p.s. Dr_DEAD ale mnie ubiegłeś Jednym słowem do 1wier dużo lepszym rozwiązaniem jest użycie timera. p.s. sawitar może i byłem szybszy ale zato mniej szczegółowy...
No tak ty wiesz jak zachowuje sie C. Ja wiem że z poziomu asemblera panuję na nad wszystkim co robię łącznie z długością kodu. Ale mam takie wrażenie ze jak coś zapisane w asemblerze to mniej więcej wiem ile to w hexa, Przy C to już dużo więcej (śmieci). W Basic to dużo za dużo. Ale się może mylę tak było kiedyś dla aplikacji. Tylko asembler AVR jest...
Transmisje z DS wykonuje 5 razy i sprawdzam, czy zawsze przychodzi to samo. Mam aktywne przerwanie timera, ktorz relizuje zegar czasu rzeczywistego. Po kazdym odczycie dwoch pierwszych bajtow wykonuje reset lini 1wire. Rzecz w tym, ze nie dostaje roznych odczytow tylko zawsze 0. Zauwazylem, ze 0 dostaje sie tez jak sie zewrze linie danych do masy. PL
Witam Piszę program (bascom) i nadziałem się na problem z którym nie mogę sobie poradzić. Timer 1 pracuje jako zegar i po spełnieniu warunku , ma załączyć przekaźnik który ma być załączony na czas_pracy i po odliczeniu czasu pracy ma wyłączyć się na czas przerwy i zablokować włączenia przekaźnika na ten czas. Tak w skrócie: kod : $regfile = "m8def.DAT"...
Byłby ktoś w stanie mi z tym pomóc? Miałoby to wyglądać tak: * sterowanie wentylatorami czasowo * sterowanie poprzez odczyt temeratury 2 osobne funkcje (działa albo jedno albo drugie). Do tego co mam dołożenie wł/wył czasowego (w zupełności wystarczy najprostsze z możliwych) OK, Popatrz na swój program; sterujesz ustawienia trzema przyciskami, z których...
Oki, dzięki. A czy to oznacza, że GPIO LPC nie jest kompatibilne z 1-Wire. Poziomy logiczne mieszczą się w zakresach, jedynie obciążalność prądowa jest mniejsza niż w AVR. Jak masz zasilany czyjnik? (zasilanie bezpośrednio z portu tutaj nie wypali). Druga sprawa, opóźnienia zrób na timerze :wink:. Czujnik możesz zasilać z zasilania procka lub z 5V...
[url=http://stm32f4-discovery.com/2014/0... masz pokazaną zasadę działania 1wire z N DS18B20. Co prawda kod jest oparty na F4, jednak dużo różnic nie będzie w porównaniu z F1. Zawsze zamiast tworzenia swojego timera do delaya możesz skorzystać z SysTicka.
$Crystal=4000000 Co do tego miał bym wątpliwości, nie obejdzie się bez zmiany FUSE. Nowa, Atmega ma na starcie 1000000. zazwyczaj robi sie to tak: 1:deklaracja Uc 2: prędkość 3: konfiguracja portów i stan ich startowy 4: ALIASy, jeśli ktoś chce. 5: konfig LCD, jeśli LCD 6: TIMERy jeśli potrzebne, 1Wire, PWM... 7: deklaracje zmiennych 8: wartość początkowa...
Witam! Napisałem a właściwie złożyłem sobie taki programik termometru na Wyświetlaczach 7 segmentowych i działa ok (na Timer1). Jednak dodatkowo chciałbym użyć 3 kanałów pwm więc za Multiplexowanie musi odpowiadać Timer0. Próbowałem różne wartości prescale i load i nie chce mi to działać na Timer0. Działający kod na Timer1: $regfile = "m32def.dat"...
Nie musisz czekać. Musisz zacząć trochę inaczej myśleć niż "linijka po linijce"... Dokładnie i nie jest to wcale takie proste :cry: Inaczej będzie to wyglądać dla prostego 'termometru', a zdecydowanie inaczej jeśli 'w tle' pracuje kilka przerwań, które rozwalą komunikację na 1wire na amen. Zerknij co kiedyś wykoncypowałem :D , żeby przerwanie obsługujące...
Poleca Code Vision jest kompletnym kopilatorem (chociaz nie posiada debugera co jest jego chyba jedynym minusem).Posiada funkcje I2c,Lcd ,1Wire,Rs232,obsługe paru standardowych kostek i jescze kilka innych bajerów .Ma tez Code Generator który bardzo pomaga w skonfigurowaniu procka (timery Adc przerwania itp.) A i generuje równiez pliki cof które mozna...
Niemniej, można nawet na tej płytce użyć przerwania timera, do zmiany stanu pinu. Obsługa przerwania w tym przypadku to jedna instrukcja cbi/sbi + RETI Wstawki ASM nie uniknie się, nawet w C, przynajmniej AVR-GCC. Jitter wprowadzony przez przerwania na poziomie 1 us będzie bez znaczenia dla 1-wire. Zgadza się. W standardowej prędkości to i 5us nie...
1wire da sie oprogramować czysto na przerwaniu. Dokladnie dwoch, w tym timer i external interrupt na oba zbocza, maszynę stanu na switch-u w przerwaniu tego external interrupt-a. 1wire zrealizowany w taki sposob zuzywa dokladnie 2...10% czasu procesora :] Okazuje się, że można urównoleglić wiele kanałów (optymalność zależy od tego czy procesor dysponuje...
Ok zrobiłem kropkę, teraz próbuje już odczytać temperaturę z DS18b20 podłączonego pod Pc.5, ale nie wiem dokładnie jak się zabrać za przełożenie temperatury na 3 cyfry. Nie wiem też czy w ogóle odczytuje temperature. Jest jakiś sposób żeby to sprawdzić bez podłączania wyświetlacza LCD ? Program wygląda teraz tak i wyświetla 00.0: $regfile = "m8def.dat"...
Zobacz sobie krótki opis Przeczytałem artykuł, rozumiem wszystko poza 2 sprawami. Mianowicie To dzielimy przez 100 i otrzymujemy wynik 78,125 . Od takiego wyniku odejmujemy jeszcze jeden i mamy gotową wartość jaką Timer musi odliczyć żeby zgłosić się 100 razy na sekundę. Dlaczego dzielimy przez 100 i dlaczego odejmujemy 1 ? Co robią polecenia [syntax=vbnet]Compare...
Pokładałem sobie urzadzonko które ma czytac z czterech ds-ów temperature, wszystkie cztery sa na jednej magistrali z zasilaniem osobnym, (trzy kable) wyswietlacze na których ma byc pokazana temperatura to zwykłe 7-mio segmentowe led-y, multipleksowane w przerwaniu od timera (przerwanie działa tylko w momentach kiedy ds czeka naprzykład na impuls strobujacy...
Witam. Buduje właśnie termostat z czujnikiem DS1820 i wyświetlaczami 7 segmentowymi, potrzebuje wyświetlić na 3 cyfrach temperaturę nastawioną i na drugich 3 odczytaną z czujnika. Uporałem się z obsługą 6cyfr w multiplexie napisałem odczyt ds-a i pojawił się problem mianowicie odświeżanie wyświetlacza leci w timerze odczyt DS-a w pętli głównej mój problem...
Udało się :) .. przynajmniej na razie na to wygląda :] a to jest kod który zadziałał :) : while(1) { while((t = PULPIN & 0x20) == 0) // dopóki jest na wejściu 0 to czekamy {} while((t = PULPIN & 0x20) == 1) // // potem przeczekujemy 1 na wej - czyli zliczamy na opadającym zboczu {}...
Nie mogło by być tak, że to przycisk generował by przerwanie? ... i pewnie do tego kolejny "delay" w przerwaniu od przycisku w celu eliminacji drgań styku? Nie brnij dalej w te delay'e, bo jeśli będziesz chciał dodać kolejną funkcjonalność to może okazać się to niemożliwe. Zrób sobie timer np. co 10ms i wywołuj nim przerwanie, ale uwaga: nie umieszczaj...
Najtrudniej analizuje się własny kod, bo zawsze patrzy się przez pryzmat wiedzy o tym co on powinien robić i nie dostrzega się drobnych błędów :) Zgadzam się z tym w 100%. Przy Bascomie rzadko sięgałem do PDF'ów kontrolerów, przy C nie da się bez tego wszystkiego zrobić. Bez tych 500 "przekręceń" licznika nawet w Bascom by nie poszło, jak zwykle zbyt...
Powiedz mi czemu sluzy ten fragment kodu w twoim termometrze? Config Timer0 = Timer , Prescale = 1024 Poza tym zastanow sie dlaczego w petli kazdorazowo konfigurujesz magistrale 1-wire? Odczyt_1czujnik: Config 1wire = Portc.3 <<<<TUTAJ!!!>>>> 1wreset Temp = 1wread Upperline Lcd Temp ; "'C" A tak na marginesie to...
Mam nadzieję że inkrementujesz sobie jakąś zmienną która informuje o ilości włączeń wentylatora a potem ją resetujesz. Przerwanie od timera zakłóca ci odczyt z DS-a musisz sobie dodać flagę którą będziesz ustawiał lub resetował i będzie cię informować że właśnie zakończyło się przerwanie i masz jeszcze trochę czasu do następnego. W tym momencie musisz...
Hmm... Spróbuj regularnie migać LED, jednocześnie komunikując się z PC, obsługując pomiar temperatury za pomocą 1wire (DS18B20) i wyświetlać ją na LCD, używając waitXX... ;) Timer0 jak nic do zastosowania... Tymczasem małe co nieco w załączniku (miganie LED z użyciem timera), zarówno dla ATmega8, jak i na ATmega8515. Ponieważ ATmega8 nie posiada przerwania...
Może nie umie wstawiać? $regfile = "m88def.dat" $crystal = 1000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4 Config Portd = &B00001111 'portd 0 1 2 3 jako wyjscia portd 4 jako 1wire 5 6 7 jako wejscia Portd.5 = 1 Portd.6 = 1 Portd.7 = 1 Portd.3 =...
Opatentowany jest własćiwy standard 1wire, a nie technika ściągania linii transmisyjnej do masy. Wystarczy że ktoś wymyśli sobie inna logike przesyłu bitów, zmieni czasy, timesloty nazwie cyklami zegarowymi ( :P ), i juz nie lamie się zadnych praw - bo taki wytwór wtedy nie jest już standardem 1wire ani nawet nie "zgodny" z tym standardem. Na duże odległości...
Po kolei: - w reset_pulse wysyłasz coś przez USART, wysłanie tego trochę trwa, w zależności od bitrate może trwać całkiem długo, co rujnuje timingi... - w write - początkiem nowej ramki jest krótki impuls ujemny. Może on trwać 1-2 us, to wystarczy. Więc jeśli nadajesz 0 to zrób 0 przez cały czas trwania ramki (prawie 60 us), a jeśli jeden, to po 1-2...
ad.1 - rozumiem, że nie używasz JTAG'a ale właśnie trzeba zwrócić uwagę, które Piny procka są że tak powiem "nieczynne" dla ciebie jeśli jest on załączony. Więc jeśli chce się z nich korzystać jako ze zwykłych portów I/O to oczywiście trza wyłączyć tego fusebita 2. to że działa ci magistrala na porcie C przy włączonym JTAG może wcale nie być dziwne...
wspomniane przez ciebie procedury odwoluja sie do timerow w celu obliczenia potrzebnych opoznien czasowych itd. a timery powiazane sa z oscylatorem... ktory w twoim wypadku (bez zmiany fuse bit) jest ustawiony na wewnetrzny oscylator (1 MHz) prawdopodobnie to jest przyczyna bledow... musisz w zakladce programatora "Lock and fuse bits" w rubryce odpowiedzialnej...
Tak, jak już pisałem, nie tędy droga. Trzeba zrozumieć, ze Menu czyli interfejs programu z człowiekiem powinno być tylko jego nakładką graficzną. Nie może być tak, że kiedy jesteś w Menu to program zaniedbuje cały system, na przykład nie pilnuje zadanych temperatur. Pomyśl co by było gdyby termostat sterował grzałką w akwarium a Ty sobie radośnie wszedłeś...
Udało mi się to uruchomić, lcd miałem tylko do testów czy wartości są ok, a to już jest ok więc wywaliłem procedury dla lcdka, i zostaly same ledy. Poprawiłem też te konwersje temp. Jak włożyłem do lodu pokazywało -12*C więc chyba jest teraz ok, jakby ktoś jeszcze potwierdził spałbym spokojnie. $regfile = "m32def.dat" $crystal = 16000000 'Config...
Zobacz to: [syntax=basic4gl]$regfile = "m32def.dat".dat " $crystal = 8000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Config 1wire = Porta.4 Config Portc = Output Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 Cursor Off Cls Dim T1 As Single Dim T2 As Single...
licencja zabrania sprzedawać urządzenia będące slave'ami 1wire Zastanawia mnie ocena tego postu przez innych użytkowników - w chwili pisania mojego postu było to -5 :D Do autora: Do jakiego pinu procesora podłączyłeś emulowany pin 1W? W sensie czy wykorzystujesz jakieś sprzętowe peryferia typu przerwania zewnętrzne/ timer a może jeden z istniejących...
Niedawno miałem podobny problem i kolega ZUMEK mi pomógł przerobił swój program na moje potrzeby może tobie sie przyda do wyciągniecia wniosków u mnie działa bezproblemowo: $regfile = 89c2051.dat $crystal = 11059200 Const Displays = 4 ' liczba wyswietlaczy LED Const Cyclespushall = 45 'ilosc cykli od przepelnienia T0 , do jego "przeladowania" Const...
A spróbuj tak: [syntax=basic4gl] ' Fuse bity ustawione fabrycznie $regfile = "m8def.dat" $crystal = 1000000 Config Portb = Output 'sterowanie segmentów LED Config Portd = Output 'sterowanie segmentów LED Config 1wire = Portc.5 Anoda1 Alias Portc.1 ' Lewy wyświetlacz Anoda2 Alias Portc.2 Anoda3 Alias Portc.3 Dim Nr_wysw As Byte Dim Liczba As Long Dim...
...Spróbowałem własnymi siłami zmienić ten kod, ale nie dałem rady(błędy kompilacji)... Aby to zrobić bezbłędnie, należy znać oba proce na "tip-top" :D Ja zrobiłbym to tak: 'Termometr Domowy' $regfile = "attiny2313.dat" $crystal = 8000000 'Config Timer0 = Timer , Gate = Internal , Mode = 2 'okres Timera0 250*12*Tosc=250us Config Timer0 =...
Ale Ty jesteś niecierpliwy. Masz odczyt DS bez wait- które to wait wszystko psuje. Flaga_dodatkowa wykorzystaj do multipleksowania wyświetlaczy. I podziękuj malon-owi za dobry pomysł. $regfile = "m8def.dat" $crystal = 8000000 '********* Konfiguracja wyświetlacza ********* 'oczywiście może być bez RW $lib "Lcd4busy.lib" Const _lcdport...
Widzę, że przez moją niewiedzę zaraz wybuchnie wojna :-> Postaram się wszystko wyjaśnić dlaczego tak, a nie inaczej i wstawie brakujące elementy. Więc tak. Bartek.k.k napisał: xamrex napisał: Masz rezystor podciągający? Niektórzy o nim zapominają. Dla DS18B20? Jeśli tak to nie mam, ponadto nigdy ich nie używałem i wszystko chodziło, tylko teraz układ...
Witam! Od kilku dni siedze i nie mogę nic wymyśleć :( Bez ogrudek - podaje źródło: $regfile = "m16def.dat" $crystal = 8000000 'definiowanie zmiennych i stałych Dim T As Integer Dim Licznik_przerwan As Byte Dim Dioda As Bit 'konfigurowanie interfejsu 1Wire Config 1wire = Portd.1 'konfiguracja wyświetlacza Config Lcdpin = Pin , Db4 = Portc.6...
dziękuję bardzo za zainteresowanie, jednak problemu w żaden sposób rozwiązać nie mogę. Przy zastosowaniu pomysły z pętlą przed przerwaniem i wyłączeniu optymalizacji program zachowuje się stabilnie jednak temperatury nie pokazuje. Dziwi mnie rzecz, że po włączeniu przerwań funkcja 1wirecount() zawsze zwraca 0(mimo zastosowania bezpośrednio przed nią...
Głównie interesuje mnie to "Waitms 750", bo zegar będzie do.. niczego Będzie działać poprawnie jeśli cały ten kod umieszczę w kodzie wyrażenia warunkowego gdzie warunek będzie spełniany co 750ms? Do tego właśnie można wykorzystać timer i zapomnieć raz na zawsze o wait. Czy w ogóle w takim układzie jest sens dawać odbiornik RC5 i DS18.. pod piny bez...
Po załączeniu zasilania czytam sobie przed pętlą główną z EEPROM-u pewne nastawy. Niestety czasami powiedzmy 1 na 5 odczytów jest nieprawidłowych. Wartość zapisana jest dobra, natomiast odczyt jest nieprawidłowy. Wiem to stąd, że jeżeli jeden z odczytów jest nieprawidłowy, to po wyłączeniu zasilania i ponownym jego załączeniu kolejny odczyt jest prawidłowy,...
czujnik 1wire esp8266 1wire 1wire przerwania
zamiana przepływomierz centrala hipath naprawa sterownika turbiny
uziemienie basenu bojler elektryczny
Samsung HT-X250: Podłączenie czerwonych przewodów Ustawianie rozmiaru papieru w Epson XP-245