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

[Bascom] Modulacja impulsów, problem z OC1A

tomson5 27 Mar 2010 09:11 1935 7
  • #1 7885034
    tomson5
    Poziom 16  
    Witam
    Potrzebuje wykonać następujace zadanie.
    Mam impulsy (ok 1kHz) które wprowadzam na wejście INT0
    Chciałbym aby na te impulsy została nałożona modulacja dla przykładu np: 36kHz
    Wyjście takiego zmodulowanego sygnału to PB1, OC1A w Atmega8
    Wykonałem prosty program testowy który zamieszczam poniżej
    Program działa ale niestety często po zakończeniu transmisji wyjście OC1A pozostaje w stanie wysokim czasami w stanie niskim (loteria)



    
    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Pinb.1 = Output
    Config Pind.2 = Input
    Set Portd.2
    Config Timer1 = Timer , Compare A = Toggle , Compare B = Disconnect , Prescale = 1 , Clear Timer = 1
    Dim Zmienna As Word 
    Enable Interrupts
    Enable Int0
    On Int0 Przerwanie
    Zmienna = 111
    Stop Timer1
    Pwm1a = Zmienna
    
    Do
     Stop Timer1
    Loop
    End
    
    Przerwanie:
    Start Timer1
    Return
    


    Proszę o jakieś propozycję rozwiazania problemu
  • #2 7885271
    WOBI
    Poziom 19  
    Zdefiniuj problem, co tak naprawdę chcesz zrobić?. Program co napisałeś nie robi nic oprócz tego że losowo włącza i wyłącza timer i masz przypadkowe stany przebiegu ( startujesz i stopujesz przypadkowo).Zobacz że przerwanie włącza timer i zaraz po wyjściu z przerwania w pętli do loop wylącza. Chyba chcesz by impulsy wejsciowe generowały przebieg 38kHz taki jak robi się w przesyłaniu podczerwienią w pilotach zdalnego sterowania? Sterowanie diodą nadawczą IR?

    [
  • #3 7885350
    tomson5
    Poziom 16  
    Cytat:
    Chyba chcesz by impulsy wejsciowe generowały przebieg 38kHz taki jak robi się w przesyłaniu podczerwienią w pilotach zdalnego sterowania? Sterowanie diodą nadawczą IR?


    Na tym przykładzie chcę się tego nauczyć potem mogę sobie zmienić częstotliwość, teraz mi łatwiej to obserwowac na oscyloskopie

    Więc zakładamy że to ma byc pilot zdalnego sterowania
    ale nie chcę używać polecenia RCsend
  • Pomocny post
    #4 7885711
    WOBI
    Poziom 19  
    Ok rozumiem. Spróbuj tego. Użyte przerwanie. Można też zrobić bez zależnie od potrzeb.

    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Dim Zmienna As Word
    Dim A As Bit
    
    Config Pinb.1 = Output
    Config Pind.2 = Input
    Set Portd.2
    '============ definicje timera ================================
    Config Timer1 = Timer , Compare A = Toggle , Compare B = Disconnect , Prescale = 1 , Clear Timer = 1
    Tccr1a = Tccr1a And &B00111111          'wylaczamy wyjscie  OC do timera
    Zmienna = 111
    Stop Timer1
    
    '================= definicja przerwan =========================
    Config Int0 = Change   ' definiujemy jakie zbocze ma wyzwalac nosna tu oba
    On Int0 Przerwanie
    
    
    Enable Interrupts
    Enable Int0
    Start Timer1
    
    Pwm1a = Zmienna
    
    ' ======= program glowny =================
    Do
    
    
    
    
    
    Loop
    
    ' ============ przerwanie stan H na PinD.2 wlacza generowanie a L wylacza
    Przerwanie:   ' gdy wykryto zbocze to wlaczamy nosna lub wylaczamy zaleznie od stanu wejscia
    
     If Pind.2 = 1 Then
    
          Tccr1a = Tccr1a Or &B01000000          'dolaczamy wyjscie  OC do timera
        Else
    
        Tccr1a = Tccr1a And &B00111111           ' odlaczamy OC od timera, stan taki jak ustalimy Portb.1
    
      End If
    
     Return
    '===================================


    lub wersja zostawia noge OC w wysokim stanie

    
     else
    Tccr1a = Tccr1a or &B11000000           ' stan wysoki zostaje na OC gdy L
     end if
    


    lub stan niski na OC

    
     else
    
    Tccr1a = Tccr1a xor &B11000000           ' stan niski zostaje na OC gdy L
     end if
    
  • #5 7900388
    tomson5
    Poziom 16  
    Dziękuje bardzo za okazaną pomoc.
    Przepraszam za zwłoke w odpowiedzi ale obowiązki rodzinne mnie pochłoneły.

    Mam jeszcze prośbę tak aby coś wyciągnąć z tej lekcji.
    Czy możesz opisać poszczególne bity rejestru Tccr1a
    W książce mam je nazwane ale nie opisane za co który bit odpowiada.
  • #6 7900535
    WOBI
    Poziom 19  
    bity b.7 = COM1A1 i b.6 = COM1A0 dotyczą wyjścia OC1A
    bity b.5 = COM1B1 i b.4 = COM1B0 dotyczą wyjścia OC1B

    a ich znaczenie to gdy 0 i 0 wyjścia OCX są odłączone od timera i pełnią rolę portu in/out zależnie od ustawień kierunku.

    0 i 1 to "toogle" czyli OCX zmienia się stan na przeciwny gdy "compare match" nastąpiło porównanie.

    1 i 0 to "clear" czyli stan niski OCX gdy nastapiło porównanie

    1 i 1 to "set" czyli stan wysoki OCX gdy nastapiło porównanie

    to w trybie timera NIE PWM

    bit b.3 to FOC1A Force Output Compare for channel A
    bit b.2 to FOC1B Force Output Compare for channel B

    bity trybu generowania fali prostokątnej Waveform Generation Mode powoduja ze na końcówkach OCX jest generowany przebieg a bity blokuja by nie były generowane przerwania. Są tylko aktywne jeśłi timer nie pracuje w trybie PWM. The FOC1A/FOC1B bits are only active when the WGM13:0 bits specifies a non-PWM mode.

    bit b.1 to WGM11 tryb WAVEform wlacza na OC1
    bit b.0 to WGM10 tryb Waveform walcza na OC0

    to tak w skrócie po reszte odsyłam na PDfa ATMega8 strona 97 do 100 opis timera1 16bit.
  • #7 8009464
    tomson5
    Poziom 16  
    Witam
    Odświerzam temat bo mam pytanie związane z nim.

    To co podał mi @WOBI działa świetnie.
    Czy jest możliwe rozbudowanie tego programu tak aby drugie wyjście OC1b działało podobnie jak OC1a tylko z inną częstotliwością

    W programie jest:
    
    Config Timer1 = Timer , Compare A = Toggle , Compare B = Disconnect , Prescale = 1 , Clear Timer = 1


    pomyślałem że mógłbym zrobić tak
    
    Config Timer1 = Timer , Compare A = Toggle , Compare B = Toggle , Prescale = 1 , Clear Timer = 1


    Jest też:
    
    zmienna = 111
    Pwm1a = zmienna 
    


    Chciałbym dodać coś takiego:
    
    zmienna = 111
    zmienna2 = 65
    Pwm1a = zmienna 
    pwm1b = zmienna2 
    


    Czy dobrze kombinuje czy może to totalny niewypał ??
REKLAMA