4 votos

Microcontrolador enviando basura a frambuesa.

Yo estoy tratando de enviar dos comandos para mi raspberry a través de puerto serie. Tengo el siguiente código:

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

#define F_CPU 8000000UL
#define BAUD  9600

int main( void ) 
{
    // BAUD RATE (bits per second)
    UBRR0 = ( ( F_CPU / 8 / BAUD ) - 1 ); // 01100111

    // CONFIGURATION REGISTERS
    UCSR0B = 0b00001000; // enable transmitter (TXEN0)
    UCSR0C = 0b00000110; // set 8-bit data frame size  

    char buf[2][222] = 
            {
                { "AT" },
                { "AT+CWSAP=\"AVRAP\",\"abcd\",11,0" }
            };

    int i = 0;
    int x = 0;

    while( 1 )
    {

        if( x == sizeof( buf ) )
        {
            break;
        }

        if( i<strlen( buf[ x ] ) )
        {
            UDR0 = buf[x][i];
            i++;
        }
        else
        {
            UDR0 = 13;
            UDR0 = 10;
            x++;
            i = 0;

            _delay_ms( 10000 );
        }


        _delay_ms( 50 );
    }

    return 0;
}

Y estoy usando el siguiente fichero makefile:

CC=/usr/bin/avr-gcc
MEGA=328p
CFLAGS=-g -Os -Wall -mcall-prologues -mmcu=atmega$(MEGA)
OBJ2HEX=/usr/bin/avr-objcopy 
PROG=/usr/bin/avrdude
TARGET=serial

program : $(TARGET).hex
        $(PROG) -c avrispv2 -p m$(MEGA) -P /dev/ttyACM0 -e -U lfuse:w:0xe2:m -U hfuse:w:0xd9:m
        $(PROG) -c avrispv2 -p m$(MEGA) -P /dev/ttyACM0 -U flash:w:$(TARGET).hex

%.obj : %.o
        $(CC) $(CFLAGS) $< -o $@

%.hex : %.obj
        $(OBJ2HEX) -R .eeprom -O ihex $< $@

clean :
        rm -f *.hex *.obj *.o

Tenga en cuenta que yo soy la configuración de los fusibles para uso interno de reloj, por lo que se debe ejecutar en 8Mhz:

-U lfuse:w:0x62:m

La velocidad de la CPU se define como 8Mhz la velocidad se establece a 9600, pero cuando voy a ejecutar el siguiente comando en mi raspberry, todo lo que veo es basura:

picocom /dev/ttyAMA0 -b 9600


picocom v1.7

port is        : /dev/ttyAMA0
flowcontrol    : none
baudrate is    : 9600
parity is      : none
databits are   : 8
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv
imap is        : 
omap is        : 
emap is        : crcrlf,delbs,

Terminal ready
�`�怘��`枆�~������▒�x�x�x�x�x�x�▒��▒�x�x�x�▒������怘�

No quiero correr el micro-controlador con oscilador externo, puedo usar la comunicación serial a reducir las tasas sin usarlo?

10voto

Andrew Walker Puntos 9038

Su problema es que quiere calcular la velocidad en baudios divisor de "doble modo de velocidad", pero que están descuidando a permitir que el modo de configuración del bit 1 de UCRS0A, cuyo valor por defecto es 0. Esto significa que la UART mal divisor es de operación en el modo de velocidad, para las que el divisor valor es el doble de lo que debería ser. Por lo tanto el puerto serie funciona a la mitad de la velocidad prevista.

Usted debe:

  • Dividir por 16 en su divisor de cálculo y dejar/set UCRS0A el bit 1 en el restablecimiento predeterminado desactivada.

  • Dividir por 8 en su divisor de cálculo y establecer explícitamente el bit 1 de UCRS0A.

3voto

SonalKhodiyar Puntos 161

El cambio extraño de la tasa de BAUD a 4800 en el terminal de Linux solucionó el problema:

 picocom /dev/ttyAMA0 -b 4800
picocom v1.7

port is        : /dev/ttyAMA0
flowcontrol    : none
baudrate is    : 4800
parity is      : none
databits are   : 8
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv
imap is        : 
omap is        : 
emap is        : crcrlf,delbs,

Terminal ready
AT
AT+CWSAP="AVRAP","abcd",11,0
 

Supongo que los fusibles están configurando el ATMEGA para funcionar a 4MHZ no a 8MHZ.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X