Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Bascom][AtMega8]Komunikacja dwóch ATmega8 przez rs232

misiakufal 07 Wrz 2010 19:31 5932 17
  • #1 07 Wrz 2010 19:31
    misiakufal
    Poziom 8  

    Witam!

    Są sobie 2 Atmegi8 w TQFP. Obydwie taktowane zewnętrznym kwarcem 8MHz. Podłączyłem je w następujący sposób:

    [Bascom][AtMega8]Komunikacja dwóch ATmega8 przez rs232

    Dodatkowo podłączyłem niewidoczne na schemacie diody led w celu sygnalizacji.

    W jednym uC jest taki program: (Wysyłanie)

    Code:

    $crystal = 8000000
    $regfile = "m8def.dat"
    $baud=1200

    Config Pind.6 = Output
    Portd.6 = 1


    Do
    Wait 1
    Print "d";
    Loop
    End



    A w drugim coś takiego: (Odbieranie)

    Code:

    $crystal = 8000000
    $regfile = "m8def.dat"
    $baud = 1200
    Config Pind.6 = Output
    Enable Interrupts
    Enable Serial
    On Urxc Port

    Do
    Loop
    End


    Port:
    Toggle Portd.6
    Return


    I nie działa... dane nie są przesyłane tzn nie zmienia się wartość portd.6 w drugim programie. Wcześniej robiłem transmisje RS232-> PC i jakoś nie było problemu, a tutaj takie niewiadomo co się stało i nie działa:/ końcówki RxD i TxD w obu uC sprawne, działają i jako wejscia i jako wyjścia. Myślałem ze to wina wewnetrznych kwarców, więc dałem zewnętrzne i to samo:/ Ktoś ma jakiś pomysł?

    0 17
  • #2 07 Wrz 2010 20:03
    arktik1
    Poziom 27  

    No właśnie, jest możliwa w ogóle taka komunikacja.
    Są na to jakieś przykłady w BASCOMie?

    0
  • #3 07 Wrz 2010 20:04
    gaskoin
    Poziom 38  

    arktik1 napisał:
    No właśnie, jest możliwa w ogóle taka komunikacja.
    Są na to jakieś przykłady w BASCOMie?


    pewnie, że jest możliwa, ale nie pomogę bo nie znam bascoma

    0
  • #4 07 Wrz 2010 20:13
    tmf
    Moderator Mikrokontrolery Projektowanie

    Możliwa jest, z banalnych rzeczy to połączyłeś masy obu urządzeń? Na BASCOMie też się nie znam więc programowo nie pomogę.

    0
  • #5 07 Wrz 2010 20:17
    misiakufal
    Poziom 8  

    oczywiscie, narazie obydwa uC są zasilane z jednego źródła napięcia. Długosć linii to ok 30 cm. Później jeszcze spróbuję podłączyć do tego MAX232 i zobaczyć na kompie co się dzieje na linii.. ale czekam na dalsze pomysły

    0
  • #6 07 Wrz 2010 20:21
    arktik1
    Poziom 27  

    Myślałem że podłączę się z tematem:
    "[BASCOM] Najprostrza komunikacja między dwoma Uc" :D

    0
  • #7 07 Wrz 2010 20:30
    misiakufal
    Poziom 8  

    arktik1:

    Ja staram sie opracować protokół do sieci RS485, dlatego narazie podłączyłem po rs232 i staram sie nawiązać komunikację, potem wpinam miedzy uC MAX1483 i dalej będę tworzył. No ale narazie musze wyczaić w czym jest problem, że ze sobą nie gadają:/

    0
  • #8 07 Wrz 2010 21:34
    janbernat
    Poziom 38  

    Przy kwarcu 8MHz $baud=1200 jest "not possible".
    O czym grzecznie Bascom w zakładce communication informuje.
    No i ten Enable serial.
    Nigdy tego nie używałem- ale w helpie Z.G. jest napisane- blokuje jednocześnie URXC, UDRE i UTXC.

    0
  • #9 07 Wrz 2010 21:35
    misiakufal
    Poziom 8  

    No i problem wygląda na rozwiazany, to co powodowało niedziałanie ww układu to fakt, ze w przerwaniu od UART nie pobierałem znaku z buforu, przez co flaga nie zostawała wyzerowana i kolejne znaki nie były odbierane... Innymi słowy powinno być tak:

    Port:
    A=InKey()
    Toggle portd.6
    Return

    0
  • #10 07 Wrz 2010 23:47
    tmf
    Moderator Mikrokontrolery Projektowanie

    janbernat napisał:
    Przy kwarcu 8MHz $baud=1200 jest "not possible".


    Zauważ, że w tym wypadku to nie ma znaczenia. W obu procesorach powstały błąd będzie taki sam, a więc dla nich transmisja będzie czytelna.

    0
  • #11 08 Wrz 2010 14:39
    misiakufal
    Poziom 8  

    dałem $baud=1200 bo myslałem że jest jakieś dziwne przekłamanie, że kwarce się aż tak różnią że transmisja się chrzani. Docelowo prędkosć ma być większa.

    0
  • #12 09 Wrz 2010 16:24
    PIOTR111
    Poziom 16  

    Witam
    czy kolega może powiedzieć co powoduje wysłanie Print "d"
    w odbiorniku bo jakoś nie kumam tego przykładu
    PIOTR

    0
  • #13 09 Wrz 2010 20:29
    xury
    Poziom 38  

    Odpowiem za autora: Wysłanie czegokolwiek przez Uart na pierwszym uC powoduje przerwanie od Uart na drugim uC. Ot tyle.

    0
  • #14 09 Wrz 2010 20:45
    PIOTR111
    Poziom 16  

    To prawda co piszesz
    ale nadal nie rozumiem co ma wspólnego print"b"
    ze zmianą stanu w odbiorniku pind.6
    A może to zupełnie coś innego PIOTR
    Już mi się rozjaśniło
    każde przerwanie powoduje zmianę stanu portu
    A jak wygląda przesyłanie danych typu byte w takim przykładzie??
    w procesorach 51 wystarczyło napisać
    A=42
    printbin a
    w odbiorniku
    inputbin A i to wszystko - tylko polecenie inputbin wstrzymuje program i stym mam kłopot
    PIOTR

    0
  • #16 10 Wrz 2010 15:09
    PIOTR111
    Poziom 16  

    Można prosić o kawałek kodu odbiornika?:D

    0
  • #17 10 Wrz 2010 22:00
    xury
    Poziom 38  

    tzn. ? Masz tu juz "kawałek" kodu. Na forum jest wiele przykładów odbioru przez USART. Przykłady również masz w katalogu "samples". Możesz też np. przeanalizować mój kod modułu gsm opartego o SE 300.
    Analiza jest lepsza niż gotowiec, ponieważ analizując zrozumiesz bardziej niż dostając gotowca.

    0
  • #18 12 Wrz 2010 16:44
    PIOTR111
    Poziom 16  

    Witam
    Mój kod nie powala na kolana ale działa:D
    kod
    nadajnik
    $crystal=20000000
    $baud=9600
    dim a as byte
    declare sub wyslij

    do
    set p3.7
    if p3.7=0 then
    call wyslij
    loop

    sub wyslij
    a=p1
    printbin a
    waitms 100

    end sub


    odbiornik

    $crystal=20000000
    $baud=9600
    dim a as byte
    do
    inputbin a i w tym miejscu program oczekuje na odebranie danej i nie wykonuje
    innych poleceń w tym cały problem dlatego chcę zastosować Inkey
    p1=a
    loop

    PIOTR

    0