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

Atmega8 8MHz jak wykonać część kodu z częstotliwością 2MHz

Master Dragon 07 Gru 2009 13:36 1821 20
REKLAMA
  • #1 7356627
    Master Dragon
    Poziom 12  
    Mam panowie takie pytanie, jak część kodu wykonywać z prędkością 8MHz a część 2MHz.
    Czy wystarczy dać jakieś opóźnienia a jak tak to jakie?
  • REKLAMA
  • #3 7356720
    damiano713
    Poziom 15  
    2MHz to 4 razy mniej od 8MHz.
    Opóźnienie jest 4-krotne. Więc wstawiasz 4 instrukcje "nop" po każdej komendzie, albo spowalniasz program odpowiednią ilość "nop" na końcu bloku instrukcji. Np dla 100 instrukcji opóźnienie będzie wynosiło: 37,5us.

    P.S.
    Ten pomysł z "nop" przydał mi się kiedy urządzenie było kilka razy wolniejsze od kwarcu. Najprościej było więc wysyłać instrukcje poprzez port oddzielone kilkoma "nop".
  • REKLAMA
  • #4 7356746
    Freddie Chopin
    Specjalista - Mikrokontrolery
    damiano713 napisał:
    2MHz to 4 razy mniej od 8MHz.
    Opóźnienie jest 4-krotne. Więc wstawiasz 4 instrukcje "nop" po każdej komendzie

    Genialne obliczenia, tyle ze jak wstawisz 4 nopy to masz 5x wolniejszy program (to po pierwsze) tylko przy założeniu, ze każda instrukcja trwa 1 cykl (to po drugie), co nie jest prawdą.

    4\/3!!
  • REKLAMA
  • #5 7356760
    damiano713
    Poziom 15  
    Przyznaje, mój błąd.
    Zawsze można sobie podliczyć takty w asemblerze, ręcznie. Lub w jakimś symulatorze. Wtedy wiadomo ile potrzeba odczekać.
  • #6 7356809
    MELP
    Poziom 16  
    Witam!
    O ile sie nie mylę to ATmega8 nie ma preskalera zegara, taka opcję ma np.: ATmega88. W ATmega88 odpowiada za to rejestr CLKPR i poprzez zmianę jego zawartości można sygnał dzielić przez kolejne potęgi 2.
    Proponował bym cały program wykonać z prędkością 8 MHz, a po wykonaniu części programu który miał być wykonany z mniejszą częstotliwością, przejść w jeden z trybów wstrzymania. Pozwoli to zaoszczędzić trochę energii.
  • REKLAMA
  • #7 7356811
    chudybyk
    Poziom 31  
    A może niech lepiej autor napisze co takiego chce uzyskać? Pewnie jest bardziej elegancki sposób niż regulowanie szybkości wykonywania programu. Swoją drogą, pomysł jest niecodzienny. ;-D
  • #8 7357150
    mirekk36
    Poziom 42  
    chudybyk napisał:
    A może niech lepiej autor napisze co takiego chce uzyskać? Pewnie jest bardziej elegancki sposób niż regulowanie szybkości wykonywania programu. Swoją drogą, pomysł jest niecodzienny. ;-D


    dokładnie to samo poleciłbym autorowi zamist polecania prób wstawiania rozkazów NOP ;) i podobnych tym bardziej, że nie wiadomo nawet w jakim języku pisze on swój pierwszy program. Tak więc ten niecodzienny pomysł wynika na razie bardziej z niewiedzy jak można sobie radzić w pewnych sytuacjach. No ale aby do tego dojść też trzeba umieć zadawać pytania - podając jakieś chociaż minimum informacji a nie tylko tak zdawkowo opisać - pseudo problem. Piszę "pseudo" bo może się okazać, że wystarczy podpowiedzieć 2-3 słowa i już problem zniknie ;)
  • #9 7360780
    Master Dragon
    Poziom 12  
    Po pierwsze nie pierwszy program
    Po drugie w C
    Po trzecie zastosowanie tego będzie takie że pamięć eeprom którą posiadam maksymalnie wyciąga 2Mhz a potrzebuje troszkę większej prędkości ponieważ będzie do tego obsługa uart która będzie z czytywać z tej pamięci zapisywać i do tego pójdzie przez uart jeszcze kilka rzeczy i zależy mi na większej prędkości uart. A nie mam możliwości zmiany eepromu.
  • #10 7360809
    chudybyk
    Poziom 31  
    Ooooo! Robi się jaśniej! ;-)
    Jaki eeprom? Jaka szybkośc uarta?
  • #11 7360856
    mirekk36
    Poziom 42  
    Master Dragon napisał:

    Po trzecie zastosowanie tego będzie takie że pamięć eeprom którą posiadam maksymalnie wyciąga 2Mhz a potrzebuje troszkę większej prędkości ponieważ będzie do tego obsługa uart która będzie z czytywać z tej pamięci zapisywać i do tego pójdzie przez uart jeszcze kilka rzeczy i zależy mi na większej prędkości uart. A nie mam możliwości zmiany eepromu.


    Łooo matko! .... człowieku tego nie robi się poprzez jakieś tam twoje narazie wydumane przełączanie częstotliwości pracy procesora ;)

    Ależ ciebie trzeba ciągnąć za język .... a cóż to za tajemniczy interfejs wykorzystujesz do komunikacji z tą zewnętrzną pamiecią EEPROM ??? Procka możesz taktować nawet kwarcem 16MHz i większym a i tak spokojnie będzie można tą pamięć obsłużyć bez żadnych zmian jego prędkości.

    Tak jak kolega powyżej napisał - podaj w końcu jakieś szczegóły - interesujące cię prękości UART oraz rodzaj tej pamięci .... a wtedy każdy chętnie podpowie ci co i jak dalej można z tym zrobić bez takich udziwnionych na razie pomysłów.
  • #12 7360966
    Master Dragon
    Poziom 12  
    Jest to microwire eeprom 93C86 ja z tym zmianą częstotliwości przez przełączenie nie napisałem wiem że da się to zrobić przez opóźnienie tylko jak to wyliczyć.

    Założenie dajmy takie że na razie w chwili wykonywania zapisu czy odczytu procesor wykonuje tylko te operacje.
  • #13 7361012
    piti___
    Poziom 23  
    Zmień prescaler dla SPI i po sprawie. Chyba że korzystasz z programowego SPI to wstaw kilka delay_us(x) i również po sprawie...
  • #14 7361025
    chudybyk
    Poziom 31  
    SPI. Chyba, że już masz to podpięte na inne piny i nie masz szans ich zmienić. Wtedy czeka Cię trochę dłubaniny z programem, ale nawet wtedy kombinuj z przerwaniami, żeby transmisję do eeproma zrobić w tle.
  • #15 7361089
    Master Dragon
    Poziom 12  
    No na spi nie ma szans tylko odstęp czasowy ale jak obliczyć ten czas
  • #16 7361099
    mirekk36
    Poziom 42  
    A dlaczego w Atmega8 nie masz szans na SPI - skoro masz tam SPI??? tak z ciekawości zapytam

    A jeśli robisz już programowy SPI - to looknij sobie w notę PDF pamięci jakie tam są czasy przy transmisji, jakie opóźnienia i potem posłuż się choćby najprostszymi _delay_us(xxx)
  • #17 7361202
    Master Dragon
    Poziom 12  
    chodzi o to że w 93C86 jest 22bitowy klucz i nie wiem za bardzo jak to ustawić żeby mi taki klucz wysyłał i to w formie 3bity 11bitów 8bitów bo tak wygląda składnia.
  • #18 7361275
    Mat_91
    Poziom 25  
    O matko:] Przecież pamięć wyśle Ci wtedy 3 bajty, a ty z tych 3 bajtów wyciągniesz sobie normalnie te bity które potrzebujesz.
  • #19 7361283
    Master Dragon
    Poziom 12  
    ja nie potrzebuje tego odbierać tylko w taki sposób wysyłać to jest spi 0 i temu napisałem sobie to ręcznie
  • #20 7361405
    piti___
    Poziom 23  
    Wszystko jest w PDFie od pamięci.
    Składasz bitowo pierwszy bajt jako
    SB + OPCODE + X + A9 + A8 + A7 + A6
    2 bajt
    A5 + A4 + A3 + A2 + A1 + A0 + D7 + D6
    3 bajt
    D5 + D4 + D3 + D2 + D1 + D0 + 0 + 0

    i sru 3 bajty przez SPI...
  • #21 7370504
    Master Dragon
    Poziom 12  
    A sprawdzałeś to czy to działa bo mi jakoś nie.
    Może jakiś konkretny kod np dla 93C86 organizacja 16 i 8 bitowa lub dla 93c46 tak samo organizacja 8 i 16bitowa. Bo takie posiadam i mógł bym sprawzić.
REKLAMA