Não tenho UART no meu microcontrolador, então como posso adicionar um?

13

Estou usando um microcontrolador ATMEGA32HVB que possui um recurso para balanceamento de células, através do qual podemos conectar 4 baterias em série e usar uma de cada vez. Isso é muito útil para gerenciamento de energia, por isso não posso usar um microcontrolador diferente. Sugira alguns métodos para adicionar um UART a ele, para que eu possa interagir facilmente com dispositivos seriais.

user27475
fonte
11
O modo UART do software, conforme descrito por user26129, é chamado de bang-bang .
usar o seguinte código
4
Apenas meus US $ 0,02 muito subjetivos, mas eu normalmente preferiria um controlador de bateria dedicado separado e um UART integrado ao uC em vez do contrário. Por que você precisa do gerenciamento de bateria integrado no uC?
Mels
Eu tenho que usar baterias recarregáveis, que vai começar a ser cobrado através de um painel solar de modo que eu preciso 4 battries em série whch serão usados um de cada vez
user27475
4
Uma pergunta é quanto você deseja usar o UART e em quais direções. Se você deseja gerar apenas uma mensagem de status ou depuração ocasional, em um momento em que seu processador não está com muita demanda adicional, a saída serial com interrupção de bits pode parecer muito atraente. Existem ticks como o uso de interrupções de troca de pinos que também podem diminuir a carga média de ter um canal de entrada, mas se você espera receber caracteres com uma alta taxa de transmissão no momento em que tiver outros compromissos em tempo real, pode ser um problema.
precisa

Respostas:

17

Como outros observaram, você pode adicionar hardware adicional ao seu sistema para fornecer a funcionalidade UART ou emular um no software. Se você tem controle sobre o design geral do hardware e a adição de outro IC é uma opção, eu consideraria fortemente a abordagem baseada em hardware. Certamente, você pode fazer um UART de software funcionar usando a troca de bits , mas talvez não queira dedicar os recursos da CPU para gerar o tempo necessário.

De uma olhada na folha de dados, parece que seu microcontrolador possui SPI e I2C (que a Atmel chama de interface de dois fios (TWI)). Essas provavelmente seriam as melhores interfaces a serem usadas para conectar um UART externo. Os referidos dispositivos estão disponíveis em vários fabricantes. Alguns exemplos:

  • A Exar ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts ) possui uma linha de dispositivos UART SPI / I2C de 1 e 2 canais, cobrindo ~ 1,6- Faixa de operação de 3.3V. Não usei nenhuma dessas partes especificamente, mas usei dispositivos Exar no passado (com interfaces de barramento de memória paralela) e eles funcionaram bem.

  • O NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ ) possui uma linha de dispositivos SPI / I2C UART / IrDA / GPIO disponíveis, também nos modelos 1 e 2 variedades de canais em algumas faixas de tensão. Eu usei essas peças (especificamente o SC16IS762) extensivamente no passado, com grande sucesso.

  • A Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 ) possui os dispositivos MAX3110E e MAX3111E, que são UARTs conectados por SPI. Uma característica exclusiva desses dispositivos é que eles possuem um driver de linha RS-232 integrado. Portanto, se você precisar que o seu UART faça interface com um dispositivo que usa tensões de linha RS-232 em vez de níveis lógicos (por exemplo, um PC), isso pode ser útil, pois evitará a adição de outro IC de driver de linha à sua placa.

Jason R
fonte
Uau, nunca soube que Maxim tinha esses itens, teria +2 se eu pudesse.
precisa saber é o seguinte
8

Você precisará usar um driver UART de software. Dependendo exatamente do que você espera deste UART, você pode usar o AVR305 (extremamente compacto, mas nenhum recurso além de bloquear o envio / recebimento half-duplex), o AVR274 (com interrupção, o recurso bastante completo), você pode escrever seu próprio driver UART de software ou você pode usar um que encontrar na internet, por exemplo, pesquisando 'avr software uart'

user36129
fonte
3

Uma breve observação sobre o design do software "UART": existem pelo menos abordagens qualitativamente diferentes que você pode adotar, dependendo dos requisitos:

  • Um driver de controle de bits "assuma tudo" desabilitará todas as interrupções e usará o código contado no ciclo para registrar cada bit. O recebimento de dados com um driver "assumir tudo" exige que, quando os dados cheguem, o controlador não faça nada além de aguardá-los.

  • Um driver de controle de bits "assumir o loop principal" se comportará como o descrito acima, exceto pelo uso de um recurso de timer para temporizações de bits, em vez de contagem de ciclos. Interrupções que não demoram muito para serem reparadas podem ficar ativadas. Para transmissão serial, o recurso de timer de taxa fixa pode ser compartilhado com outros fins; para recepção serial, no entanto, o driver bit-bang precisará ser capaz de recarregar o timer quando o bit inicial chegar, de modo a expirar no meio de cada bit de tempo recebido.

  • Um driver de bit-bang totalmente acionado por interrupção usa um timer de taxa fixa que está sendo executado em alguns múltiplos da taxa de dados de preferência (3x e 5x são melhores que 4x) e faz tudo através desse timer. Esse driver pode ser executado simultaneamente com todo o resto, mas exigirá uma CPU mais rápida do que os tipos de driver anteriores exigiriam.

Para evitar que os dois primeiros estilos de controlador esperem eternamente por dados que talvez nunca venham, é comum que as rotinas de leitura incluam um valor de tempo limite. Observe que se o loop de um controlador, por exemplo, "obtém um byte enquanto aguarda até 100 ms, faça outras coisas se não houver nenhum, e obtenha o próximo byte, etc." e um byte chegar entre o tempo limite da rotina "get" e o controlador começar a esperar novamente, esse byte será perdido; o dispositivo com o qual está se comunicando terá que esperar essa possibilidade.

Somente o terceiro estilo de driver poderá lidar com a possibilidade de um byte de dados começar a chegar enquanto um byte de dados estiver sendo transmitido. Os dois primeiros estilos podem, no entanto, ser usados ​​para alguns protocolos de comunicação full-duplex de velocidade total se o controlador precisar falar apenas quando for falar com ele. O truque é ter uma rotina de "leitura e gravação de dados" que espere por um bit inicial recebido e, quando for detectado, se sobreponham a uma leitura e gravação, de modo que o controlador envie cada bit assim que estiver prestes a examinar os dados recebidos. Uma vez que o controlador detecte o bit inicial de entrada, ele saberá exatamente quando deve procurar os próximos 8 bits de dados e o bit de parada e, assim, saberá que pode usar com segurança o tempo entre eles para gerar seus próprios dados.

Uma observação final: um controlador que usa um dos dois primeiros estilos de bit-bang uart para receber dados deve processar cada byte de dados antes da borda descendente do bit de início do próximo byte para evitar a perda de dados. Se o controlador souber que o processamento levará pelo menos meio tempo, poderá maximizar o tempo disponível para processamento, aceitando cada byte assim que pegar o último bit de dados, em vez de aguardar o bit de parada. Como outro meio de dar mais tempo ao controlador, no entanto, pode ser útil ter o dispositivo que está transmitindo dados com dois bits de parada em vez de um. Se a "paridade de marca" puder ser configurada, isso adicionará outro tempo extra de bit. A transmissão em, por exemplo, 115200-8-M-2 permitirá mais tempo de processamento que 57600-8-N-1, mesmo que os dados sejam alimentados mais de 1,6 vezes mais rápido.

supercat
fonte
1

Você pode simplesmente usar o pino de E / S do uC. A única coisa que ao trocar ou transferir dados nesses pinos deve ter a frequência dos pinos dobrada para a taxa de transmissão. É assim que o UART normalmente funciona; ele amostrará o sinal de bit no meio.

nitina
fonte