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

Co potrafi ATMEGA8? Program, TIMER1 z preskalerm=1. Czas się nie zmienia.

Roko 03 Mar 2005 22:56 2486 6
REKLAMA
  • #1 1284139
    Roko
    Poziom 12  
    Posty: 47
    Mam pytanie odnośnie ATmegi8-16PI . Napisałem prosty programik w BASCOM wykorzystujący TIMER1 z preskalerem=1. W przerwaniu zmieniam stan jednego z pinów 1,0,1.... aby otrzymać przebieg prostokątny. Wszystko co udało mi się wydusić przy kwarcu 14MHz to na wyjściu 10µs czyli 50kHz. W związku z ty mam pytanie czy jest metoda na wyciągnięcie 200kHz na jednym pinie z ATmega8-16PI. Poniżej to co napisałem żeby sprawdzić układ. Dodam że ATmegą bawię się pierwszy raz, a do tej pory bawiłem się AT.


    $regfile = "m8def.DAT"
    $crystal = 14000000
    Dim A As Word
    Config Timer1 = Timer , Prescale = 1
    On Timer1 Gen
    A = 5000
    Enable Timer1
    Enable Interrupts
    Load Timer1 , A
    Config Pinb.0 = Output
    Config Pind.0 = Input
    Config Pind.1 = Input

    Do
    Set Portd.0 : Set Portd.1
    If Pind.0 = 0 Then
    Waitms 1
    If A < 65533 Then
    A = A + 1
    End If
    End If
    If Pind.1 = 0 Then
    Waitms 1
    If A > 1 Then
    A = A - 1
    End If
    End If

    Loop

    End

    Gen:
    'Toggle Portb.0
    Portb.0 = 1
    Load Timer1 , A
    Portb.0 = 0
    Return


    Z instrukcją Toggle na wyjściu jest wypełnienie 50%.
    Zaś z Portb.0 = 1 i Portb.0 = 0 wypełnienie jest około 15% ale czas nie ulega zmianie.

    Dzięki za podpowiedzi i sugestie.
  • REKLAMA
  • #2 1284213
    smalski
    Poziom 17  
    Posty: 317
    Pomógł: 2
    Ocena: 8
    Witam!!
    Jasne,ze da sie ustawic wieksza szybkosc. Co do funkcji load timer1 nie mam zaufania. Przy wiekszych szybkosciach mi nie dzialala(sprawdzalem oscyloskopem).Lepiej uzyj Timer1=wartosc. Spokojnie powinienes uzyskac ponad 1 Mhz.
    pozdro/smalski
  • REKLAMA
  • #3 1284319
    Roko
    Poziom 12  
    Posty: 47
    Zmieniłem w liniach z Load na Timer1 = A ale nic to nie dało nadal 10us.
    Podejrzewam że nie pracuje z preskalerem =1 prawidłowo. Gdzieś czytałem z rok temu że kod programu będzie pracował z zegarem 14MHz (tak jest u mnie) a Timery z 8Mhz. Prawda czy nie ?. Z obliczeń na kalk.exe do wyliczania Timerów jeden cykl Timera przy 14Mhz to około 0.07us.Czyżby przeładowanie Licznika i jedno polecenie zajmowało tyle czasu?. Nie wiem co o ty sądzić.

    Dodano po 52 [minuty]:

    A no Panowie i Panie potrafi oj... potrafi.
    Najpierw podzękowanie dla SMALSKI za rozjaśnienie i odzew.
    Przedstawiam poniżej rozwiązanie, które przeszło moje najśmielsze oczekiwania 0.15us CZYLI 6.66MHz na wyjściu ale co najważniejsze nie trzeba definiować przerwania i tłuc się z opóźnieniami jest ono zdefiniowane wewnętrznie i w programie głównym możemy zająć się sterowaniem wyjścia , obsługą klawiatury i innymi bzdetami.
    Czyli ten BASCOM nie taki BE jak to opisują . Kwestia podejścia do tematu.


    $crystal = 14000000
    Dim A As Word , B As Word
    Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Compare B = Disconnect , Clear Timer = 1

    'konfiguracja timer1 do pracy w trybie compare
    'zrównanie sie wartości rejestru compare1a z timerem powoduje wyzerowanie licznika
    'oraz zmiane stanu wyjscia oc1a na przeciwny

    A = 500 'wartość początkowa compare1a = A
    Config Pinb.1 = Output 'linia oc1a jako wyjscie

    Config Pind.0 = Input
    Config Pind.1 = Input
    Compare1a = A 'wartosc okreslajaca czestotliwosc sygnalu na wyjsciu oc1a


    'petla glowna programu

    Do
    Compare1a = A
    Set Portd.0 : Set Portd.1 ' obsługa klawiszy +/-
    If Pind.0 = 0 Then
    Waitms 1
    If A < 65533 Then
    A = A + 1
    End If
    End If
    If Pind.1 = 0 Then
    Waitms 1
    If A > 0 Then
    A = A - 1
    End If
    End If
    Loop

    End

    Może się to przyda komuś bo było parę postów w tej sprewie.
    Może ktoś ma inne lepsze i łatwiejsze rozwiązania.
  • REKLAMA
  • #4 1324681
    marcinkwa
    Poziom 14  
    Posty: 164
    Pomógł: 5
    A może zamiast:
    If A < 65533 Then
    A = A + 1
    End If

    to:
    If A < 65533 Then incr A

    to jest to samo ale zajmuje mniej miejsca w Bascomie (w procku)

    incr A -> A=A+1
    decr A -> A=A-1

    pozdr.
  • REKLAMA
  • #5 1324751
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 135
    Można jeszcze inaczej, jeżeli zależy Ci na przerwaniach, to przy deklaracji, na końcu parametr NOSAVE
    On Timer1 Gen NOSAVE
    Durny BASCOM wrzuca na stos prawie wszystkie rejestry po wejściu do przerwania (w sumie 29 sztuk w AVR), a przed wyjściem z przerwania zdejmuje rejestry ze stosu. Stąd niesamowite opóźnienie. Oczywiście po zastosowania NOSAVE rejestrami musisz zająć się sam, ale już tylko tymi wykorzystanymi.
  • #6 1330055
    Smoczy
    Poziom 20  
    Posty: 436
    Pomógł: 26
    Ocena: 67
    Możesz także zrobić wstawke asm do obsługi samego przerwania, ale NOSAVE musi zostać. W ten sposób da się uzyskać częstotliwość ok fosc/4, ale wtedy pozostała część programu będzie troszkę kuleć.
  • #7 1333710
    Roko
    Poziom 12  
    Posty: 47
    Dzięki wszystkim którzy coś podpowiedzieli. Już trochę wiem o timerach w ATmegach 8.
    Chciałbym zakończyć ten temat (by najmniej z mojej strony)
    Jeszcze raz dzięki.
    A tak a propo Bascom AVR to jest w nim skucha , a mianowicie brak jest poleceń compare2 , pwm2 z tego też względu trzeba używać nazw rejestrów np:

    Tccr2 = 97 - PWM 8bit pin OC2 - 0 gdy licznik góra OC2- 1 gdy licznik dół Prescale - 1 gdy dodamy 8 to FAST-PWM
    Ocr2 = 128 wypełnienie 50

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy wykorzystania mikrokontrolera ATmega8-16PI do generowania sygnału prostokątnego o wysokiej częstotliwości za pomocą TIMER1 z preskalerem 1 w środowisku BASCOM. Autor napotkał ograniczenie do około 50 kHz przy kwarcu 14 MHz, co wywołało pytania o prawidłową pracę preskalera i taktowanie timerów. Wskazano, że zamiast używać polecenia Load Timer1 lepiej przypisać wartość bezpośrednio do rejestru Timer1, co pozwala osiągnąć częstotliwości rzędu MHz. Poruszono też temat opóźnień związanych z obsługą przerwań w BASCOM, które wynikają z automatycznego zapisywania i przywracania rejestrów na stosie. Zaproponowano użycie parametru NOSAVE przy deklaracji przerwania, co zmniejsza opóźnienia, ale wymaga ręcznego zarządzania rejestrami. Dodatkowo zasugerowano implementację obsługi przerwania w asemblerze, co umożliwia osiągnięcie częstotliwości około fosc/4, kosztem obciążenia programu głównego. W podsumowaniu zwrócono uwagę na ograniczenia BASCOM, takie jak brak poleceń compare2 i pwm2, co wymusza bezpośrednią manipulację rejestrami timerów (np. TCCR2, OCR2) dla generowania PWM i innych funkcji.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA