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

[ATMEGA32] [ATMEGA32][C] - Zakłócenia KS0108 po zmianie portu z PORTA na PORTB

grzegorz-00 07 Sie 2012 13:16 2400 13
  • #1 11183894
    grzegorz-00
    Poziom 13  
    Witam

    Od kilku tygodni robię komputer pokładowy do samochodu. Do prezentacji danych użyłem wyświetlacza graficznego KS0108. Szyna danych tego wyświetlacza była podpięta na PORTA a linie sterujące na PORTC. Wszystko było piękne, jedyny kondensator filtrujący, który był, to elektrolit 330uF. Po próbnym zamontowaniu w samochodzie również wszystko bez zakłóceń działało. Jednak był mi potrzebny przetwornik ADC, a cały PORA był już zajęty, więc przelutowałem szynę danych wyświetlacza na PORTB. Wtedy zaczęły się schody. Po kilku sekundach od włączenia uC na wyświetlaczu pojawiają się krzaki, zmienne przyjmują dziwne wartości i po chwili wszystko się zawiesza. Wyjątkiem jest, jak podepnę się przez rs232 do komputera, wtedy uC działa dobrze. Dolutowałem kondensator 33n, zmniejszyłem taktowanie z kwarca 16mHz na wewnętrzny 8 mHz i dalej są krzaki. Jak zmienię port danych na poprzedni to wszystko wraca do normy. Układ zasilam przez stabilizator 7805 albo bezpośrednio z programatora USBasp, objawy się jednak nie zmieniają. Za wszelką pomoc z góry serdecznie dziękuję.

    Pozdrawiam
  • #3 11183944
    grzegorz-00
    Poziom 13  
    Kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Schematu za bardzo nie mam, wszystko na płytce prototypowej, elektrolit 330uF, kondensator 33nF, wszystkie piny zasilania uC są podpięte.

    Fusy to:
    low: 4E
    high: C1

    czyli zewnętrzny kwarc wysokiej częstotliwości, CKOPT włączony, JTAG wyłączony.
  • #4 11184203
    LordBlick
    VIP Zasłużony dla elektroda
    grzegorz-00 napisał:
    wszystko na płytce prototypowej
    To zdjęcie może być.
    A i jeszcze jedno - na pewno masz warnigi przy kompilacji, o czym nie piszesz, a należy się ich również pozbyć.
  • Pomocny post
    #5 11184384
    mirekk36
    Poziom 42  
    Przede wszystkim widać , że troszkę na oślep walczysz z prawidłową filtracją zasilania więc może to ci pomoże?

    http://mirekk36.blogspot.com/2012/04/mikrokontroler-prawidowe-zasilanie.html

    poczytaj, popatrz i zobacz co z czym jest związane i za co odpowiada .... używasz niewłaściwych kondensatorów ... do filtracji. To jedno...

    a DRUGIE .... ja bym na twoim miejscu podszedł nieco inaczej - czyli testował mniejszymi kawałkami - ponieważ twoja aplikacja może dostarczać sporo błędów (nie mówię że tak jest ale łatwo się o tym przekonać) ...

    weź sobie na początek zrób super prosty programik w którym będziesz miał tylko inicjalizację GLCD i jakiś latający licznik na LCD - to wszystko. Inne rzeczy wttnij z testowego projektu...

    i odpal to - i zobacz czy działa.... Jeśli tak - to już masz część odpowiedzi - trza szukać w aplikacji - jeśli nadal nie działa to trza szukać babola w sprzęcie

    Niestety niepokojące jest to co piszesz, że jak np podłączysz RS232 czy USBASP to działa - oznaczałoby to prawie na pewno że masz jakieś poważne problemy np z połączeniami zasilania - masą itp
  • #6 11184514
    grzegorz-00
    Poziom 13  
    Dzięki za odpowiedzi.

    Warningi wszystkie usunięte.

    Zbadałem tego rs232 dokładnie i chyba zbiera jakieś zakłócenia przez przewód 10cm podpięty do RXD, bo jak podłączam go do max232 albo zwieram do masy, to układ działa stabilnie, chociaż oscyloskop nic nie pokazał. Jak ustawie ten pin jako wyjście i dam 0, to uC zawiesza się zawsze po 18 sekundach, jak dam 1, to wydaje się działać stabilnie.
  • Pomocny post
    #7 11184539
    LordBlick
    VIP Zasłużony dla elektroda
    grzegorz-00 napisał:
    Warningi wszystkie usunięte.
    To pokaż aktualny kod, bo używanie "SIGNAL (SIG_UART_RECV)" nie jest pozbawione ostrzeżeń kompilatora. http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
    Druga sprawa - Linię RxD podciągnij do Vcc - można włączyć wewnętrzne podciągnięcie.
  • #8 11184562
    mirekk36
    Poziom 42  
    LordBlick napisał:
    grzegorz-00 napisał:
    Warningi wszystkie usunięte.
    To pokaż aktualny kod, bo używanie "SIGNAL (SIG_UART_RECV)" nie jest pozbawione ostrzeżeń kompilatora. http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

    Dla niektórych procków jak np ATmega32 jest pozbawione ostrzeżeń ze strony kompilatora, co wcale nie oznacza że warto korzystać z makr SIGNAL(). Zdecydowanie warto przejść na makra ISR()


    LordBlick napisał:
    Druga sprawa - Linię RxD podciągnij do Vcc - można włączyć wewnętrzne podciągnięcie.


    To zupełnie zbędny zabieg jeśli korzystasz z MAX232 albo jakiejś przejściówki USB/RS232 pracującej w standardzie TTL. No chyba że sam robisz jakąś konwersję na tranzystorach.
  • #9 11184568
    grzegorz-00
    Poziom 13  
    Akurat do tego kompilator się nie przyczepił. Poprawiłem kilka szczegółów związanych ze zmianą typów zmiennych i warninga nie ma żadnego (poza jedną nieużywaną zmienną)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Teraz już się domyślam, że przyczyną był kawałek przewodu robiący za antenę, jednak dziwi mnie, że przed zmianą portu wyświetlacza wszystko było ok, nawet w samochodzie, który wali zakłóceniami. Jedyne wyjaśnienie, to chyba takie, że PORA jest zasilany z AVCC i może rdzeń był mniej narażony... .

    Co do przerwań, to korzystałem ze stronki http://avr.elektroda.eu/content/avr-gcc-opis-funkcji-biblioteki-avr-libc ale wychodzi, że jest przestarzała. Co do uart'a to jak pin RXD pracuje jako odbiornik, to chyba nie da się ustawić wewnętrznego podciągnięcia. Poprzeglądałem kilka schematów, i zazwyczaj dają 10k do masy.
  • Pomocny post
    #10 11184664
    LordBlick
    VIP Zasłużony dla elektroda
    grzegorz-00 napisał:
    Co do uart'a to jak pin RXD pracuje jako odbiornik, to chyba nie da się ustawić wewnętrznego podciągnięcia.
    Nie bedę cytować, ale odsyłam do noty - Alternate functions od PORTD. Pin jest wymuszany jako wejście, ale podciągniecie można uaktywnić ustawiając PD0 na 1.
    grzegorz-00 napisał:
    Poprzeglądałem kilka schematów, i zazwyczaj dają 10k do masy.
    Stan nie używany linii RS232C to wysoki (Vcc), więc tamte schematy można sobie darować.
    mirekk36 napisał:
    To zupełnie zbędny zabieg jeśli korzystasz z MAX232 albo jakiejś przejściówki USB/RS232 pracującej w standardzie TTL.
    Jeśli MAX232 będzie odłączany, to jest konieczny zabieg.
  • #11 11184700
    grzegorz-00
    Poziom 13  
    LordBlick napisał:
    grzegorz-00 napisał:
    Co do uart'a to jak pin RXD pracuje jako odbiornik, to chyba nie da się ustawić wewnętrznego podciągnięcia.
    Nie bedę cytować, ale odsyłam do noty - Alternate functions od PORTD. Pin jest wymuszaney jako wejście, ale podciągniecie można uaktywnić ustawiając PD0 na


    Dobrze wiedzieć. Dzięki za wszystkie informacje.
    Pozdrawiam
  • #12 11187178
    bolek
    Poziom 35  
    LordBlick napisał:
    grzegorz-00 napisał:
    Poprzeglądałem kilka schematów, i zazwyczaj dają 10k do masy.
    Stan nie używany linii RS232C to wysoki (Vcc), więc tamte schematy można sobie darować.


    Akurat od strony RS232 poziomy logiczne są całkiem inne, więc proponuje się trzymać standardu bo zaraz ktoś przyjdzie i strzeli że "1" ma poziom Vcc
  • #13 11187251
    LordBlick
    VIP Zasłużony dla elektroda
    bolek napisał:
    Akurat od strony RS232 poziomy logiczne są całkiem inne, więc proponuje się trzymać standardu bo zaraz ktoś przyjdzie i strzeli że "1" ma poziom Vcc
    Jakby kolega nie zauważył, to pisałem o RS232C... Zdaję sobie sprawę, ze normalnie w RS232 jedynka to stan ujemnego napięcia, ale przy I/O µC mamy do czynienia z poziomami logicznymi RS232C, czyli zbliżonymi do TTL/CMOS.
  • #14 11187421
    bolek
    Poziom 35  
    Racja było coś takiego, odczepiam się. Nie mniej jednak dla googli z C czy bez to na jedno wychodzi. Ba, wpisując "RS232C poziomy napięć" w drugim linku jest przelotka wedle której w poziomy napięć są -12...+12V i logiczne 1 oznacza +12V.
REKLAMA