USART 传输 - AVR (atmega169p) 接收 0 或 null 而不是 char 'a'
USART transmission - AVR (atmega169p) receives 0 or null instead of char 'a'
我正在尝试通过 USB 转串口电缆将带有白蚁的角色 'a' 发送到我的 AVR。这以前有效,但过了一段时间 atmel studio 没有将控制器显示为设备,我不得不将 atmel studio 更新到更高版本以识别控制器。我可能在尝试的过程中更改了代码,所以我不确定代码是否正确。
这是一个非常简单的程序,用于接收到达的第一个字符:
#include <avr/io.h>
#include "initialize.h"
#include "constantComfort.h"
char receivedchar;
void USART_receive_char(void){
/* wait for data to be received */
while( !(UCSR0A & (1<<RXC0)) );
receivedchar = UDR0;
}
int main(void)
{
init(0.5); //0.5 for interruptcycle in seconds
USART_receive_char();
writeLong(receivedchar,1);
}
write-long如果我直接插入它可以写'a'作为ascii码97,但是当我尝试接收'a'或其他字符时它只显示0.
AVR 的初始化如下所示,我很确定我已经相应地设置了白蚁程序。 9600 波特率,8 个数据位,1 个停止位,无奇偶校验。
//USART (for Serial connection to computer)
#define F_CPU 1000000
#define BAUDRATE 9600 // 9600 bits/sec
#define BAUD ((F_CPU)/(BAUDRATE*16UL)-1) // from formula
/* enable USART0 module */
PRR = (0<<PRUSART0);
/* set baud rate to defined baudrate*/
UBRR0H = (BAUD>>8);
UBRR0L = (BAUD);
/* enable receiver and transmitter */
UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
/* set frame format: 8 data bits, 1 stop bit (always 1 start bit)*/
UCSR0C |= (0<<USBS0)|(3<<UCSZ00);
我很确定这是影响此问题的所有代码。我已经阅读了寄存器名称手册,所以我相信初始化是正确的。
有人知道如何解决这个问题吗?
代码似乎是正确的,除了
PRR = (0 << PRUSART0); // i think this does not work
试试这个
PRR &= ~(1 << PRUSART0);
然后启用 USART 接收中断试试这个
#include <avr/interrupt.h>
#include <inttypes.h>
sei(); //global interrupt enable
UCSR0B |= (1 << RXCIEn); //USART receive interrupt enable (datasheet page 195)
ISR(USART_RXCn) (datasheet page 57)
{
//LED_on switch ON or OFF one of your leds if the receive interrupt is triggered by incoming data from termite
}
对于波特率试试这个(数据表第 176 页)
UBRRH0 = (unsigned char)(BAUD>>8);
UBRRL0 = (unsigned char)BAUD; // the type-casting to unsigned char
atmega169p 具有 8 MHz 时钟频率
我读到在 "low power consumption" 模式下,avr 的时钟频率为 1 MHz,不知何故我认为这是默认值。
默认情况下,atmega169p 的时钟频率为 8 MHz,没有预分频,因此波特率计算错误,我认为 avr 读取速度不够快,因此接收到“0”。
正确的代码片段:
//USART (for Serial connection to computer)
#define F_CPU 8000000 //>>>>>>>>>> THIS ONE! <<<<<<<<<<<<
#define BAUDRATE 9600
#define BAUD ((F_CPU)/(BAUDRATE*16UL)-1)
像此代码片段中那样更改为 8 MHz 解决了我的问题。
感谢您帮助我解决代码中的其他潜在问题!
我正在尝试通过 USB 转串口电缆将带有白蚁的角色 'a' 发送到我的 AVR。这以前有效,但过了一段时间 atmel studio 没有将控制器显示为设备,我不得不将 atmel studio 更新到更高版本以识别控制器。我可能在尝试的过程中更改了代码,所以我不确定代码是否正确。
这是一个非常简单的程序,用于接收到达的第一个字符:
#include <avr/io.h>
#include "initialize.h"
#include "constantComfort.h"
char receivedchar;
void USART_receive_char(void){
/* wait for data to be received */
while( !(UCSR0A & (1<<RXC0)) );
receivedchar = UDR0;
}
int main(void)
{
init(0.5); //0.5 for interruptcycle in seconds
USART_receive_char();
writeLong(receivedchar,1);
}
write-long如果我直接插入它可以写'a'作为ascii码97,但是当我尝试接收'a'或其他字符时它只显示0.
AVR 的初始化如下所示,我很确定我已经相应地设置了白蚁程序。 9600 波特率,8 个数据位,1 个停止位,无奇偶校验。
//USART (for Serial connection to computer)
#define F_CPU 1000000
#define BAUDRATE 9600 // 9600 bits/sec
#define BAUD ((F_CPU)/(BAUDRATE*16UL)-1) // from formula
/* enable USART0 module */
PRR = (0<<PRUSART0);
/* set baud rate to defined baudrate*/
UBRR0H = (BAUD>>8);
UBRR0L = (BAUD);
/* enable receiver and transmitter */
UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
/* set frame format: 8 data bits, 1 stop bit (always 1 start bit)*/
UCSR0C |= (0<<USBS0)|(3<<UCSZ00);
我很确定这是影响此问题的所有代码。我已经阅读了寄存器名称手册,所以我相信初始化是正确的。
有人知道如何解决这个问题吗?
代码似乎是正确的,除了
PRR = (0 << PRUSART0); // i think this does not work
试试这个
PRR &= ~(1 << PRUSART0);
然后启用 USART 接收中断试试这个
#include <avr/interrupt.h>
#include <inttypes.h>
sei(); //global interrupt enable
UCSR0B |= (1 << RXCIEn); //USART receive interrupt enable (datasheet page 195)
ISR(USART_RXCn) (datasheet page 57)
{
//LED_on switch ON or OFF one of your leds if the receive interrupt is triggered by incoming data from termite
}
对于波特率试试这个(数据表第 176 页)
UBRRH0 = (unsigned char)(BAUD>>8);
UBRRL0 = (unsigned char)BAUD; // the type-casting to unsigned char
atmega169p 具有 8 MHz 时钟频率
我读到在 "low power consumption" 模式下,avr 的时钟频率为 1 MHz,不知何故我认为这是默认值。
默认情况下,atmega169p 的时钟频率为 8 MHz,没有预分频,因此波特率计算错误,我认为 avr 读取速度不够快,因此接收到“0”。
正确的代码片段:
//USART (for Serial connection to computer)
#define F_CPU 8000000 //>>>>>>>>>> THIS ONE! <<<<<<<<<<<<
#define BAUDRATE 9600
#define BAUD ((F_CPU)/(BAUDRATE*16UL)-1)
像此代码片段中那样更改为 8 MHz 解决了我的问题。
感谢您帮助我解决代码中的其他潜在问题!