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

Atmega i RS232 - brak komunikacji

08 Wrz 2006 12:18 2378 11
  • Poziom 13  
    Witam, wlaśnie usiłuje wysłać jakiś znak z procka Atmega8 na PCta. Program napisałem według artukułu kurs C w "elektronice dla wszystkich".
    A prosty tekst chcę odebrać poprzez HyperTerminal. Niestety komunikacja sie nie udaje (w oknie terminala nic sie nie pojawia). Ponieważ myśle, że program i połączenia mam dobre chciałbym wypróbować jakiś inny terminal. Czy moglibyście polecić jakieś inne terminale? Ewentualnie inne rady :)
  • Poziom 19  
    Rozumiem, że po drodze MAX232 jest?
    Sprawdź konfigurację portu COM w terminalu na PC i porównaj z tą którą ustawiłeś w AVRku, kolejna sprawa - zamieść listing - się zobaczy :)
  • Poziom 13  
    Tak jest max232. program rozbity jest na pare plików umieszczam je poniżej:
    plik główny:
    #include <avr\io.h>
    #include <stdio.h>

    #include "rs.h"
    #include "harddef.h"

    int main(void)
    {
    ///////////////////////////////////////////////
    // Inicjacja portu szeregowego
    RS_SET_BAUD(DEF_BAUD);
    UCSR0C = 1<<URSEL0 | 1<<UCSZ01 | 1<<UCSZ00;
    UCSR0B = 1<<RXEN0 | 1<<TXEN0;
    UCSR0A = 0;
    // Koniec inicjacji
    ///////////////////////////////////////////////

    // Inicjacja funkcji dla domyślnych strumieni we/wy
    fdevopen(rs_put, rs_get, 0);

    puts("Hello world!\r");
    }
    --------------------------------------------------------------------------
    plik rs.h:
    #ifndef RS_H_INCLUDED
    #define RS_H_INCLUDED

    #define RS_MAKE_UBRR(baud) (F_CPU/(baud*16l)-1)
    #define RS_SET_BAUD(baud) \
    {UBRR0H = (uint8_t)(RS_MAKE_UBRR(baud)>>8); \
    UBRR0L = (uint8_t)RS_MAKE_UBRR(baud); }

    int rs_put(char znak);
    int rs_get(void);

    #endif // RS_H_INCLUDED
    -----------------------------------------------------------------------------
    plik rs.c:
    #include <avr\io.h>
    #include "rs.h"

    int rs_put(char znak)
    {
    // Oczekiwanie aż bufor nadajnika jest pusty
    while(!(1<<UDRE0 & UCSR0A)) {}
    UDR0 = znak;
    return 0;
    }

    int rs_get(void)
    {
    char znak;
    // Oczekiwanie na pojawienie się danej
    while(!(1<<RXC0 & UCSR0A)) {}
    znak = UDR0;
    return znak;
    }
    ------------------------------------------------------------------------------
    plik harddef.h:
    #ifndef HARDDEF_H_INCLUDED
    #define HARDDEF_H_INCLUDED

    #define DEF_BAUD 4800

    #endif // HARDDEF_H_INCLUDED
  • Poziom 12  
    No właśnie, listing chce zobaczyć, bo chce luknąć na komunikacje z PC.
    Ja mam gorszy problem bo na mojego posta jakoś nikt nie chce luknąć, a niewierze że nikt sie na tym nie zna.
  • Poziom 13  
    tam zamiast bużki cool ma być 8 ) no i jeszcze jedna sprawa w nazwie tych rejestrów nie ma być zera, czyli np zamiast UDRE0 na być UDRE
  • Pomocny post
    Poziom 20  
    Hyper terminal rzeczywiście jest kiepski(nieprzyjemne ustawienia, kilka pytań przy zamknięciu) ale działa. Zewrzyj piny 2 i 3 w gnieździe com i sprawdź cy masz echo na terminalu jeśli tak to sprawdź to samo za maxem. Jezeli jest ok to znaczy ze wina leży po stronie qC. Pozdrawiam.
  • Poziom 12  
    Rozłącz się. Wejdź do ustawień portu w Hyper Terminalu i daj kontrolę transmisji na Xon/Xoff. Powinno pomóc na kablu RS232 3-przewodowym. Zapisz połączanie i podłącz się ponownie.

    //EDIT:
    Jest jeszcze możliwość, że zamieniłeś miejscami RxD/TxD we wtyczce.
  • Poziom 12  
    Po co się mordować z jakimś Hyper Terminalem. Dołączam plik z prostym i bardzo wygodnym terminalem. W sam raz do zabawy z prockami.
  • Poziom 13  
    witam zrobiłem jak poradziliście najpierw zwarłem na wtyczce piny 2 i 3 i echo jest zarówno w hyperterminalu jak i w terminalu od JacOwcz. nastepnie odłaczyłem procka i zwarłem piny TXD(T1in na maxie) i RXD(R1out) i echa juz nie było w żadnym z terminali, wiec chyba coś nie tak z moim maxem tylko co? postaram sie zamieścić schemat

    Dodano po 1 [godziny] 12 [minuty]:

    zamieszczam schemat mojego urządzenia:
  • Pomocny post
    Poziom 12  
    Dawno się już nic nie montowałem, ale na moich schematach są odwrotnie połączone sygnały, to znaczy 14 z Max łączy się z 2 na DB9, a 13 z MAX łączy się z 3 na DB9. Czyli odwotnie niz jest u Ciebie.
    Kolejna sprawa to BHP - włącz w szereg pomiędzy port i MAXA jakieś oporniki ograniczające (np 330-470). Jak coś pójdzie nie tak z Twoim układem to przynajmniej portów w PC sobie nie upalisz.
  • Poziom 16  
    Ja też przez kilka godzin pociłem się nad transmisją z ATMEGA32 i okazało się, że mam źle ustawione FuseBity i zamiast taktowania 16MHz z kwarcu układ chodził na 1 MHz generatorze.
    Transmisja działała poprawnie, kiedy w terminalu ustawiłem 16 razy mniejszą prędkość niż na procesorze.

    Lekarstwo było proste - poprawnie ustawić Fuse Bity CKSEL.
  • Poziom 13  
    Witam, rzeczywiście jak zauważył JacOwcz miałem zamienione sygnały 2 i 3 na DB9. Teraz działa!
    W sumie wcześniej miałem tak połączone te sygnały i nie działało przez to je zamieniłem, teraz zamieniłem z powrotem i działa nie wiem jak to sie stało, ale najważniejsze że hula :]
    Z fusebitami też już kombinowałem - mam ustawione CKSEL3..0 1111 co oznacza prace z zewnętrznym kwarcem :)

    Dodano po 8 [minuty]:

    poprawny schemat: