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

RFID Atmega16 [BASCOM] - Odbiór przez UART

02 Lut 2013 20:07 2349 9
  • Poziom 18  
    Witam, mam problem i proszę o pomoc. Posiadam czytnik RFID, który ma wyjście TX. W terminalu na komputerze odbiera ok. przykładowy odczyt (0A00A295DD). Dane wysyłane są w 10-ciu znakach i działa to dobrze, praktycznie żadnych błędów. Teraz opiszę mój problem. Chciałem zacząć od prostej obsługi. Czyli odbiór danych przez UART. Wpisanie jednego odczytanego transpondera "na sztywno" (tak na próbę). Jeśli odebrany kod zgadza się z wpisanym na sztywno to oczekiwanie np. 1 sekundę, jeśli nadal jest ten sam odczyt (transponder nie został zabrany z czytnika) wtedy coś się dzieje (powiedzmy zmiana stanu na którymś pinie). Problem polega na tym, że nie potrafię na sztywno wpisać odczytu. Bascom wywala mi błąd i nie mogę skompilować, przez co nawet nie wiem czy dobrze odbierze atmega przez UART. Prosił bym o pomoc. Dodam że czytnik wysyła 19200 bodów, a atmega jest taktowana kwarcem 11.0592MHz. (Będzie 16MHz jak tylko dostanę przesyłkę z częściami).
  • Poziom 39  
    MAREK MRK napisał:
    Posiadam czytnik RFID, który ma wyjście TX.
    W standardzie jakim, 3,3V/5V/RS232 ?
    MAREK MRK napisał:
    Jeśli odebrany kod zgadza się z wpisanym na sztywno to oczekiwanie np. 1 sekundę, jeśli nadal jest ten sam odczyt (transponder nie został zabrany z czytnika) wtedy coś się dzieje (powiedzmy zmiana stanu na którymś pinie).
    A czy czytnik nie wysyła czasem kodu 1 raz (po zbliżeniu)? Tego nie wiem. Możesz to sprawdzić, skoro czytnik działa ci z komputerem.
    MAREK MRK napisał:
    Problem polega na tym, że nie potrafię na sztywno wpisać odczytu.
    A co to znaczy "wpisać na sztywno odczyt"?
    MAREK MRK napisał:
    Bascom wywala mi błąd i nie mogę skompilować, przez co nawet nie wiem czy dobrze odbierze atmega przez UART.
    My też nie będziemy wiedzieć, bo kodu ani schematu nie zamieściłeś. Nie wiemy, czy twoja Atmega16 w ogóle działa, a nic o tym nie wspomniałeś.
    MAREK MRK napisał:
    Dodam że czytnik wysyła 19200 bodów, a atmega jest taktowana kwarcem 11.0592MHz. (Będzie 16MHz jak tylko dostanę przesyłkę z częściami).
    Tutaj akurat bym został przy tym kwarcu. Chyba, że dla ciebie robi różnice 5MHz? Dla UART - myślę, że różnica jest żadna (przy tej prędkości).
  • Poziom 18  
    Standard 5V, czytnik wysyła kod ciągle po zbliżeniu transpondera i przestaje wysyłać po oddaleniu go, "wpisać na sztywno" miałem na myśli spisać w program jeden transponder (zmienna, może jakaś tablica) i porównywać to z odczytem, o do zamieszczenia kodu lub schematu to wolał bym napisać na nowo cały program, atmega działa na 100%, Kwarc mi nie robi żadnej różnicy, ważne by procesor wyrobił z odbieraniem 19200 bodów.
  • Poziom 39  
    MAREK MRK napisał:
    Standard 5V, czytnik wysyła kod ciągle po zbliżeniu transpondera i przestaje wysyłać po oddaleniu go, "wpisać na sztywno" miałem na myśli spisać w program jeden transponder (zmienna, może jakaś tablica) i porównywać to z odczytem,

    Wszystko to się da zrobić.
    MAREK MRK napisał:
    o do zamieszczenia kodu lub schematu to wolał bym napisać na nowo cały program,
    Zacznij od przedstawienia nam kodu.
    MAREK MRK napisał:
    Kwarc mi nie robi żadnej różnicy, ważne by procesor wyrobił z odbieraniem 19200 bodów.
    Wyrobi się bez problemu.
  • Poziom 18  
    Przedstawiam kod. Mam nadzieję, że przybliży on ideę działania jaką chciał bym na początek osiągnąć. Mam narazie 5 transponderów do testów.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Myślałem o wpisaniu tego w jakąś tablicę i porównywanie znak po znaku, ale nie wiem jak się zabrać za to.[/code]
  • Moderator na urlopie...
    Jakaś masakra a nie kod.
    Gdzie niby masz zaimplementowany odbiór danych z UART?
    Jakim cudem chcesz wpisać do zmiennej String*1 (która nie może przechować nawet jednej litery, bo przechowuje tylko znak końca stringa) ciąg znaków?
    Najprościej kod transpondera zapisać jako tablicę 5-ciu bajtów. Potem masz tablicę z akceptowanymi transponderami (posortowanymi rosnąco lub malejąco) i metodą wyszukiwania połówkowego odnajdujesz (lub nie, jeśli go nie ma) numer akceptowanej karty.
  • Poziom 39  
    MAREK MRK napisał:
    Przedstawiam kod.
    Pomijając fakt, że kod napisałeś "na sztukę", to nawet się on nie kompiluje. Czeka ciebie jeszcze dużo nauki, ale zacięcie masz.. :)
  • Poziom 18  
    Odbiór jest "input", W zmiennej wiem że nie mogę przechowywać a za tablicę nie wiem jak się zabrać dlatego piszę ten post.

    Dodano po 52 [sekundy]:

    Wiem że się nie kompiluje bo nie można zapisać tego w zmiennej dlatego przychodzę po pomoc.
  • Moderator na urlopie...
    A w ogóle to ten input zadziała Ci tylko raz, po uruchomieniu programu (poza pętlą Do...Loop), ponadto w przypadku takich urządzeń nie robi się "eliminacji drgań styków".

    A ma szanse się skompilować i ba, nawet działać, tylko chyba bascom nie dopuszcza porównywania stringów wprost, dlatego zastosuj odpowiednio skonfigurowaną funkcję INSTR. Ale pierwsze poczytaj o stringach wogóle i o tym, co oznacza ta gwiazdka i liczba za nią w deklaracji.
  • Poziom 18  
    Eliminacji drgań styków nie ma, oczekiwanie sekundowe jest po to, aby stan portu zmienił się raz a nie kilkanaście (ponieważ odczyt RFID jest ciągły a nie tylko 1 po zbliżeniu).

    Dodano po 2 [godziny] 13 [minuty]:

    Troszkę szukałem na temat tej tablicy którą miał bym zrobić. Niestety nic konkretnego (co by przyniosło skutki) nie znalazłem. Prosił bym o pomoc, materiały, fragment kodu, coś co by mi mogło pomóc.