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

Amega128 4MHz / 16MHz konfiguracja portów

Roman Szemik 06 Lut 2011 20:13 2535 31
  • #1 9113492
    Roman Szemik
    Poziom 14  
    Witam.

    Obecnie tworzę projekt na atmega128 i testowałem go na kwarcu 4MHz i wszystko działa poprawnie. Jako że chciałem zwiększyć prędkość działania programu zamieniłem kwarc na 16MHz, wszystkie ustawienia dotyczące kwarcu w bascom AVR zmieniłem i natrafiłem na ciekawy problem.
    Poszukując przyczyny nie działania programu skasowałem wszystko oprócz konfiguracji portów i napisałem banalny programik który powinien działać (działa na 4MHz) lecz nie działa.

    Poniżej mój program:

    config portA = &B1111111
    config portB = &B1111111
    config portC = &B1111111
    config portD = &B1111111
    config portE = &B1111111
    config portF = &B1111111
    config portG = &B1111111
    
    portA=255
    portB=255
    portC=255
    portD=255
    portE=255
    portF=255
    portG=255
    
    do
    
    portF.3=0
    wait 1
    portF.3=1
    wait 1
    
    loop


    Powyższy program nie działa, a ja zauważyłem pewną zależność. Jeśli pomiędzy konfiguracją portów wpiszę to co poniżej to wszystko jest dobrze i program działa jak powinien.

    config portA = &B1111111
    waitms 100
    config portB = &B1111111
    waitms 100
    config portC = &B1111111
    waitms 100
    config portD = &B1111111
    waitms 100
    config portE = &B1111111
    waitms 100
    config portF = &B1111111
    waitms 100
    config portG = &B1111111


    Czy ktoś spotkał się z takim problemem? Oczywiście to rozwiązanie można by zostawić, lecz konfiguruję również dużo zmiennych i przez takie opóźnienia zrobi się bałagan a ja nie wiem czy to jest normalne zachowanie kontrolera.

    Z góry dziękuję za wszelkie pomocne wskazówki.

    Kod proszę umieścić w znacznikach code.
    Robak
  • #3 9114974
    Roman Szemik
    Poziom 14  
    Witam.

    Bitów oczywiście 8 tylko szybko pisałem i wyszła literówka / cyfrówka.
    W zasadzie bezpieczniki niczym się nie różnią dla kwarcu 4 i 16MHz. Wybrana została wysoka częstotliwość dla rezonatora zewnętrznego.
    Program w podstawowej wersji z kwarcem 4MHz działa poprawnie obsługując wyświetlacz graficzny i klawiaturę matrycową.
    Po wymianie rezonatora kwarcowego 16MHz program się wykrzacza i restartuje, oczywiście wcześniej informuję program na jakim teraz kwarcu pracuje. Po nitce do kłębka i tak jak wcześniej pisałem problemy są już na początku przy konfiguracji portów i może również przy konfiguracji zmiennych?
    Pozdrawiam.
  • #4 9115000
    asembler
    Poziom 32  
    Co znaczy sie wykrzacza?
    Ze są krzaki na LCD a moze wyświetlacz ma "timingi" i trzeba to uwzględnić
    A jak coś jeszcze odczytujes z lcd to juz kanał
    Zresztą bez kodu całego to można sobie
    Przy wiekszych MIPSACH wieksze prawdopodobieństwo wystąpienia błędu jak coś zle napisane.
  • #5 9115644
    Roman Szemik
    Poziom 14  
    Witam.

    Miałem na myśli iż resetuje mi się cały program. W programie załączam cykl odliczania do tyłu pewnej zmiennej i wyświetlania na LCD. Oprócz tego restartowana podczas odliczania to po podaniu napięcia zasilania jeszcze przed pętlą do loop ma mrugnąć podświetleniem LCD i zapiszczeć. Tego już nie wykonuje i dlatego skasowałem cały program i pozostawiłem samo mruganie portu jak powyżej.

    Bardzo mi zależy na 16MHz i dlatego szukam przyczyny przy Waszym udziale.

    Pozdrawiam.
  • Pomocny post
    #6 9115732
    piotrva
    VIP Zasłużony dla elektroda
    hmm, zaiste dziwne,
    a sprawdź co się stanie jak wszystkie configi zastąpisz:
    
    DDRA = 255
    DDRB = 255
    DDRn = 255
    ...
    DDRG = 255
    
  • Pomocny post
    #7 9115889
    asembler
    Poziom 32  
    Masz na 100% błąd w 124 linii popraw typ zmiennej.
  • #8 9115918
    SylwekK
    Poziom 32  
    A może wina leży w samym uC - może jakaś wada fabryczna i nie bardzo daje radę z tym 16MHz... Sprawdzałeś z innym egzemplarzem ?
  • #9 9115952
    asembler
    Poziom 32  
    spróbuj na wewnętrzym może?
    Kiedyś miałem podobny problem za cholerę nie chciala atmega ruszyc na 16mhz chodziła max do 12Mhz i to niestabilnie. Okazało sie że kondensatorki przy kwarzu były nie pF ale jakies dużo większe już nie pamiętam ile. A wykryłem to dopiero jak podczas kolejnej wymiany kwarzu musiałem przelutować kondensatorki i się połamały.
  • #10 9116214
    dawid512
    Poziom 32  
    Cytat:
    W zasadzie bezpieczniki niczym się nie różnią dla kwarcu 4 i 16MHz. Wybrana została wysoka częstotliwość dla rezonatora zewnętrznego.


    Oprócz tego powyżej 8MHz trzeba zaprogramować CKOPT.
  • #11 9116366
    asembler
    Poziom 32  
    Po co ten temat skoro autoer najwyraźniej nie chce współpracować, albo się boi że mu fuse skopiujemy za darmo.
  • #12 9119004
    Roman Szemik
    Poziom 14  
    Witam.

    Zamieniłem w moim krótkim programie config na sugerowane DDRA=255 itd. i programik funkcjonował poprawnie. Natomiast kiedy powyższy ruch wykonałem na programie głównym to miałem między innymi taki komunikat: EQU not found.

    Jeśli opóźnienie waitms 100 zamieniłem na waitms 10 to także program nie działał.
    Na razie nie mogę wymienić kontrolera na nowy bo to trochę dużo pracy gdyby go chcieć wylutować i wlutować inny.

    Pozdrawiam.

    Ps. W załączniku widok fuse bitów.
  • #13 9119133
    Konto nie istnieje
    Poziom 1  
  • #14 9119168
    asembler
    Poziom 32  
    atom1477 napisał:
    Fusebit M103 wyłączony?

    Bez chec toż to by nie działało na 4 Mhz także - ale kto wie.
  • #15 9119367
    Roman Szemik
    Poziom 14  
    ATmega 128 16 AU.
  • #16 9119411
    asembler
    Poziom 32  
    Sprawdziłeś na wewnetrzym oscylatorze ustawionym na możliwy max?
  • #17 9119436
    Roman Szemik
    Poziom 14  
    Wewnętrzy oscylator ustawiony na max? Chodzi jeśli dobrze rozumuję zmianę fusów na generator wewnętrzny? A jeśłi tak to czy kwarc i kondensatorki nie będą przeszkadzały?
  • #18 9119471
    asembler
    Poziom 32  
    Chodzi o zmiane fuse, kwarz nie bedzie przeszkadzal, dodatkowo KALIBRACJA rejestr OSCCAL=$ff
  • #19 9119612
    Roman Szemik
    Poziom 14  
    Przełączyłem na wewnętrzny oscylator RC 8MHz i reakcja jak powyżej. Konfiguracja portów bez waitms 100 powoduje brak jakiejkolwiek reakcji. Gdy wpiszę waitms 100 program działa poprawnie i oczywiście wolniej bo to 8MHz.
  • #20 9119630
    asembler
    Poziom 32  
    Przy osccal=255 powinno byc cos koło 14Mhz
    Podeślij bin to zobacze w ASM co sie tam porobiło
  • #21 9120211
    Roman Szemik
    Poziom 14  
    Witam.

    Po nie przespanej nocy stwierdzam iż półprzewodniki rządzą się swoimi prawami albo ja nie potrafię zrozumieć ich języka.

    Serdecznie wszystkim dziękuje za zaangażowanie.

    Tak programowałem, kasowałem i jeszcze raz programowałem aż natrafiłem na inny trop. Nie wiem dlaczego ale po godzinie męczenia się program o dziwo zaczął pracować poprawnie bez waitms 100. Sprawdziłem jeszcze 20 razy i postanowiłem pójść dalej. Dołączyłem do programu konfigurację wyświetlacza graficznego 240x128 i znowu elektronika położyła mnie na kolana... Bez waitms 100 na konfiguracji - programik nie funkcjonował poprawnie. Podparłszy oczy zapałkami zauważyłem, że jeśli skasuję linijkę o konfiguracji wyświetlacza graficznego wraz z CLS I CURSOR OFF to programik hula jak osiemnastka na parkiecie. Reasumując - jestem rozdarty wewnętrznie i stoję przed intelektualnym znakiem STOP.

    Z góry dziękuję za pomoc. Jako że są ferie to dostęp do komputera będę miał dopiero w piątek i ewentualnie wtedy będę miał okazję podziękować za wsparcie i pomysły.

    Pozdrawiam.

    PS. W załączniku plik binarny programu.

    Config Graphlcd = 240 * 128 , Dataport = Portc , Controlport = Porta , Ce = 6 , Cd = 3 , Wr = 4 , Rd = 5 , Reset = 7 , Fs = 0 , Mode = 8
    Cls
    Cursor Off
    
    Config Porta = &B11111111                                   'port wyświetlacza
    Config Portb = &B11110000                                   'port klawiatury
    Config Portc = &B11111111                                   'port wyświetlacza
    Config Portd = &B00000000
    Config Porte = &B11111111
    Config Portf = &B00001111
    Config Portg = &B11111100
    
    Porta = 255
    Portb = 255
    Portc = 255
    Portd = 255
    Porte = 255
    Portf = 255
    Portg = 255
    
    Do
    Portf.3 = 0
    Portg.2 = 0
    Wait 1
    Portf.3 = 1
    Portg.2 = 1
    Wait 1
    Loop
  • #22 9120717
    SylwekK
    Poziom 32  
    Roman Szemik napisał:
    ...jeśli skasuję linijkę o konfiguracji wyświetlacza graficznego wraz z CLS I CURSOR OFF to programik hula jak osiemnastka na parkiecie...


    Faktycznie w takiej sytuacji może być jakiś "czasowy" zgrzyt, bo komenda CLS jest dość czasochłonna i być może procek nie dostaje od wyświetlacza jakiejś odpowiedzi zwrotnej. Osobiście zawsze umieszczam tą komendę już po wszelkich definicjach tuż przed pętlą główną. Wstaw ją za konfigami, powinno hulać :)
  • #23 9123492
    Roman Szemik
    Poziom 14  
    Witam.

    No cóż przestawienie cls i cursor off wraz z konfiguracją wyświetlacza w inne miejsce nic nie dało. Najdziwniejsze jest to iż wszystko poprawnie działa na kwarcu 4MHz.

    Pozdrawiam.
  • #24 9124402
    asembler
    Poziom 32  
    Oczywiście po zmianie kwarzu zadeklarowałes bascomowi ze go zmieniłes?
    Bo ja juz wiecej niź głupi jestem.
    W asemblerze nie do pomyslenia takie zaśmiecanie elektrody.
    Tam albo dziala albo trzeba wymieić programiste.
  • #25 9125447
    piotrva
    VIP Zasłużony dla elektroda
    w tej sytuacji polecam wymianę środowiska programistycznego. Bo takto kolega właśnie zaczyna poznawać uroki bascom'a - czyli wszechobecne błędy i niedociągnięcia, których przyczyna tkwi we wnętrzu kompilatora :D
  • #26 9131391
    Roman Szemik
    Poziom 14  
    Witam.

    Dzięki za pomoc. W nawiązaniu do Bascoma to takie problemy zdażyły mi się pierwszy raz. Na tą chwilę raczej nie będę uczył się nowego języka tylko póki co postaram się w dalszym ciągu szukać przyczyny tak dziwnego zachowania portów. Jeśli nikt nie będzie w stanie mi pomóc to docelowo po znalezieniu przyczyny zamieszczę stosowną notę na forum.



    Pozdrawiam.

    PS. Czy kolega asembler miał chwilę czasu aby swoim doświadczonym okiem rzucić na plik binarny który zgodnie z prośbą zamieściłem? Oczywiście zmiana kwarcu została zadeklarowana w kopilatorze.
  • #27 9151612
    Roman Szemik
    Poziom 14  
    I słowo stało się rzeczywistością i zamieszczam rozwiązanie mojego problemu dla potomnych którzy mogą się zetknąć z podobnym problemem współpracy atmega128 z kwarcem 16MHz.
    Przyczyną tak dziwnego zachowania był źle ustawiony fusebit dla tak dużych częstotliwości. Fusebit HIGH H należało z OSC1 ustawionego fabrycznie przestawić na OSC0 (bezpieczniki dla Bascom AVR).

    Pozdrawiam - wytrwałości dla Wszystkich.
  • #28 9151743
    asembler
    Poziom 32  
    To jak wytłumaczyć ,że sugestia aby przełączyc na wewnętrzny oscylator spotkała sie z taką samą reakcją ze strony procesora?
  • #29 9151934
    Roman Szemik
    Poziom 14  
    Nie wiem. Na wewnętrznym oscylatorze też to nie działało, a może dlatego że była to częstotliwość 8MHz której procesor nie mógł do końca przetrawić w porównaniu do 4MHZ?

    Pozdrawiam.
  • #30 9152018
    asembler
    Poziom 32  
    Niemozliwe żeby była 8Mhz Po odczytaniu CALIBRATE dla 8 Mhz OSCCAL zawiera sie w granicach 130-144 . A przy 255 to koło 14Mhz , więc coś dla mnie jest niejasne, że tu nagle przy kwarzu 16Mhz działa a nw wewn przy 14 nie?
REKLAMA