Elektroda.pl
Elektroda.pl
X
Elmark
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12

ja_dzik 10 Mar 2013 12:27 228251 706
  • #571 10 Mar 2013 12:27
    maximus22_kr
    Poziom 18  

    Witam
    Wykorzystałem kod Kolegi nanoTECHNO, głownie z powodu gotowej konfiguracji na 433 Mhz, no i sposób wysyłania.

    Mam płytkę nadajnika na Atmega328 ( odbiera sygnał DCF77, ma zegar PCF8563 oraz obsługuje czujniki DS18B20 ), sprzętowe SPI. RFM12 mam w wersji S, czyli SMD na 5V, wiec cały układ jest zasilany z 5V. Układ programuje się bez problemu, nie trzeba wylutowywać RFM12 lub wyciągać Atmegi.Testowo chciałem przesłać dane o czasie i dacie.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Odbiornik jest na Atmega644P. Obsługuje czas/date z PCF8563 oraz zapis na SD oraz sprzętowy UART. RFM12 również w wersji S, czyli SMD na 5V, wiec cały układ jest zasilany z 5V.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodam kilka Waitus, żeby dać czas na zmianę stanu.
    Niestety żadne dane nie dochodzą. Czy można w jakiś sposób sprawdzić ( np.odczytać zmienną ), czy nadajnik coś wysłał ?
    Jeśli chodzi o odbiornik, to zastanawiam się, czy nie przeszkadza karta SD - ale wyłączyłem ja przez DIPSwitch i dalej nic.
    Czy różne częstotliwości kwarców mogą powodować takie problemy ?

  • Elmark
  • #572 12 Mar 2013 22:23
    BIGJack
    Poziom 16  

    Witam,
    Utknąłęm w martwym puncie z kodem odbiornika rfm12b.
    Nie wiem dlaczego ini1 blokuje timer0.
    Wygłąda to tak że jak wyłączę int1 to reszta działa poprawnie poza odbiorem danych oczywiście a jak włączę to sidają przerwania z timera0.
    Czy ktoś pomoże?

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
    [Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12
    Na LCD w linii czas jest liczba 44 to nie jest zegar, poprostu zrobiłem odliczanie w przerwaniu 0-9 aby uwidocznić jego działanie no i stoi jak na zdjęciu do czasu nadawania przez nadajnik po chwili na ułamek sekundy odlicza i zatrzymuje się z inna wartością.

  • Elmark
  • #573 13 Mar 2013 10:39
    BIGJack
    Poziom 16  

    Cytat:
    Mam płytkę nadajnika na Atmega328 ( odbiera sygnał DCF77, ma zegar PCF8563 oraz obsługuje czujniki DS18B20 ), sprzętowe SPI. RFM12 mam w wersji S, czyli SMD na 5V, wiec cały układ jest zasilany z 5V. Układ programuje się bez problemu, nie trzeba wylutowywać RFM12 lub wyciągać Atmegi.Testowo chciałem przesłać dane o czasie i dacie.

    W zamieszczonym kodzie nadajnika masz wyłacznie obsługę RFM12-a i pustą pętlę do-loop więc jakie dane i w jaki sposób ma wysyłać?

  • #574 13 Mar 2013 19:23
    maximus22_kr
    Poziom 18  

    BIGJack napisał:
    Cytat:
    Mam płytkę nadajnika na Atmega328 ( odbiera sygnał DCF77, ma zegar PCF8563 oraz obsługuje czujniki DS18B20 ), sprzętowe SPI. RFM12 mam w wersji S, czyli SMD na 5V, wiec cały układ jest zasilany z 5V. Układ programuje się bez problemu, nie trzeba wylutowywać RFM12 lub wyciągać Atmegi.Testowo chciałem przesłać dane o czasie i dacie.

    W zamieszczonym kodzie nadajnika masz wyłacznie obsługę RFM12-a i pustą pętlę do-loop więc jakie dane i w jaki sposób ma wysyłać?


    Tzn wysłanie ( również przez UART i to działa ) odbywa się po ustawieniu flagi od Timer0 - co 30 sekund
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Raczej coś z odbieraniem nie tak, bo gdy nadajnik zasygnalizuje nadawanie to wyświetlacz odbiornika zatrzymuje się, jego stan zmienia dopiero po następnym przesłaniu przez nadajnik, czyli co 30 sekund.
    LCD wyświetla między innymi godzinę i jest tak:
    19:58:31
    odbiór po 30 sekundach
    19:59:01
    odbiór po 30 sekundach
    19:59:31

  • #575 13 Mar 2013 20:03
    BIGJack
    Poziom 16  

    Tego fragmentu nie ma w zamieszczonym kodzie nadajnika na m328.
    Podaj cały kod który mamy sprawdzić bo inaczej się nie dogadamy.

  • #576 13 Mar 2013 20:27
    maximus22_kr
    Poziom 18  

    Jest tego sporo, DCF77, 7 x DS18B20 i DHT11 ( akurat jeśli chodzi o niego to mam wątpliwości, czy ten kod działa, bo jest na obydwu płytkach podpięty i zdarza się zawieszenie )

    Nadajnik Atmega328p

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 16 [minuty]:

    Odbiornik Atmega644P - trochę zmieniłem obsługę przerwania, wydaje mi się, że w przerwaniu nie powinno się wykonywać dużych obliczeń.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Chyba jest jakieś ograniczenie wielkości kodu, bo nie mogę całego wstawić. Musi ktoś coś odpisać, żebym ja mógł coś znowu napisać.

    Chciałem zapytać odnośnie kwarców- czy muszą być na 8 MHz, czy tylko obydwa muszą być takiej samej wartości, np. 16 MHz

    Ech, nadajnik się zawiesza, tzn cały czas świeci dioda informująca o włączeniu nadawania

  • #577 28 Mar 2013 00:30
    maximus22_kr
    Poziom 18  

    Mam pytanie do Kolegi nanoTECHNO. Jako, że jego kod u mnie ruszył ( tzn. sam RFM12 bez dodatków, które są mi potrzebne ).

    Nadajnik wysyła sześć zmiennych, czego trzy się zmieniają. U mnie LCD odbiornika wyświetla tylko pierwsze dwie zmienne ( D1, D2 ) a pozostałe pozycje ( D3, D4, D5, D6 ) wyświetla wartość D1 i D2.

    Jeszcze pytanie - jak wysłać coś większego niż bajt ? potrzebuję wysyłać temperaturę, a to jest już typu Integer

    Kod skopiowałem bez zmian ( tzn w odbiorniku zmieniłem piny SPI i INT )

    Nadajnik

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Odbiornik

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  • #578 28 Mar 2013 16:27
    nanoTECHNO
    Poziom 14  

    Witaj

    W procedurze :

    Code:

    Rf12_wrt_cmd_2:
        Rf_sck = 0
        'Waitus 2  'USUNĄC TEN WIERSZ
        Rf_nsel = 0
        'Waitus 2 'USUNĄC TEN WIERSZ
        Data_in = 0
        For I = 0 To 15
           Waitus 1
           Rf_sdi = Data_out.15
           Shift Data_out , Left , 1
           Waitus 1
           Rf_sck = 1
           Waitus 1
           Shift Data_in , Left , 1
           Data_in.0 = Rf_sdo
           Waitus 1
           Rf_sck = 0
           Waitus 1
        Next I
        Rf_sck = 0
        'Waitms 2 ' USUNAĆ TEN WIERSZ
        Rf_nsel = 1
        'Waitms 2 'USUNĄC TEN WIERSZ
    Return

    Koniecznie usuń wskazane wiersze. W moim przykładzie te linie są zakomentowane wprowadzone zostały do eksperymentów. Dlatego co innego masz na LCD w odbiorniku.

    Dodano po 2 [minuty]:

    Co do obsługi temperatury to nie używaj typu "integer" dla D1-D10 tylko BYTE
    Code:
    W konfiguracji :
    

    Config 1wire = Portb.6  'wybor pinu do podłączenia DS18b20
    Dim Rfm_tab(16) As Byte  'ramka danych 8 bajtow w RFM12
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim T_msb As Byte
    Dim T_lsb As Byte
    Dim T As Single
    Dim S1 As String * 6
    Temp_byte As Byte


    '----------------------------------------------- NADAJNIK Procedura obsługi czujnika

    ds18b20:

       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       Lsb = 1wread()
       Msb = 1wread()
       D3 = Lsb 'Młodszy bajt inf. o temp., to zostanie wysłane
       D4 = Msb 'Starszy bajt inf. o temp., to zostanie wysłane

    Return



    '----------------------------------------------- ODBIORNIK


    odczyt_temp:
       
       Lsb = D3
            Msb = D4
             T_msb = Msb     'jezeli 0 dodatnia temp
             T_lsb = Lsb
             T = Msb * 256
             T = T + Lsb
             T = T / 16
       If Msb.7 = 1 Then T = T - 4096
       Temp_byte = T
       S1 = Fusing(t , "##.&")
       S1 = Format(s1 , "000")
       'If T_msb = 0 And Lsb <> 0 Then S1 = "+" + S1
       If T_lsb = 255 And T_lsb = 255 Then S1 = "0"
       If T_lsb = 255 And T_lsb = 0 Then S1 = "0"
       If T_lsb < 2 And T_msb = 0 Then S1 = "0"
    'w S1 znajduje sie wartośc temperatury w postaci znakowej

    Return

  • #579 28 Mar 2013 17:05
    BIGJack
    Poziom 16  

    I ja mam pytanie do kolegi nanoTECHNO, masz jakiś przykład nad-odb. dla RFM23 433 jaka jest różnica w konfiguracji? Jakim poleceniem go uśpić?

  • #580 28 Mar 2013 17:43
    nanoTECHNO
    Poziom 14  

    Jeszcze nie zajmowałem sie układami RFM23. Wdg noty stan Shutdown 10nA można osiągnąc przez podanie stanu wysokiego na pin SDN. Pozostałe tryby : Idle,Standby,Sleep są dostępne przez rejestr 07h - str. 16,17 Tabela 11.

  • #581 28 Mar 2013 21:37
    maximus22_kr
    Poziom 18  

    Dzięki za odpowiedź - faktycznie działa jak trzeba.
    Czyli teraz mogę ustawić np. 20 zmiennych w nadajniku i 20 w odbiorniku ( albo i wiecej).

    Zasięg całkiem spory - przez dwa stropy przechodzi, odbiera na zewnątrz ( dobrze, że wieczór, trochę głupio wyglądałem z akumulatorem 12V/12Ah pod pachą), jakieś 150 metrów ( czyli jedna ściana, kilka drzew i kilka domów po drodze )

    Szkoda, że nie można czegoś więcej niż zmienne typu Byte, trzeba będzie dzielić

    Potrzebuje przesyłać również tekst.
    U mnie ciąg ( na razie wysyłany przez RS485 ) ma taki wygląd:
    $TEMP,0,+,0245,0,=,0348, itd

    $TEMP, oznacza, że wysyła temperaturę
    0 - czujnik dostępny
    + - histereza, w tym przypadku wzrost temperatury w stosunku do poprzedniego odczytu
    0245 - wartość temperatury ( wiadomo przez RS485 idzie jako string, później wyciągam i robię z tego Integer.

    I tak po kolei 7 czujników + jeden czujnik wilgotności DHT11

    Do tego raz na dobę ( o 4 w nocy ) aktualizacja czasu pobranego z DCF77 i przesłanie go, wtedy ciąg zaczyna się
    $DATA,HH,MM,SS,Day,Month,Year,Week

    Pewnie da się wysłać litery, tylko trzeba je zamienić na znaki ASCII - dobrze myślę ?

    Udało mi się przesłać $TEMP jako numery znaków ASCII i w odbiorniku zrobić:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Natomiast widzę, dlaczego na początku kod Kolegi nie zadziałał- otóż w odbiorniku mam kartę SD oraz zapis na SD i w konfiguracji jest:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    i teraz dołożenie tej linii w kodzie Kolegi ( tak dla testów ) powoduje, że przestaje działać.

  • #582 29 Mar 2013 11:52
    nanoTECHNO
    Poziom 14  

    Najpierw należy wyodrębnić poszczególne znaki z hasła które chcemy wysłać. Następnie wyłuskane znaki (w T_string) zamieniamy na kod ASCII i wysyłamy.
    W s1 znajduje się ciąg znaków np.$TEMP. W D6 do D10 znajdzie się liczbowa reprezentacja liter ASCII.

    Code:

    Deklaracje :
    Dim T_string As String * 6 
    Dim s 1 As String * 6

    '-------------------------- procedura dla Nadajnika

       T_string = Mid(s1 , 1 , 1)  'pozostawiamy 1 znak $
       D6 = Asc(t_string)      'zamiana na kod ASCII
       T_string = Mid(s1 , 2 , 1) 'pozostawiamy 2 znak T
       D7 = Asc(t_string)         'Zamiana na kod ASCII
       T_string = Mid(s1 , 3 , 1) 'znak E
       D8 = Asc(t_string)
       T_string = Mid(s1 , 4 , 1) 'M
       D9 = Asc(t_string)
       T_string = Mid(s1 , 5 , 1)'P
       D10 = Asc(t_string)



    ------------------------- Procedura dla Odbiornika
    'Przykład wyświetlenia na LCD ciągu $TEMP po odebraniu.

    Lcd Chr(D6) ; Chr(D7) ; Chr(D8) ; Chr(D9) ; Chr(D10)

  • #583 29 Mar 2013 14:09
    maximus22_kr
    Poziom 18  

    Przesyłanie tekstu jest jednak chyba najmniejszym problemem. Trochę roboty z siedmioma czujnikami DS, ale to chyba można zrobić przez podstawianie w pętli FOR..NEXT , czyli np. dla
    dsid1 - D1 i D2
    dsid2 - D3 i D4
    dsid3 - D5 i D6

    bardziej martwi konflikt pomiędzy zapisem SD a RMF12. Zapis na SD wymusza pewną konfigurację, która coś nie za bardzo "podchodzi" RFM12. Może gdyby znać konfigurację SPI dla RFM12, można by przełączać pomiędzy nimi.

  • #584 29 Mar 2013 16:55
    nanoTECHNO
    Poziom 14  

    Możliwe że niektóre komendy wykorzystywane przy obsłudze karty SD zmieniają parametry konfiguracyjne RFM12b. Obsługa dla SPI w przykładzie który podałem wcześniej jest programowa. Więc jeśli masz wolne wyprowadzenia możesz przerzucić się na inne piny.

    Możesz też w obecnym podłączeniu przy zapisywaniu na karte SD niech RFM12b będzie w stanie uśpienia i wybudzaj po zapisie.

  • #585 29 Mar 2013 21:57
    maximus22_kr
    Poziom 18  

    nanoTECHNO napisał:
    Możliwe że niektóre komendy wykorzystywane przy obsłudze karty SD zmieniają parametry konfiguracyjne RFM12b. Obsługa dla SPI w przykładzie który podałem wcześniej jest programowa. Więc jeśli masz wolne wyprowadzenia możesz przerzucić się na inne piny.

    Tzn. kartę SD zostawić na HARD SPI, a RFM puścić na SOFT SPI ?

    Zauważyłem też problem z timerem w odbiorniku - jakby w ogóle nie odmierzał czasu - w nadajniku też mam nadawanie przez Timer0 - co 15 sekund i działa. W odbiorniku ten sam kod uruchamiający Timer i kicha. Tzn. widzę, że w kodzie obsługi RFM12 jest blokada przerwań, więc pewnie dlatego.

  • #586 29 Mar 2013 22:21
    nanoTECHNO
    Poziom 14  

    Tak karta SD na sprzetowym SPI a RFM12b na wolne piny wdg deklaracji :

    Code:

    Config Rf_sck = Output
    Config Rf_sdo = Input
    Config Rf_nirq = Input
    Config Rf_sdi = Output
    Config Rf_nsel = Output

    Ale najpierw spróbuj uśpić RFM12 i wtedy zapisuj na SD może na wspólnej szynie będą chodzić bez zakłóceń

    Przy nadawaniu i odbieraniu z RFM12B koniecznie należy wyłączyć przerwania bo będą gubione ramki.

  • #587 29 Mar 2013 22:36
    maximus22_kr
    Poziom 18  

    Coś z tym gubieniem jest na rzeczy, bo czasem jedna ze z inkrementowanych zmiennych "przeskakuje" o jeden, zdarza się to raz na jakiś czas.

    Co do Timer'a to trzeba będzie zadbać, żeby nie było konfliktu, bo zapis na SD też potrzebuje Timer'a - chyba Timer2.

    Jeśli chodzi o nadajnik, to jeśli wywołuję wysyłanie flagą od Timer'a to trzeba chyba wstawić:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Jeśli chodzi o odbiornik, to czy w programie obsługi przerwania nie jest za dużo rzeczy? Sporo osób pisze, że w przerwaniu ma być jak najmniej, najlepiej flagi.

    W odbiorniku zrobiłem tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  • #588 31 Mar 2013 20:50
    maximus22_kr
    Poziom 18  

    Jak najszybciej scalić LSB i MSB w nadajniku ? Potrzebuję oprócz LSB i MSB (typu Byte ) w nadajniku - temperatury jako zmienną typu Integer do obliczeń histerezy.

    Mam coś takiego:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Po odczytaniu Lsb4 i Msb do ds_i4 już nic nie zapisuje, wiec najprościej byłoby scalić je.

    Próbowałem robić coś takiego:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Działa, tylko przy siedmiu czujnikach DS18B20 może się pogubić.

  • #589 02 Kwi 2013 23:46
    maximus22_kr
    Poziom 18  

    Tak wygląda mój kod nadajnika

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Na pewno da się coś poprawić.
    Czasem, rzadko, zdarza się, że jedna z temperatur pokazuje 0,0.

    No i niestety Timery kolidują z RFM12, według ustawień wysyłanie przez RFM powinno być co 16,5792 s (16,5 x 1,0048 s), jednak po odczycie czas na odbiorniku widać, że jest to około 21 sekund. Widać RFM12 i odczyt DS18B20 blokuje na sporo czasu Timer'y.

    No i rzecz najważniejsza - niestety nie działa dekodowanie DCF77 przy włączonym RFM12 - stąd moje pytanie, czy da się go wyłączyć, tak żeby nie reagował na wejście do podprogramu Wyslij_rfm12 wywołanego przez flagę Flaga_wyslij

  • #590 03 Kwi 2013 23:12
    nanoTECHNO
    Poziom 14  

    Proponowałbym Ci korzystać z tablic a nie ze zmiennych D1-D46. Wiele operacji można wówczas zautomatyzować.

    Deklaracja :
    Dim Rfm_tab(64) As Byte 'deklaracja tablicy 64 elementowej


    Teraz w procedurze "Wyslij_rfm12" fragment podstawiający liczby do wysłania wygląda tak :

    Code:


             For n=1 to 46
               Data_to_send = RFM_tab(n)
               Gosub Rf12_send 
            Next



    4 wiersze zamiast 80.

  • #591 03 Kwi 2013 23:41
    maximus22_kr
    Poziom 18  

    Zapewne chodzi o szybsze i wygodniejsze użycie pętli FOR...NEXT ?

    A jeśli chodzi odczytywanie z DS18B20, to można coś poprawić ?

    Najgorszy w tym monecie jest problem z synchronizację DCF77 - jeśli usunę

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    to DCF77 synchronizuje się po 2-3 minutach, a gdy zainicjuję RFM12 to nie daje rady zdekodować ( odebrać pewnie też ). Próbowałem przez ustawienie flagi wysyłki rfm na 0 oraz blokowania pinem nSel, nic nie daje. Po prostu rfm jest już "widoczny" i w jakiś sposób wpływa na pracę Timer'a ( tylko tak to można wyjaśnić, bo DCF77 potrzebuje Timer2 do dekodowania ).

    Tutaj będzie potrzebne coś w rodzaju cofnięcia inicjalizacji rfm i po zdekodowaniu DCF77 ponowna jego inicjalizacja

  • #592 05 Kwi 2013 15:21
    maximus22_kr
    Poziom 18  

    nanoTECHNO napisał:
    Proponowałbym Ci korzystać z tablic a nie ze zmiennych D1-D46. Wiele operacji można wówczas zautomatyzować.

    Deklaracja :
    Dim Rfm_tab(64) As Byte 'deklaracja tablicy 64 elementowej


    Teraz w procedurze "Wyslij_rfm12" fragment podstawiający liczby do wysłania wygląda tak :

    Code:


             For n=1 to 46
               Data_to_send = RFM_tab(n)
               Gosub Rf12_send 
            Next



    4 wiersze zamiast 80.


    Dziękuję
    Kod zmniejszył się o 1 %. w przyszłości wystarczy zmienić wartość N i będzie można wysłać więcej danych.

  • #593 06 Kwi 2013 23:33
    maximus22_kr
    Poziom 18  

    Przyczyną braku synchronizacji była zbyt duża ilość operacji na czujnikach DS118B20 - zbyt długo były blokowane przerwania. Na razie zrobiłem tak, że na czas synchronizacji blokuję odczyt temperatury - sprawdza się.

    Teraz zacząłem "męczyć" temat odbiornika. Czy Kolega próbował odbierania danych poprzez odczyt jednego z bitów rejestrze ? Takie informacje znalazłem ( ale bez żądnych szczegółów ) w tym temacie.

  • #594 07 Kwi 2013 22:47
    nanoTECHNO
    Poziom 14  

    O co chodzi z tym odczytywanie bitu w rejestrze ? Możesz podać źródło ?

  • #595 07 Kwi 2013 23:26
    maximus22_kr
    Poziom 18  

    Tzn. w tej dyskusji Kolega WOBI i Kolega r06ert coś o tym wspominają.

    Kolega r06ert napisał coś takiego:

    Cytat:

    Już nie pamiętam który rejestr i jaki bit :) ...w pętli głównej programu odczytywałem ten rejestr i wszystko. :) Mimo że procesor wykonywał wiele innych zadań, to żaden z pakietów się nie zagubił ;)


    I coś takiego byłoby rozwiązaniem mojego problemu z płytką odbiornika, który mam zablokowany do czasu odebrania czegoś. Dałem zmienną, która się zwiększa cały czas, ale jej zmiana na LCD jest tylko w momencie odbioru ( i przeskakuje co kilka pozycji )[/quote]

  • #596 07 Kwi 2013 23:59
    nanoTECHNO
    Poziom 14  

    U mnie to działa na tej zasadzie ze procesor sobie cos tam wykonuje, jeśli nadejdą jakieś dane RFM12b generuje przerwanie i mikrokontroler odbiera cała ramkę. W tym czasie procesor nie może zajmować się innymi rzeczami.

  • #597 08 Kwi 2013 09:19
    maximus22_kr
    Poziom 18  

    No właśnie tak to powinno działać ( u mnie to działa poprawnie w przypadku RC5 i klawiatury na PCF8574A )

    Raczej nie sądzę, że to sposób zapisu odebranych danych ( jeszcze nie przerobiłem na odbiór w pętli ) do zmiennych powoduje taki problem.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  • #598 08 Kwi 2013 12:22
    nanoTECHNO
    Poziom 14  

    Trochę to nie tak. Widze że wskakujesz z całą obsługa odbioru danych do procedury "Rfm12_czuwaj:" a w tej procedurze powinno być tylko to :

    Code:

    Rfm12_czuwaj:
          Data_out = &H8298  '!er,!ebb,et,es,ex,!eb,!ew,dc        8298     er,!ebb,!et,es,ex,!eb,!ew,!dc
          Gosub Rf12_wrt_cmd_2
          Data_out = &HCA81
          Gosub Rf12_wrt_cmd_2
          Data_out = &HCA83
          Gosub Rf12_wrt_cmd_2
          Data_out = &H0000  'po tej komendzie stan wysoki na nIRQ. Przygotowanie do przerwania
          Gosub Rf12_wrt_cmd_2
    Return


    Teraz na nIRQ masz stan wysoki i przygotowujesz przerwania od tej lini żeby reagowało na stan niski.
    Możesz teraz zająć się innymi rzeczami. Gdy RFM12b wykryje dane to zgłasza to przerwaniem na nIRQ (stan niski) i mikrokontroler wskakuje do przerwania "_rfm12_odbierz: " i w tej wlasnie procedurze umieść odczyt całej ramki.

    Code:

    _rfm12_odbierz:
      Gosub Rf12_receive
      D1 = Received_data                                        ' ciag inicjujacy - $TEMP / $DATA
      Gosub Rf12_receive
      D2 = Received_data                                        ' ciag inicjujacy - $TEMP / $DATA
    ..................................
    .................................
      Gosub Rf12_receive
      D45 = Received_data                                       ' informacja o sekundzie z DCF77

      Data_out = &HCA81
      Gosub Rf12_wrt_cmd_2

      Data_out = &HCA83
      Gosub Rf12_wrt_cmd_2
       
    '(
      Data_out = &H8298  '!er,!ebb,et,es,ex,!eb,!ew,dc        8298     er,!ebb,!et,es,ex,!eb,!ew,!dc
          Gosub Rf12_wrt_cmd_2
          Data_out = &HCA81
          Gosub Rf12_wrt_cmd_2
          Data_out = &HCA83
          Gosub Rf12_wrt_cmd_2
          Data_out = &H0000  'po tej komendzie stan wysoki na nIRQ. Przygotowanie do przerwania
          Gosub Rf12_wrt_cmd_2

    ') TO WYWAL, powinno sie to znaleźć w "Rfm12_czuwaj:"

          Flag = 0 'TU ZMIEN NA Flag = 0 bo było 1 to jest zerowanie flagi by mozliwe było ponowne wejscie RFM12B w petli głownej w tryb czuwania

    Hist1 = D7
    Hist2 = D11
    Hist3 = D15
    Hist4 = D19
    Hist5 = D23
    Hist6 = D27
    Hist7 = D31
    Hum1 = D34
    Ciag = Chr(d1) + Chr(d2) + Chr(d3) + Chr(d4) + Chr(d5)

        Locate 4 , 19
        Lcd Chr(7)

     Reset Licznik_rfm_lcd
     Reset Flaga_rfm_lcd
     Gosub Oblicz
    Return


    Pętla główna to :
    Code:

    Do

      If Flag = 0 Then
          Gosub Rfm12_czuwaj
          Flag = 1 'po to 1 zeby w kołko Ci nie ustawiał odbiornika RFM w tryb czuwania.
          Enable Interrupts
          Enable Int2
        End If
    ...................
    'inne komendy
    loop

  • #599 08 Kwi 2013 19:46
    maximus22_kr
    Poziom 18  

    zrobiłem tak, jak Kolega napisał:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    w pętli głównej mam:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    No i teraz po wgraniu programu mam same zera - pulsujące. Po pierwszym odebraniu danych znika wszystko i pojawia się symbol określony jako chr(7) - symbol antenki, który niestety nie znika, czyli dalej coś blokuje Timer0, bo gaśnięcie tego symbolu jest liczone czasem z Timer0.
    Więc ekran jest pusty cały czas - tylko ten symbol.
    Czyli coś odbiera, ale nie wchodzi w podprogram Oblicz. Albo nie odbiera, jak trzeba, na pewno wchodzi w _rfm12_odbierz , bo wyświetla symbol chr(7)


    Dołożyłem jeszcze w _rfm12_odbierz
    Disable Int2

    teraz zaczął wyświetlać co trzeba, sprawdzę jeszcze co z Timer0

    Dodałem w programie Timer0:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    a w głównym programie ma wyświetlać na LCD i niestety co jakiś czas przeskakuje ( właściwie wtedy, gdy odbiera dane z RFM12 ) o kilka pozycji .

    już nie pulsuje wyświetlacz - zaraz po Do było cls :-).

    Ta zmienna Liczy odlicza po włączeniu zasilania, doszła do 21, ale po pierwszym odebraniu danych z RFM12 znowu się blokuje o zmienia co jakiś czas.

  • #600 10 Kwi 2013 23:24
    maximus22_kr
    Poziom 18  

    Mógłby jeszcze Kolega wyjaśnić kwestię zmiennej Flag ?

    Bo program _rfm12_odbierz na koniec zmienia Flag na 0.

    W pętli głównej jest 6 linii kodu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    czyli po przejściu do Rfm12_czuwaj zmienia stan na 1. Usunięcie tych 6 lini z pętli głównej powoduje, że nic się nie zawiesza, ale też nie odbiera.

    No, ale nie zauważyłem działania, które zmieniałoby stan z 1 na 0. Chyba, że tylko odebranie czegoś w _rfm12_odbierz powoduje zmianę.

    W każdym razie to ( zwłaszcza komentarz ):
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    u mnie się niestety nie sprawdza, bo cały czas czuwa i blokuje wszystko.