logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Bascom][Atmega16] Problem z radarem IR

pier 09 Lut 2010 00:18 2286 6
REKLAMA
  • #1 7666107
    pier
    Poziom 24  
    Witam
    Niedawno zbudowałem radar na podczerwień coś na wzór tego: https://www.elektroda.pl/rtvforum/topic1382474.html
    Działał wyśmienicie aż do momentu kiedy zachciało mi się coś zmienić w programie i przypadkowo go usunąłem bez możliwości odzyskania. Po jakimś czasie udało mi się napisać program ale mam pewien problem z którym nie mogę sobie poradzić i nie wiem jak go rozwiązałem wcześniej. Otóż gdy tsop1136 widzi odbitą wiązkę podczerwieni od obu diod IR na raz (przeszkoda na środku) to przez chwilę reaguje prawidłowo i po jakiejś sekundzie przestaje reagować, gdy zdejmę przeszkodę z pola widzenia i znów ją tam umieszczę czujnik znów tak samo reaguje. Dodam że anody diod IR są sterowane z jednej strony przebiegiem ok 36kHz a procesor w odpowiednim momencie załącza konkretną diodę podając stan niski z drugiej strony (ale to widać chyba w programie). Moim zdaniem w momencie gdy opisana sytuacja występuje Tsop przestaje reagować na podczerwień tak jakby jej wiązka była za mało modulowana.

    Proszę o pomoc w rozwiązaniu tego problemu.

    
    $crystal = 4000000
    
    Config Porta = Output
    Reset Porta.0
    Reset Porta.1
    Set Porta.2
    Set Porta.3
    
    
    Config Portb = Input
    Portb.0 = 1
    
    Config Timer0 = Timer , Prescale = 1
    
    On Timer0 Ir
    
    
    
    Enable Interrupts
    Enable Timer0
    Load Timer0 = 53
    
    
    
    Do
    '"#####################################Procedura radaru#####################################"
    
    Set Porta.0                                                 'zapal prawa diode IR
     If Pinb.0 = 0 Then                                         'jesli jest przeszkoda
      Reset Porta.2                                             'ustaw stan niski
       Else                                                     'jesli brak przeszkody
      Set Porta.2                                               'ustaw stan wysoki
     End If                                                     'poczekaj
     Waitms 50                                                  'zgas diodę IR
     Reset Porta.0
    
    'druga strona
    
    Set Porta.1
     If Pinb.0 = 0 Then
      Reset Porta.3
       Else
      Set Porta.3
     End If
     Waitms 50
     Reset Porta.1
    
    
    Loop
    End
    '"##############################################################################################"
    
    
    
    
    
    
    
    Ir:
    Load Timer0 = 53
    Toggle Portd.5
    Return
  • REKLAMA
  • #2 7667517
    wader_669
    Poziom 28  
    chyba nie zrozumiales do konca jak dziala to urzadzenie.
    Masz 2 diody nadawcze po lewej i po prawej. Na srodku jest odbiornik.
    1. nadajesz dioda lewa z czestotliwoscia 36khz (jak uzywasz tsop1136), nastepnie czytasz czy czujnik wykryl przeszkode jak tak to ustawiasz 1 na koncowke i zapalasz prawa diode signalizujaca, jak nie to najlepiej ustaw 0 na koncowke i zgas diode signalizujaca.
    2. nadajesz dioda lewa i prawa z czestotliwoscia 36khz, znowu czytasz stan jak czujnik cos wykryl to ustaw lewa i prawa diode sygnalizujaca i ustaw 1 na obydwie koncowki, jak nie to wiadoma sprawa 0 na koncowki i zgas diody
    3. Nadajesz dioda prawa i analogicznie jak w punkcie 1.

    Zrozumiano?
  • REKLAMA
  • #3 7668413
    zumek
    Poziom 39  
    pier napisał:
    ... Dodam że anody diod IR są sterowane z jednej strony przebiegiem ok 36kHz ...

    Te 36kHz, to tylko Twoje pobożne życzenie :| Diody nadawcze, "sterowane" są przebiegiem około 7.8 kHz, bo tak wynika z listingu, który nam tu podałeś.
    
    Load Timer0 = 53

    Ta instrukcja, jest powodem całego "zamieszania" :D
    Sprawdź w helpie, jak wygląda prawidłowa składnia instrukcji Load TimerX
  • #4 7670703
    pier
    Poziom 24  
    Kolego WADER_669 ja doskonale rozumiem jak ma działać to urządzenie.
    1.Nadaje lewą diodą Ir z częstotliwością 36kHz odczytuje tsop-a i jak coś odebrał to zapalam diodę sygnalizacyjną. Tak samo robię z drugą stroną. I do tego miejsca program działa dobrze.
    2.Nadaję lewą i prawą diodą i odczytuje czy tsop coś odebrał, jak odebrał to zapalam lewą i prawą diodę sygnalizacyjną, a guzik, a jak odebrał sygnał tylko z jednej diody IR?
    Skąd procek ma to wiedzieć? Procesor musi wiedzieć że tsop odebrał sygnał od obu diod IR wtedy wie że przeszkoda jest pośrodku!
    Pisałem już że miałem działający program tylko przez nieuwagę go usunąłem i wyglądał on prawie dokładnie jak ten teraz tylko miał jakoś inaczej poukładane WAITMS-y w pentli DO-LOOP, nie pamiętam jak.

    Program który zamieściłem wyżej działa ale po wykryciu przeszkody na wprost diody sygnalizacyjne palą się tylko przez około sekundę tak jakby tsop odbierał ciągły nie modulowany sygnał 36kHz. Bo jak wiadomo tsop musi mieć podany modulowany sygnał 36kHz inaczej odbierze sygnał tylko przez chwilę. I w tym właśnie tkwi problem, a nie w tym że nie nadaję nośnej 36kHz.

    Fakt mam nieprawidłową składnie przy ładowaniu timera ale jak wpiszę
    Load Timer0 , 53
    to program w ogóle nie działa.
  • REKLAMA
  • #5 7670860
    mirekk36
    Poziom 42  
    No tak, zumek dobrze pisze - zajrzyj do HELPA na składnię polecenia Load Timex

    jest tam wyraźnie napisane

    Load TIMERx , value

    czyli powinno chyba być u ciebie

    Load Timer0, 53

    zamiast Load Timer0 = 53

    A w tamtym temacie akurat nikt nie zwrócił na to uwagi bo autor tamtego tematu nawet się nie odezwał - i tak miałby dalej problem z tym =
  • #6 7670959
    pier
    Poziom 24  
    Ech, zmieniłem ładowanie timera0 dodatkowo poprawiłem program i dalej to samo.
    Teraz program wygląda tak:
    
    $crystal = 4000000
    
    Config Porta = Output
    Reset Porta.0
    Reset Porta.1
    Set Porta.2
    Set Porta.3
    
    
    Config Portb = Input
    Portb.0 = 1
    
    Config Timer0 = Timer , Prescale = 1
    
    On Timer0 Ir
    
    
    
    Enable Interrupts
    Enable Timer0
    Load Timer0 , 53
    
    
    
    Do
    '"#####################################Procedura radaru#####################################"
    
    Set Porta.0                                                 'zapal prawa diode IR
    If Porta.0 = 1 Then                                         'jeśli dioda się świeci to sprawdź tsop-a
     If Pinb.0 = 0 Then                                         'jesli jest przeszkoda
      Reset Porta.3                                             'ustaw stan niski
       Else                                                     'jesli brak przeszkody
      Set Porta.3                                               'ustaw stan wysoki
     End If
    End If
     Waitms 1                                                   'poczekaj
      Reset Porta.0                                             'zgaś diodę IR
    
    'druga strona
    
    Set Porta.1
    If Porta.1 = 1 Then
     If Pinb.0 = 0 Then
      Reset Porta.2
       Else
      Set Porta.2
     End If
    End If
     Waitms 1
      Reset Porta.1
    
    
    
    Loop
    End
    '"##############################################################################################"
    
    
    
    
    
    
    
    Ir:
    Load Timer0 , 53
    Toggle Portd.5
    Return


    I tak jak wcześniej wykrywa przeszkody z prawej i z lewej a środek tylko przez około sekundę a później brak reakcji.
    Pomocy...
  • REKLAMA
  • #7 7671348
    wader_669
    Poziom 28  
    pier przepraszam. Napisalem odpowiedz, a nie przeczytalem uwaznie, twojego posta. Tak to jest jak sie nie umie czytac ze zrozumieniem. Przepraszam jeszcze raz, ale moze zostac jako info dla innych jak dzial ten czujnik.
    _________________________________________
    Moze zamiast w bawienie sie w load timerX, zrob to starym sposobem counterX= Y i counterX= counterX +Y
REKLAMA