Wątek przeniesiony 2023-08-22 10:49 z C/C++ przez Althorion.

Kod dla Atmega8A + HC-05 (Bluetooth): jak podłączyć terminal?

0
#define F_CPU 1000000UL

#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <string.h>
#include <util/delay.h>

#define MYUBRR 11
#define BAUD 9600

volatile unsigned char odb_flaga = 0;

void USART_Init(unsigned int ubrr)
{
    UBRRH = (unsigned char)(ubrr >> 8);
    UBRRL = (unsigned char)ubrr;

    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0) | (1 << USBS);

    UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
    odb_flaga = 1;
}

ISR(USART_RXC_vect)
{
}

ISR(USART_UDRE_vect)
{
    UCSRB &= ~(1 << UDRIE);
}

void at_komenda_reakcja(unsigned char at_komenda_nr)
{

    switch (at_komenda_nr) {
    case 0:
        PORTC = 0x01;
        _delay_ms(1000);
        PORTC = 0x00;
        _delay_ms(1000);
        break;

    case 1:
        PORTC = 0x01;
        _delay_ms(1000);
        PORTC = 0x00;
        _delay_ms(1000);
        break;
    }
}

unsigned char USART_Receive(void)
{
    /* Wait for data to be received */
    while (!(UCSRA & (1 << RXC)))
        ;
    /* Get and return received data from buffer */
    return UDR;
}

void at_komenda_sprawdz(void)
{

    USART_Receive();
    at_komenda_reakcja(UDR);
}

int main(void)
{
    DDRC = 0x01;
    DDRD = 0x01;

    USART_Init(MYUBRR);

    sei();

    while (1) {

        at_komenda_sprawdz();
    }
}

Kod działa, prawie prawidłowo. Problem jest w tym, że zapala mi diodę tylko jeden raz a nie z opcją wyboru w kółko.

1

Weź kod jakiegoś liba do Arduino: https://github.com/jdunmire/HC05 i wydłub to co potrzebne do swojego projektu (o ile licencja pozwala).

Myślę że niewiele osób tutaj zajmuje się programowaniem ukontrolerów i rzeczy typu UBRRH niewiele im powiedzą (o tym że rejestrów sterujących jest w Atmega od groma i jest tam syf już nie wspomnę).

Najlepiej podłączyć ten moduł przez jakiś UART<-> USB adapter to kompa i samemu najpierw pobawidz się przez terminal szeregowy kodami AT, a jak już będziesz miał co chcesz to wtedy przenieść to na ukontroller.

https://botland.com.pl/moduly-bluetooth/2570-modul-bluetooth-hc-05-5903351241311.html - W linkach jest dokumentacja modułu, jak i lista komend AT.

0

co to jest UDR

1

a nie jest tak, że odczyt UDR tutaj return UDR; ją czyści i tutaj at_komenda_reakcja(UDR); zawsze dostajesz 0? Skoro zwracasz odczytaną wartość w funkcji USART_Receive to czemu jej potem nie używasz tu

void at_komenda_sprawdz(void)
{

    USART_Receive();
    at_komenda_reakcja(UDR);
}

?

2

Zastanawiam się, czy w danych odbieranych w UDR masz zawsze 0 lub 1. Dodaj może do instrukcji switch defaulta i zobacz, czy to zadziała.

1

Zastanawiam się, czy w danych odbieranych w UDR masz zawsze 0 lub 1. Dodaj może do instrukcji switch defaulta i zobacz, czy to zadziała.

Ja bym w ogóle tego switcha wywalił jesli dla 0 i 1 działa tak samo. Przynajmniej na czas testów manualnych

1

Jakby ktoś był zainteresowany to ten sam temat jest na "zaprzyjaźnionym" forum dla elektroników (tym od anody i katody). Myślę, że warto poczytać, bo jest tam więcej merytorycznych rzeczy.
Link do tematu:
link

1

@Kamikos: Warto od razu podać linka a ideałem było by też konto na tym drugim serwisie i link tutaj :D

3
abrakadaber napisał(a):

co to jest UDR

:D
Ogólnie można programowo napisać software do obsługi jakiegoś protokołu UART, I2C, ADC, PWM.
Ale to jest mało optymalne wiadomo i jest specjalnie hardware implementacja.

Teraz te rejestry obsługujące są podmapowane pod bus, a to wygląda tak, że początkowe adres pamięci pierwsze 0xff, to są rejestry sprzętowe, potem wyższe adresy to masz pamięć ram itp.
Jako, że to są liczby nic nie mówiące, każdy mikrokontroler ma mapowania, proste makro w C języku, które rzutuje wskaźnik na adres pod którym adresem się znajduje, jeśli to i/o register to dodatkowo używa specjalnych instrucji in/out.
image
Taka abbrevacja nazwy prawie nic nie mówi, więc najlepiej otworzyć manual danego mikrokontrolera i tam jest opisane, który bit w danym rejestrze za co odpowiada i jak należy ustawiać.
I pod który adresem jaki rejestr jest podmapowany.

Tutaj datasheet ATmega8A
https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega8A-Data-Sheet-DS40001974B.pdf

Na stronie 133 masz diagram sprzętowy USART, jak jest zaprojektowany wewnątrz i do jakich pinów wyjściowych podpięty, można to też z diagramu pinout odczytać.

I na stronie 137 jest initializacja USART.

1 użytkowników online, w tym zalogowanych: 0, gości: 1