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.

ATmega + BTM 112 -> brak komunikacji po USART

zbuffer 26 Maj 2009 19:26 3243 4
  • #1 26 Maj 2009 19:26
    zbuffer
    Poziom 10  

    Witam!
    Problem jak w temacie. Zakupiłem moduł bluetooth BTM 112, zrobiłem pod niego płytką z wszelkimi potrzebnymi elementami (wg. schematu z datasheeta) i wyprowadzeniem sygnałów na goldpiny.
    Po podaniu zasilania moduł się włącza i przechodzi w stan "mrugającej diody połączenia".
    Od strony PC mogę się bez problemu połączyć i następnie wysyłać do modułu dane przez Hyper Terminal. Jak zewrę linie RX i TX modułu to znaki bez problemu wracają do Terminala. Nie ma więc błędów w lutowaniu itp.
    Linie CTS oraz RTS są zwarte a reset podłączony do VCC przez kondensator (wszystko wg. datasheeta).
    Problemem jest natomiast kompletny brak komunikacji między mikrokontrolerem a modułem BT.
    Przeczytałem już wszystkie wątki i nikt nie miał problemu za samym połączeniem bo coś tam zawsze mu moduł odsyłał a u mnie brak jakiejkolwiek odpowiedzi.
    Próbowałem już na kilka sposobów pisać program, ustawiać różne prędkości transmisji i nic. Używałem głównie wewnętrznego oscylatora 8Mhz...może to stanowi problem? Teraz włożyłem jednak kwarc 8 Mhz i dalej nic....
    Jak zewrę linie rx i tx uC to znaki wracają i wszystko jest ok!
    Poniżej program na uC, którego używam. Normalnie brak reakcji. Natomiast jak komputer się połączy z modułem to zapala się dioda sygnalizująca że coś odebrał uC. Ale nie ma żadnych znaków zapisanych na eepromie?! Wygląda to jakby były jakieś makabryczne błędy transmisji czy coś? Dodam że uC jest na płytce stykowej, moduł oczywiście na normalnym pcb.

    Pomóżcie!!! ;) bo ja już nie wiem co może być grane:/

    Pozdrawiam

    Code:

    #define F_CPU 8000000
    #define BAUD 9600

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include <avr/eeprom.h>

    uint8_t    eepromInd = 0;

    void usartInit()
    {
        #include <util/setbaud.h>
        UBRRH = UBRRH_VALUE;
        UBRRL = UBRRL_VALUE;

        UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
       
        // Set frame format to 8 data bits, no parity, 1 stop bit
        UCSRC = (1<<UCSZ1)|(1<<UCSZ0); 
        sei();
    }

    void usartSendByte(unsigned char inByte)
    {
        // Wait if a byte is being transmitted
        while((UCSRA&(1<<UDRE)) == 0);

        // Transmit data
        UDR = inByte;
    }

    void usartSendString(unsigned char * inString)
    {
        while (*inString != 0x00)
        {
            usartSendByte(*inString++);
       _delay_ms(60);
        }
    }

    unsigned char usartReceiveByte()
    {
        // Wait until a byte has been received
        while((UCSRA&(1<<RXC)) == 0);

        // Return received data
        return UDR;
    }

    ISR(SIG_UART_RECV)
    {
        unsigned char c = UDR;
        PORTB &= ~(1 << PB0);   
        _EEPUT(0x10+eepromInd, c);   
        eepromInd++;
    }


    int main()
    {
        _delay_ms(3000);

        DDRB = 0b11111111;
        PORTB |= (1 << PB0);

        usartInit();
        usartSendString("AT\r");
       
        while(1)
        {
        }

        return 0;
    }

    0 4
  • #2 26 Maj 2009 23:54
    rdt
    Poziom 24  

    ja to moze i naiwny jestem ale podstawowe pytanie (zakładam ze prędkość i ilość bitów oraz parzystość się zgadzają)
    - a więc a jakbyś zamienił RX z TX - no i jeszcze oczywiście wspólna masa

    0
  • #3 27 Maj 2009 06:59
    zbuffer
    Poziom 10  

    Wspólna masa? Nie wiem jak mogłaby nie być wspólna?
    Mam połączone standardowo rx -> tx , tx -> rx. Zresztą próbowałem odwrotnie i też nic.

    0
  • #4 27 Maj 2009 09:46
    kamyczek
    Poziom 34  

    Masa to masa i ma być wspólna !!! To tak jak byś chciał mierzyć miernikiem napięcie przykładając tylko jedną końcówkę miernika gdy ta druga jest w powietrzu .

    0
  • #5 27 Maj 2009 10:47
    zbuffer
    Poziom 10  

    Znalazłem błąd w programie czytając datasheeta jeszcze raz!
    Wszystko działa!
    Chodziło o to że brakowało (1 << URSEL) przy wpisywaniu wartości do rejestru UCSRC a ten rejestr dzieli adres z innym i trzeba tą jedynkę wysłać!
    Dzięki za wszelkie próby pomocy!
    Pozdrawiam

    0
  Szukaj w 5mln produktów