Operácie

Schaeffler Modul 3A

Zo stránky SensorWiki

➨ Home

Komunikácia a UART - praktická časť

Softvér a materiály na stiahnutie



Odkazy


1. Bare-metal prístup k programovaniu

#include "microbian.h"
#include "hardware.h"
#include "serial.h"
#include "lib.h"
#include "accel.h"


static void main(int n)
{
    int x, y, z;

    timer_delay(1000);
    accel_start();

    while (1) 
    {
        timer_delay(200);

        accel_reading(&x, &y, &z);

        printf("%d,%d,%d\n", x, y, z);

    }
}


void init(void)
{
    serial_init();
    timer_init();
    i2c_init(I2C_INTERNAL);
    start("Main", main, 0, STACK);
}
#include "hardware.h"

void serial_init(void);
void serial_puts(const char *s);

/* Pins to use for serial communication */
#define TX USB_TX
#define RX USB_RX

int txinit;              /* UART ready to transmit first char */

/* serial_init -- set up UART connection to host */
void serial_init(void)
{
    UART_ENABLE = UART_ENABLE_Disabled;
    UART_BAUDRATE = UART_BAUDRATE_9600; /* 9600 baud */
    UART_CONFIG = FIELD(UART_CONFIG_PARITY, UART_PARITY_None);
                                        /* format 8N1 */
    UART_PSELTXD = TX;                  /* choose pins */
    UART_PSELRXD = RX;
    UART_ENABLE = UART_ENABLE_Enabled;
    UART_STARTTX = 1;
    UART_STARTRX = 1;
    UART_RXDRDY = 0;
    txinit = 1;
}

/* serial_putc -- send output character */
void serial_putc(char ch)
{
    if (! txinit) {
        while (! UART_TXDRDY) { }
    }
    txinit = 0;
    UART_TXDRDY = 0;
    UART_TXD = ch;
}

/* serial_puts -- send a string character by character */
void serial_puts(const char *s)
{
    while (*s != '\0')
        serial_putc(*s++);
}
/* Časť súboru hardware.h s definíciami týkajúcimi sa UART rozhrania */

/* UART */

/* Interrupts */
#define UART_INT_RXDRDY 2
#define UART_INT_TXDRDY 7

#define UART_BASE                       _BASE(0x40002000)
/* Tasks */
#define UART_STARTRX                    _REG(unsigned, 0x40002000)
#define UART_STARTTX                    _REG(unsigned, 0x40002008)
/* Events */
#define UART_RXDRDY                     _REG(unsigned, 0x40002108)
#define UART_TXDRDY                     _REG(unsigned, 0x4000211c)
/* Registers */
#define UART_INTENSET                   _REG(unsigned, 0x40002304)
#define UART_INTENCLR                   _REG(unsigned, 0x40002308)
#define UART_ENABLE                     _REG(unsigned, 0x40002500)
#define   UART_ENABLE_Disabled 0
#define   UART_ENABLE_Enabled 4
#define UART_PSELTXD                    _REG(unsigned, 0x4000250c)
#define UART_PSELRXD                    _REG(unsigned, 0x40002514)
#define UART_RXD                        _REG(unsigned, 0x40002518)
#define UART_TXD                        _REG(unsigned, 0x4000251c)
#define UART_BAUDRATE                   _REG(unsigned, 0x40002524)
#define   UART_BAUDRATE_1200   0x0004f000
#define   UART_BAUDRATE_2400   0x0009d000
#define   UART_BAUDRATE_4800   0x0013b000
#define   UART_BAUDRATE_9600   0x00275000
#define   UART_BAUDRATE_14400  0x003af000
#define   UART_BAUDRATE_19200  0x004ea000
#define   UART_BAUDRATE_28800  0x0075c000
#define   UART_BAUDRATE_31250  0x00800000
#define   UART_BAUDRATE_38400  0x009d0000
#define   UART_BAUDRATE_56000  0x00e50000
#define   UART_BAUDRATE_57600  0x00eb0000
#define   UART_BAUDRATE_76800  0x013a9000
#define   UART_BAUDRATE_115200 0x01d60000
#define   UART_BAUDRATE_230400 0x03b00000
#define   UART_BAUDRATE_250000 0x04000000
#define   UART_BAUDRATE_460800 0x07400000
#define   UART_BAUDRATE_921600 0x0f000000
#define   UART_BAUDRATE_1M     0x10000000
#define UART_CONFIG                     _REG(unsigned, 0x4000256c)
#define   UART_CONFIG_HWFC __BIT(0)
#define   UART_CONFIG_PARITY __FIELD(1, 3)
#define     UART_PARITY_None 0
#define     UART_PARITY_Even 7

2. Programovanie vo vyššom programovacom jazyku

Teraz to isté spravíme vo vyššom programovacom jazyku, bude to Python:

from microbit import *

uart.init(baudrate=115200, bits=8, parity=None, stop=1)

while True:
    accX = accelerometer.get_x()
    
    uart.write('%d\r\n' % (accX))

    sleep(100)
    display.set_pixel(1,1,5)
    sleep(100)
    display.set_pixel(1,1,0)




Úlohy:
1. Zmeňte prenosovú rýchlosť na 9600 Bd, skúste zmeniť aj iné parametre a otestujte ako sa to prejaví na prijímaných dátach.
2. Zobrazte v programe SerialPlot všetky tri osi akcelerometra a predveďte, že meria skutočne aj gravitačné zrýchlenie.

Postup:

  • upravte program v Pythone nasledovne:
    • program má poslať do PC tri čísla -- zrýchlenie v osi x-, y- a z-. Čísla majú byť oddelené čiarkou a na konci má byť nový riadok ('\r\n').
  • program preneste do micro:bitu
  • spustite program Terminal, nastavte komunikačné parametre a stlačte Connect - v terminálovom okne by ste mali vidieť prijaté znaky. Ak je formát vyhovujúci, odpojte port (Disconnect) a pokračujte ďalej
  • Nastavte parametre pre grafický program SerialPlot. Po spustení programu SerialPlot by ste mali vidieť grafické priebehy.




3. Simulink

No a na záver vyskúšame programovať v prostredí Simulink




Serial Terminal by Bray

Na testovanie a prvé pokusy so sériovým rozhraním sa vám určite zíde aj nejaký terminálový program, masochisti môžu použiť aj Hyperterminál z Windows. Terminál je jednoduchý program, v ktorom sa zobrazujú všetky prijaté znaky a naopak, je možné nejaké iné znaky odvysielať. Dajú sa samozrejme aj nastaviť základné komunikačné parametre.

Ukážka práce s Terminalom vrátane správneho nastavenia parametrov


Serial Plotter

Serial Plotter je trocha sofistikovanejší program ako Terminal, jeho úlohou je zakresliť graficky všetky prijaté informácie. Najjednoduchšie je posielať mu čísla, pričom ich môže byť aj viac, oddelených čiarkami. Každá jedna n-tica hodnôt musí končíť znakom pre nový riadok. V knižnici Serial použite bloky Serial Write Number pre čísla, Serial Write String pre čiarky a Serial Write Line pre ukončenie riadka. Neposielajte hodnoty príliš často, aby sa nepreplnil vstupný buffer.