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

UART ADuc7026: Błąd otwarcia COM przy 9600/2bit stop/no parity, krzaki przy 4800

tomasz_wilko 30 Gru 2007 06:52 1925 7
REKLAMA
  • #1 4639009
    tomasz_wilko
    Poziom 14  
    Posty: 144
    Pomógł: 14
    Ocena: 4
    Witam
    Mam problem z uartem w układzie jak wyżej.
    Gdy nastawiam rządaną transmisję np: 9600/2bit stop/no parity
    hyper terminal wrzuca komunikat:
    Nie można otworzyć COM sprawdz ustawienia portu.
    Dokumentacja podaje 0% błędu dla mojej częstotliwości
    a zaimplementowany UART jest w standardzie 16450.
    PLL jest ustawiona na 41Mhz
    Gdy zmienie częstotliwość na mniejszą(układ zaprogramowany na 9600 , w hyper terminal nastawiam 4800) -komunikat ten nie pojawia się oraz okazuje się że coś tam jednak dociera -otrzymuje krzaki.
    Próbowałem z mniejsza prędkością - to samo.
    Komunikacja po max3232, spróbowałem dla pewności po max232 (wejścia akceptują ) - to samo.
    Port nie jest wykożystywany przez żaden inny program- a hyperterminal działa prawidłowo, z innymi procesorami .
    Jeżeli ktoś natkną się na to proszę o pomoc.
    dzieki
  • REKLAMA
  • #2 4642966
    aster11
    Poziom 19  
    Posty: 211
    Pomógł: 36
    Ocena: 1
    Cytat:
    Gdy nastawiam rządaną transmisję np: 9600/2bit stop/no parity
    hyper terminal wrzuca komunikat:
    Nie można otworzyć COM sprawdz ustawienia portu.

    To co zacytowane wyżej jest związane tylko z HT na PC, nie ma nic wspólnego z mikrokontrolerem.

    Proponuje spróbować jeszcze na innym terminalu, ja np. stosuję DockLight.

    Jeżeli nic nie wskórasz, pokaż kod, który związany jest z transmisją. Obsługiwałem transmisję pod ADuC7128, może będę mógł coś pomóc.
  • REKLAMA
  • #3 4643071
    tomasz_wilko
    Poziom 14  
    Posty: 144
    Pomógł: 14
    Ocena: 4
    Witam ,podaje kod:

    /***********************************************************************/
    /* */
    /* SERIAL.C: Low Level Serial Routines */
    /* */
    /***********************************************************************/
    #include <aduc7024.H> /* ADuC7024 definitions */
    #define CR 0x0D

    int putchar(int ch) { /* Write character to Serial Port */

    if (ch == '\n') {
    while(!(0x020==(COMSTA0 & 0x020)))
    {}
    COMTX = CR; /* output CR */
    }
    while(!(0x020==(COMSTA0 & 0x020)))
    {}

    return (COMTX = ch);
    }


    int getchar (void) { /* Read character from Serial Port */

    while(!(0x01==(COMSTA0 & 0x01)))
    {}
    return (COMRX);
    }

    int write (int file, char * ptr, int len) {
    int i;

    for (i = 0; i < len; i++) putchar (*ptr++);
    return len;
    }
    /*********************************************************************

    Author : ADI - Apps www.analog.com/MicroConverter

    Date : Sept. 2005

    File : UART1.c

    Hardware : Applicable to ADuC702x rev H or I silicon
    Currently targetting ADuC7026.

    Description : This code demonstrates basic UART functionality.
    The baudrate is calculated with the following formula:
    ***********************************************************************/

    #include <ADuC7026.h>

    extern int write (int file, char * ptr, int len); // Functions used to
    extern int getchar (void); // to output data
    extern int putchar(int); // Write character to Serial Port

    int main (void) {
    unsigned char jchar = 0x30;

    char output1[13] = "Hello World\n";

    // Setup tx & rx pins on P1.0 and P1.1
    GP1CON = 0x011;

    // Start setting up UART at 9600bps
    COMCON0 = 0x080; // Setting DLAB
    COMDIV0 = 0x088; // Setting DIV0 and DIV1 to DL calculated
    COMDIV1 = 0x000;
    COMCON0 = 0x007; // Clearing DLAB

    GP4DAT = 0x04000000; // P4.2 configured as an output. LED is turned on

    while(1)
    {

    GP4DAT ^= 0x00040000; // Complement P4.2
    write(0,output1,13); // Output Data
    jchar = getchar(); // RX Data, Single Byte
    write(0,&jchar,1); // Output Rxed Data
    }
    }

    Przewertowałem datasheet - wszytsko sie zgadza,
    z datasheet baud 9600, 0%error/ 8bitow/1.5bitu stopu/bez bitu parzystosci
    COMCON0 = 0x080; // Setting DLAB
    COMDIV0 = 0x088; // Setting DIV0 and DIV1 to DL calculated
    COMDIV1 = 0x000;
    COMCON0 = 0x007; // Clearing DLAB

    Kompilowane pod KEIL'em , wgrywam poprzez UART (ARMWSD)następnie wyłączam software programatora i uruchamiam Hyperterminal.
    Com dział ,gdyz po tym samym porcie komunikuje dla sprawdzenia z innym procesorem (LPC2xxx). Najdziwniejsze jest to , że coś dociera do COM a tylko na moje właściwe parametry konfiguracyjne wyskakuje błąd:
    Nie można otworzyć COM sprawdz ustawienia portu.
    Próbowałem z nastawieniem innego baud rate

    19200/8bit/2b.stopu/bez bitu parzystosci
    COMDIV0 = 0x044;
    COMDIV1 = 0x000;
    COMCON0 = 0x003;
    -rezultat ten sam

    Nie powinno mieć znaczenia to że programuje Aduc po UART, oraz komunikuje sie po nim.
    Jakieś inne zabiegi które można przeprowadzić?
    dzięki z góry , pozd.
  • Pomocny post
    #4 4643122
    aster11
    Poziom 19  
    Posty: 211
    Pomógł: 36
    Ocena: 1
    Cytat:
    PLL jest ustawiona na 41Mhz

    ... a niby gdzie? Jeśli program kopiowałeś z gotowego przykładu, to może o czymś zapomniałeś.

    Trzeba by dodać do konfiguracji coś w rodzaju:
    POWKEY1 = 0x01;
    POWCON &= ~0x07;
    POWKEY2 = 0xf4;

    -dokładnie nie gwarantuję czy tak, bo kodów nie mam akurat przy sobie, patrzę tylko do datasheet.

    Może to pomoże, ale z ustawieniami terminala na PC to chyba oddzielny problem.
  • #5 4643247
    tomasz_wilko
    Poziom 14  
    Posty: 144
    Pomógł: 14
    Ocena: 4
    pll i reszta ustawień jest w pliku starttowym ADuC702x.s

    Dodano po 26 [minuty]:

    Dzięki aster11 , okazało się ,że Power Control sys. był źle nastawiony
    Zamiast 41Mhz miałem 20,89MHz
    W Configuration Wizard (zakładka ADuC702x.s w Keil'u) POWCON
    miałem 1, co oznaczało 001 czyli 20,89MHz a prawidłowo powinno być ustawione 0 czyli 000 -41MHz .
    Ta 1 mnie zwiodła ,gdyż przyjąłem 41MHz/1 = 41MHz
    dzięki jeszcze raz za pomoc
  • REKLAMA
  • Pomocny post
    #6 4643522
    aster11
    Poziom 19  
    Posty: 211
    Pomógł: 36
    Ocena: 1
    Cytat:
    W Configuration Wizard (zakładka ADuC702x.s w Keil'u) POWCON
    miałem 1 ...

    Nie mam tak dobrze :) Używam WinArm i akurat ustawienia POWCON zapisywałem sobie jawnie we właściwym kodzie programu. Nie wiedziałem, że wybierasz to ustawienie w konfiguracji.
  • REKLAMA
  • #7 4645676
    tomasz_wilko
    Poziom 14  
    Posty: 144
    Pomógł: 14
    Ocena: 4
    Wiesz, to jest jedna z dodatkowych opcji jakie ma Keil.
    W pliku *.s są jest normalny kod ale dodatkowo jest dopisany kod -cos jak html który pozwala ci wybrać dane opcje poprzez tryb okienkowy .
    Np.

    /*
    // <e> PLL Setup
    // <o1.0..2> CD: PLL Multiplier Selection
    // <0-7>
    // CD Value
    // <o1.3> FINT: Fast Interrupt
    // <0-1>
    // Switches to CD0 for FIQ
    // </e>
    */

    Potem w plu *.s niże jest kod gdzie jest wybierana wartość CD <0-7> .
    Mogę w ten sposób jeszcze zmieniać ilość stosu na 6trybów (User/SV/IRG..) oraz włączać External memory interface.
    Plik konfiguracyjny do LPC/ADuc7/at91 mają właśnie tak skonstruowane pliki *.s że zawierają ten kod-mogę również sam go dodawać.
    Bardzo ciekawa i dogodna funkcja ,możliwość debugowania softworowego, wybór kompilatora (GCC/KEIL/RealView), przyjemność pracy- dlatego używam keila. Poza tym z książki The Insider's Guide To The Philips ARM (HITEX) -Iar i Keil to bardzo ciekawe i bardziej wydajne niż Gcc kompilatory. Dlatego może i warto korzystać z Keila/Iar mimo ograniczeń
    Dzięki jeszcze raz.
    Udanej zabawy na Sylwester
  • #8 4774745
    Tarzan21
    Poziom 13  
    Posty: 42
    Ocena: 1
    ja mam tak i dziala:

    konfig:

    // Setup tx & rx pins on P1.0 and P1.1
    GP1CON = 0x011;
    // Start setting up UART at 9600bps
    COMCON0 = 0x080; // Setting DLAB
    COMDIV0 = 0x088; // Setting DIV0 and DIV1 to DL calculated
    COMDIV1 = 0x000;
    COMCON0 = 0x007; // Clearing DLAB

    .......nadaj, odczytaj port to troszke przerobiony help z arma

    #include <aduc7026.h> /* ADuC7026 definitions */
    #define CR 0x0D
    #define LF 0x0A

    int putchar(int ch) { /* Write character to Serial Port */
    if (ch == '\n') {
    while(!(0x020==(COMSTA0 & 0x020))){}
    COMTX = CR; /* output CR */
    }
    while(!(0x020==(COMSTA0 & 0x020))){}
    return (COMTX = ch);
    }

    int getchar (void) { /* Read character from Serial Port */
    while(!(0x01==(COMSTA0 & 0x01))){}
    return (COMRX);
    }

    int write (char * ptr, int len) {
    int i;
    for (i = 0; i < len; i++) putchar (*ptr++);
    return len;
    }

    procek smiga na 41MHz ,programuje w keilu a program jakiego uzywam to Terminal i wszystko dziala jak ta lala :)

Podsumowanie tematu

✨ Problem dotyczył błędu otwarcia portu COM przy konfiguracji UART 9600 bps, 2 bity stopu, brak parzystości na mikrokontrolerze ADuC7026. Przy tej konfiguracji HyperTerminal na PC zgłaszał niemożność otwarcia portu, natomiast przy niższej prędkości (4800 bps) pojawiały się zakłócenia w odbiorze danych. Komunikacja odbywała się przez układy MAX3232 i MAX232, a port nie był zajęty przez inne aplikacje. Problem wynikał z nieprawidłowej konfiguracji zegara PLL i ustawień Power Control (POWCON), które były błędnie ustawione na 20,89 MHz zamiast 41 MHz. Po poprawnym skonfigurowaniu PLL i POWCON w pliku startowym ADuC702x.s w środowisku Keil, transmisja UART działała poprawnie. Dyskusja zawierała przykładowy kod inicjalizacji UART i obsługi transmisji, wskazówki dotyczące konfiguracji pinów GP1CON, rejestrów COMCON0, COMDIV0, COMDIV1 oraz uwagi o standardzie UART 16450. Zwrócono uwagę na użycie alternatywnych terminali (np. DockLight) oraz na specyfikę plików startowych w Keil umożliwiających konfigurację sprzętową przez interfejs graficzny.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA