collapse

* Links de Robótica

* Posts Recentes

Feira de electricidade e eletrónica por artur36
[Ontem às 23:07]


Power_OK Enermax por almamater
[Ontem às 12:10]


Recomendação de um opamp para um DAC r2r por jm_araujo
[23 de Novembro de 2017, 10:48]


RN42 e TP-Link MR3020 por doiga
[22 de Novembro de 2017, 19:22]


Ajuda Projecto IR / RF por senso
[22 de Novembro de 2017, 13:15]


Ideias para construir um quadrúpede simples por dropes
[21 de Novembro de 2017, 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]

Autor Tópico: Problemas com a USART  (Lida 2908 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Problemas com a USART
« em: 16 de Setembro de 2014, 23:54 »
Estou a tentar imprimir no terminal do PC a string "Hello", a unica coisa que me sai é H ou He outras vezes lixo, e apenas quando o ligo.
Já googlei dezenas de exemplos e passei horas a ler o datasheet, estou completamente encalhado e é provavelmente alguma coisa mesmo á minha frente.
O micro é o atmega328p.
Já agora aqui ficam os fuses lidos pelo avrdude : avrdude: safemode: Fuses OK (H:07, E:D9, L:E2)
Aqui fica o código :
Código: [Seleccione]
#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>

#define UART_BAUDRATE 4800// Set serial baud HERE
#define BAUD_PRESCALE (((F_CPU / (UART_BAUDRATE * 16UL))) - 1)


void setup(void);
void USART_Init(void);
void USART_send( unsigned char data);

int main(void) {

    setup();

    while (1) {

        USART_send('H');
        USART_send('e');
        USART_send('l');
        USART_send('l');
        USART_send('o');
        USART_send('\n');

        _delay_ms(4000);
    }
return 0;
}void setup(void) {

    DDRC = 0x01;
    DDRD = 0x00;

// Set clock to 1 MHZ, also necessary to change F_CPU aproprietly
// to take effect in the delay routines.
    CLKPR = 0x80;
    CLKPR = 0x03;
    USART_Init();
}

void USART_Init(void) {

    UBRR0H = (uint8_t)(BAUD_PRESCALE>>8);
    UBRR0L = (uint8_t)(BAUD_PRESCALE);
    UCSR0C = ((1<<UCSZ00)|(1<<UCSZ01));
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);

}

void USART_send( unsigned char data){

    while(!(UCSR0A & (1<<UDRE0))){};
    UDR0 = data;

}

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Problemas com a USART
« Responder #1 em: 17 de Setembro de 2014, 00:01 »
UART com oscilador interno nos atmegas é para esquecer, podes calibrar o oscilador interno, mas dado que isso é algo mais complicado e penso que precisas de um programador ISP reconhecido no avr-studio, mete antes um cristal.

No entanto os teus fuses estão configurados para usar um cristal externo, meter o sinal do clock no pino PB0, com espaço para bootloader de 2K, mas sem estar a fazer o salto para o bootloader no reset, divisão do clock por 8 e brown out a 4.3v, combinação meio estranha, estás a usar um cristal, ou não?
Avr fanboy

Offline dropes

  • Mini Robot
  • *
  • Mensagens: 1.930
Re: Problemas com a USART
« Responder #2 em: 17 de Setembro de 2014, 00:22 »
A velocidade de um atmega com oscilador interno vai funcionar com a frequência programada nos fusebits, mas infelizmente também vai variar bastante com a tensão de alimentação e precisão do oscilador, sem contar com outros factores menos importantes que o UART tolera.
Seja como for o micro tem de levar cristal ou o sincronismo é mentira e tem de se andar a fazer reset constantemente no micro e no UART do pc cada vez que bloqueia a comunicação.

Existem valores de cristais adequados para a comunicação UART, isto para que a variação seja a mais baixa possível.

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Problemas com a USART
« Responder #3 em: 17 de Setembro de 2014, 00:25 »
Não estou a usar cristal, mas com esta configuração como está já pisquei um LED sem problemas, e o unico fuse que toquei foi no low fuse para tirar o divisor por 8 que vem de fábrica, tudo o resto está com veio de fábrica.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Problemas com a USART
« Responder #4 em: 17 de Setembro de 2014, 00:28 »
De certeza que isso não era um atmega já programado com um bootloader?
Porque até acho estranho o micro funcionar assim sem um cristal.
Avr fanboy

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Problemas com a USART
« Responder #5 em: 17 de Setembro de 2014, 00:57 »
Não tem nenhum bootloader, usei o avrdude com o buspirate para o programar por SPI, e este chip tem cristal interno, é so usar o presacler para dividir o clock.

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Problemas com a USART
« Responder #6 em: 17 de Setembro de 2014, 01:03 »
Página 28 do datasheet :
Default Clock Source
The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 programmed, resulting in
1.0MHz system clock. The startup time is set to maximum and time-out period enabled. (CKSEL = "0010", SUT
= "10", CKDIV8 = "0"). The default setting ensures that all users can make their desired clock source setting
using any available programming interface.

E foi assim que veio, o unico fuse que toquei foi o tal CKDIV8 que desliguei para ter o chip sempre a arrancar a 8.0MHZ certinhos.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Problemas com a USART
« Responder #7 em: 17 de Setembro de 2014, 01:14 »
Usa isto e vê por ti então..
http://www.engbedded.com/fusecalc/
Com low fuse de 07 o CKSEL tem o valor de 0111, full swing crystal.
E não tem um cristal interno, tem um oscilador RC interno com uma variação de +/-10 ou +/-20%

Os valores de fábrica é de low: 0x62, high: D9, extended: FF
Avr fanboy

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Problemas com a USART
« Responder #8 em: 17 de Setembro de 2014, 10:17 »
Por acaso foi esse calculator que usei  :D.
De qualquer maneira já aqui tenho na mão um crystal de 3.6864Mhz mais logo já esperimento.
Agora fiquei um pouco confuso com os Low Power Crystal Oscillator e os Full Swing Crystal Oscillator,
não estou a perceber bem a diferença e têm configuração de fuse diferentes.

P.s - Sim oscilador RC interno era isso a que me referia.

Offline jmiguelff

  • Mini Robot
  • *
  • Mensagens: 204
Re: Problemas com a USART
« Responder #9 em: 17 de Setembro de 2014, 11:05 »
Isto pode não fazer sentido mas eu vendo esse código e tendo esse problema a primeira coisa que tentava era por delays entre os 'sends'.


Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.167
  • NERD!
Re: Problemas com a USART
« Responder #10 em: 17 de Setembro de 2014, 11:10 »
Que software de terminal estás a usar no PC?
É que a última versão do meu favorito (o Bray++ 1.91b - https://sites.google.com/site/terminalbpp/ ) tem um erro que perde caracteres se tiveres os sidepanel "Dec", "Bin" ou "Hex" ligados.
A ultima versão beta (https://sites.google.com/site/terminalbpp/Terminal20140703.zip?attredirects=0) porta-se melhor.
« Última modificação: 17 de Setembro de 2014, 11:14 por jm_araujo »

Offline dropes

  • Mini Robot
  • *
  • Mensagens: 1.930
Re: Problemas com a USART
« Responder #11 em: 17 de Setembro de 2014, 14:31 »
Se estás a dizer que alteraste os fusebits para ter um oscilador interno de 8MHz, então no teu código também devias ter alterado a velocidade na 1ª linha onde está 1MHz.

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.494
Re: Problemas com a USART
« Responder #12 em: 17 de Setembro de 2014, 21:19 »
Que software de terminal estás a usar no PC?
É que a última versão do meu favorito (o Bray++ 1.91b - https://sites.google.com/site/terminalbpp/ ) tem um erro que perde caracteres se tiveres os sidepanel "Dec", "Bin" ou "Hex" ligados.
A ultima versão beta (https://sites.google.com/site/terminalbpp/Terminal20140703.zip?attredirects=0) porta-se melhor.

Correcto! Perde bytes e fica lento! se tiver tudo selecionado (Dec, Bin, Hex) e enviar um conjunto de bytes, os bytes são mostrados aos "soluços"

Costumo usar o Hercules; é menos intuitivo que o bray++ mas também gosto bastante.
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Problemas com a USART
« Responder #13 em: 17 de Setembro de 2014, 21:38 »
Ok agora com o crystal continua basicamente na mesma, entretanto reparei que tinha o fuse, WDTON e tentei ativalo com o comando :
avrdude -p atmega328p -c buspirate -P /dev/ttyUSB0 -U hfuse:w:0x17:m
Agora estraguei tudo, já não consigo programar mais o chip  >:(
Agora quando o tento programar ou alterar os fuses recebo :
avrdude -p atmega328p -c buspirate -P /dev/ttyUSB0 -U hfuse:w:0x07:m -F

Attempting to initiate BusPirate binary mode...
avrdude: initialization failed, rc=-2
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x58246b
avrdude: Expected signature for ATmega328P is 1E 95 0F

avrdude done.  Thank you.

E pronto já não sai disto, e insistindo reparo que o Device signature está sempre a mudar.
Voltei á estáca -1.  :o

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Problemas com a USART
« Responder #14 em: 17 de Setembro de 2014, 22:51 »
Para cristais deves SEMPRE usar full swing cristal oscilator, usa um pouco mais de corrente, o low power é mais indicado para frequencias baixas, tipo 32Khz e por ai assim, tambem se pode usar com os ressonadores cerâmicos.

E porque é que querias activar o watch-dog?
É util, mas para aplicações simples é melhor não usar isso, provavelmente está sempre a fazer resets devido ao watch-dog.

Re-confirma todas as conexões do programador.
Avr fanboy