Do testów jednego urządzenia które może być obsługiwane przez telefony z Androidem lub iOS potrzebowałem podłączyć w nim jednocześnie Bluetooth Low Energy HM-10 i dla wstecznej kompatybilności Bluetooth Classic HC-05.
Zrobiłem to najprościej jak umiałem :P Dwie diody Schottky i rezystor podciągający. Bezpośrednie połączenie bez diod nie jest możliwe ponieważ każdy z modułów w stanie bezczynności wystawia stan wysoki a nadawanie polega na zwieraniu do masy. Tak więc teraz zwierają do masy przez diody a stan kiedy nie nadają ustawia podciągający rezystor.
Tak można w gwiazdę podłączyć więcej Slave`ów jeśli Master jest tylko jeden.
Mam już kilka urządzeń z tym układem i wiem że czasem po wpisaniu nowych ustawień, lub przypadku braku komunikacji przydałby się reset Wizzneta.
Okazuje się że Reset Wizzneta jest na stałe połączony z Resetem Atmegi.
Chcąc sprzętowo, ale z poziomu Atmegi sterować Resetem Wizzneta trzeba dokonać małej przeróbki.
Rzecz sprowadza się do przecięcia przygotowanej w tym celu ścieżki i dolutowaniu sobie,
do przygotowanego przez producenta padu, przewodzika który podłączamy sobie pod dowolny pin Atmegi.
Może kogoś zaciekawi jak najczęściej rozwiązuję sprawy zmiennych przechowywanych w Eeprom i ich początkowych wartości
Dim Zmienna As Word Readeeprom Zmienna , 1 If Zmienna > Oczekiwana_wartośc_max Then Zmienna = 100 'przykladowa wartośćNiestety używając tego sposobu dla każdej zmiennej trzeba w kodzie zapisać jej wartość graniczną.
'************************************************** '* WARTOŚCI POCZĄTKOWE I PAMIĘTANE W EEPROM * '************************************************** Config PINB.0 = Input : Set PORTB.0 : Reset_ustawien Alias PINB.0 'przyciśnięcie przycisku przy starcie przywróci ustawienia domyślne 'zmienna do sprawdzenia stanu programowania eeprom, jej odpowiednik w eeprom i wartość umówiona Dim Ee_check As Byte , Ee_check_ee As Eram Byte : Const Mem_ee = &H10 Dim Tryb_pracy As Byte , Tryb_pracy_ee As Eram Byte ' zmienna programu i jej odpowiednik w eeprom Dim Ilosc_stopni As Byte , Ilosc_stopni_ee As Eram Byte ' zmienna programu i jej odpowiednik w eeprom Dim Example_str As String * 15, Example_str_ee As Eram String * 15 Ee_check = Ee_check_ee ' sprawdź czy eeprom była programowana If Reset_ustawien = 0 Then Ee_check = &HFF ' nawet jeśli to przyciskiem można to zmienić If Ee_check <> Mem_ee Then ' jeśli nie była programowana Ee_check_ee = Mem_ee ' to zostaw znak że programowana Ilosc_stopni_ee = 21 ' wpisz wartości domyślne Tryb_pracy_ee = 0 Example_str_ee = "Zostaw wiadomosc" End If ' ** MEMORY READING ** Ilosc_stopni = Ilosc_stopni_ee ' tutaj już normalne odczytywanie z eeprom Tryb_pracy = Tryb_pracy_ee ' tylko to będzie się działo jeśli eeprom już programowana Example_str = Example_str_ee
Na pewno niejednokrotnie widziałeś różnie napisane Menu.
Sama logika najczęściej nie zajmuje dużo miejsca. Najwięcej zajmują "napisy" czyli łańcuchy danych tekstowych
Kiedy mamy wyświetlacz alfanumeryczny i chcemy na jego środku umieścić krótszy napis to stajemy przed dylematem.
Jeśli poprzedni napis był dłuższy od nowego to, albo musimy skasować ekran co wiąże się z długim czasem i nawet nieprzyjemnym mrugnięciem całego LCD, albo użyć innego rozwiązania.
Często spotykanym sposobem jest takie zapisanie napisów we Flash by przykryły poprzedni napis spacjami
Menu_string(1) = " Menu 1 " Menu_string(2) = " Menu 2 " Menu_string(3) = " Menu 3 " Menu_string(4) = " Menu 4 "
W kodzie umieściłem instrukcje NOP. Pozwalają mi one "oprzeć się kursorem" i prawym klawiszem dokonac wybranej akcji. Myślę że może się komuś przydać ponieważ kiedy chcemy się zatrzymać pomiędzy instrukcjami to symulator napisze że w tymi miejscu nie ma żadnego wykonywalnego kodu. A tak się odczepi i stanie na tym NOP.
Gdyby kogoś interesował kod - proszę bardzo
$regfile = "m16def.dat" $crystal = 8000000 $hwstack = 64 $swstack = 64 $framesize = 64 $sim Config Submode = New Dim Help_str As String * 16 Dim Helpb As Byte , Posx As Byte , Posy As Byte Help_str = "Test str." Sub Show_central(byval Posy As Byte) Locate Posy , 1 : Lcd Spc(16) Helpb = Len(help_str) Shift Helpb , Right , 1 Posx = 9 - Helpb Locate Posy , Posx : Lcd Help_str End Sub Sub Show_central2(byval Posy As Byte) Local Msg_str As String * 16 Msg_str = Space(16) Local Copy As Byte Helpb = Len(help_str) Copy = Helpb Shift Helpb , Right , 1 Posx = 9 - Helpb Mid(msg_str , Posx , Copy) = Help_str Locate Posy , 1 : Lcd Msg_str End Sub Cls Do nop Call Show_central(1) '4120 0,515ms nop Call Show_central2(2) '3042 0,38025ms nop Loop
Jeśli chcesz się dowiedzieć jak nazywa się interesujacy Cię rejestr możesz pomóc sobie zerkając do pliku *def.dat (tego z nagłówka Twojego programu). Są w nim ujęte prawie wszystkie rejestry i jest to bardzo przydatne przy przerabianiu programu z innego procesora.
Najlepiej jest go otworzyć w środowisku Bascom. Trzeba jedynie w opcjach otwierania zmienić widok na "All files"(zaznaczyłem elipsą), a pliku szukać w folderze gdzie zainstalowany jest Bascom.
Kiedy już mamy taki otwarty to naciskamy Ctrl+F i w nowo otwartym oknie wpisujemy czego szukamy np."Compare". Jeśli potem będziemy naciskać "F3" to zobaczymy wszystkie wpisy dotyczące Compare.
Jeśli chcemy szybko do testów wyłączyć większy niż linijka blok kodu to najlepiej użyć do tego kombinacji Ctrl+M. Jest to całkowicie odwracalne i nawet bardziej skuteczne niż zamykanie w nawiasy.
Może się czasem przydać dwukolorowa sygnalizacja, albo przełączana wizualizacja przełączenia jakichś urządzeń. Można oszczędzić na wyprowadzeniach mikrokontrolera jeśli podłaczy się LED`y w ten sposób. Proszę jednak mieć na uwadze, że diody dwukolorowe są inaczej połączone w środku. Przyda się przy małych mikrokontrolerach albo dużej ilości LED`ów
Tak jak cały port ma osiem "nóżek" i żeby ustawić jedną piszesz PORTB.1 = 1,
tak i Bajt ma osiem Bitów.
Jeśli wartość przykładowego bajtu będzie wynosić 2 to w zapisie binarnym będzie to B 00000010 (każde zero lub jedynka ma swoje miejsce liczone jednak od prawej strony i to liczone od zera. Tak więc tutaj jest tylko jedna jedynka i znajduje się na pozycji jeden, nie dwa!)
Licz od prawej : zero, jeden, dwa, trzy, cztery, pięć, sześć, i siedem bo z zerem jest to osiem bitów.
Przykład pierwszy. Jeszcze na porcie. Zaraz przejdę dalej:
Dim N As Byte , Wartosc As Byte Wartosc = 4 'przykladowa wartosc Linijka_led: For N = 1 To 7 'nie ruszamy nigdy PORTD.0 If Wartosc >= N Then Set Portd.n Else Reset Portd.n 'Jeśli N ma w tym obiegu mniej niż wynosi Wartosc to ustaw pin w stan wysoki, jeśli nie to w stan niski 'Piny od 1 do 4 będą w stanie wysokim, a 5 do 7 w stanie niskim Next Return
W tym kodzie na pinie PORTD.0 może być dioda która świeci zawsze jeśli spełniony jest inny warunek. Nie interesuje nas i jej nie dotykamy bo pętla jest dla wartosci od 1 do 7, nie od 0 do 7. Natomiast diody na pinach od 1 do 7 są zapalane w zależności od wartości zmiennej Wartosc.
Przykład drugi.
Znak ujemnej temperatury w zmiennej typu Integer zapisany jest w ostatnim bicie. Integer jest dwubajtowa więc bitów mamy 16. Jako że trzeba uwzględnić pozycję Zero to najstarszy Bit ma numer 15.
Dim T As Integer Dim Minus As Bit Temp: 1wreset 1wwrite &HCC 1wwrite &HBE T = 1wread(2) Minus = T.15 'sprawdzamy czy tu jest jeden czy zero T = Abs(t) T = T * 10 T = T / 16 1wreset 1wwrite &HCC 1wwrite &H44 Return
Przykład trzeci. Sprawdzamy wszystkie bity w bajcie :)
'funkcja koduje Manchesterem wiec koduje Bajt do dwa razy wiekszej Word 'Author Evert Dekker ( http://evertdekker.com ) Function Send(byval Temp As Byte) As Word Local Manchester As Word ' zmienna przechowujaca wynik Local Bit_number As Byte ' numery bitów po kropce (od 7 do 0) 'zmienna będzie od razu dekrementowana wiec ma o jeden wieksza wartość poczatkową Bit_number = 8 Do Shift Manchester , Left , 2 Decr Bit_number 'tu zmienna ma już wartość 7 i to numer bitu If Temp.bit_number = 1 Then 'jeśli w Bajcie na pozycji Bit_number jest 1 to Manchester = Manchester + 1 '01 Else 'jeśli nie (jeśli na pozycji Bit_number jest 0) Manchester = Manchester + 2 '10 End If Loop Until Bit_number = 0 Send = Manchester End Function
Jak ktoś nie ma oscyloskopu, to może na własne uszy przekonać się o jakości zasilania swojego układu. Wystarczą zwykłe słuchawki.
To proste gniazdko "mały jack" wylutowane z czegoś, kondensator 100nF - 1uF i krokodylek.
Krokodylkiem podłączasz się do masy a pinem kondensatorka dotykasz sobie badanych nóżek.
Zapewniam, że niejeden się zdziwi z czym musi pracować mikrokontroler.
Tam ma być cisza a jest szum i piski... W poprawnym układzie powinien być tylko "pyk" ładowania kondensatorka. Żadnych szumów, pisków czy buczenia od trafo.
Taki prosty układ naprawdę mi kilka razy dał pojęcie dlaczego coś nie działa. Na przykład gdy jakiś nadajnik typu 433 nadaje to "szarpie" zasilaniem. Dlatego one u mnie mają swój dławik i osobny kondensator za nim... Zasilanie z chińskiej ładowarki to tragedia.. Przykładów można by mnożyć...a to zwykłe słuchawki.