- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 AVR STK600 板编写一个程序,其中循环显示 LED。当按下开关时,相应的 LED 会亮起(到目前为止,一切顺利)。现在正在向开发板添加另一个功能,尝试使用 USART(RS232 串行通信)。
- 当用户按下某个键时,应该回显该键(在 super 终端上)。- 当按下 crtl-Z 时,数据应记录在 EEPROM 中(再次按下 crtl-z 应停止记录)。-当按下 crtl-y 时,应回放记录的数据。
这里出现的问题是USART(我检查了所有硬件设置,做了环回测试......一切正常),所以代码应该有一些问题。在 EEPROM 之后切换 LED 一切顺利,USART 进展不顺利。
这是我的代码,我使用 AVR-GCC。我也不使用“avrlib”,因为我们正在学习的类(class)不允许我们这样做:
#include "header.h"
#define BASE_ADDR 0x20
#define READ_ATMEGA(ADDR) *((P_CHAR)(BASE_ADDR + ((ADDR) * ADDR_MULTIPLIER)))
#define WRITE_ATMEGA(ADDR, DATA) *((P_CHAR)(BASE_ADDR + ((ADDR) * ADDR_MULTIPLIER))) = DATA
#define LED_DELAY 10
#define F_CPU 8000000
#define BAUDRATE 9600
#define BAUD_PRESCALER (((F_CPU/(BAUDRATE * 16UL)))-1)
volatile UINT intrs, i = 1, count, switch_pressed = 0, uiAdd, uiAddEnd, flag_led_intr;
volatile UINT record, play_recorded_keys, RX, flag_serial_receiver, TX_complete;
volatile unsigned char get_switch=0, data;
extern void __vector_23 (void) __attribute__ ((interrupt));
extern void __vector_25 (void) __attribute__ ((signal));
extern void __vector_27 (void) __attribute__ ((interrupt));
void enable_ports(void);
int get_switchpressed(void);
void call_interruptHandler(void);
void usart_init(void);
//void usart_bounce();
void initialize(void);
void ReadWriteSerialPort(void);
void EEPROM_write(unsigned int uiAddress, unsigned char ucData);
unsigned char EEPROM_read(unsigned int uiAddress);
void initialize(void)
{
cli(); //stop all interrupts
flag_led_intr = 0;
record = 0;
play_recorded_keys = 0;
RX = 0;
flag_serial_receiver = 0;
uiAdd = 0;
uiAddEnd = 0;
TX_complete = 0;
enable_ports();
usart_init();
sei();
}
void enable_ports() //Enables PORTB, PORTD & TIMER
{
WRITE_ATMEGA(DDRB,0xff); //PORTB as output for leds
WRITE_ATMEGA(PORTB,0xff); //Initialize PORTB
WRITE_ATMEGA(DDRD, 0x00); //PORTD as input for switches
WRITE_ATMEGA(TCCR0B, 0x05); //Setting TIMER to 1024 prescaler
WRITE_ATMEGA(TIMSK0, 0x01);
WRITE_ATMEGA(TCNT0, 256-LED_DELAY);
intrs = 0;
}
void usart_init(void) //Enables USART
{
/* Set baud rate */
WRITE_ATMEGA(UBRR0L, BAUD_PRESCALER);
WRITE_ATMEGA(UBRR0H,(BAUD_PRESCALER>>8));
/* Set frame format: 8 bit data + start bit + stop bit */
WRITE_ATMEGA(UCSR0C, 0x06);
/* Enable reciever and transmitter */
WRITE_ATMEGA(UCSR0B, 0xD8);
}
void __vector_23 (void)
{
call_interruptHandler();
}
void __vector_25 (void)
{
RX = UDR0;
flag_serial_receiver = 1;
sei();
}
void __vector_27 (void)
{
TX_complete = 1;
}
void call_interruptHandler()
{
intrs++;
if(intrs > LED_DELAY)
{
WRITE_ATMEGA(PORTB, 0xff<<i);
i++;
if(i==10)
{
WRITE_ATMEGA(PORTB, 0xff);
i = 1;
}
}
count = get_switchpressed();
if(count != 0)
{
WRITE_ATMEGA(PORTB, 0xff<<count);
intrs = 0;
}
//sei();
}
int get_switchpressed()
{
get_switch = READ_ATMEGA(PIND);
switch(get_switch) {
case 0xFE:
switch_pressed = 1;
break;
case 0xFD:
switch_pressed = 2;
break;
case 0xFB:
switch_pressed = 3;
break;
case 0xF7:
switch_pressed = 4;
break;
case 0xEF:
switch_pressed = 5;
break;
case 0xDF:
switch_pressed = 6;
break;
case 0xBF:
switch_pressed = 7;
break;
case 0x7F:
switch_pressed = 8;
break;
};
return (switch_pressed);
}
void ReadWriteSerialPort(void)
{
if(RX == 0x1A)
{
record = !record;
play_recorded_keys = 0;
}
else if(RX == 0x19)
{
record = 0;
play_recorded_keys = !play_recorded_keys;
}
if(record)
{
EEPROM_write(uiAdd++, RX);
}
if(uiAdd == 4096)
{
record = 0;
uiAddEnd = 4096;
}
else
uiAddEnd = uiAdd;
}
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
while(EECR & (1<<EEPE)); /* Wait for completion of previous write */
WRITE_ATMEGA(EEARH,(uiAddress>>8)); /* Set up address and Data Registers */
WRITE_ATMEGA(EEARL, uiAddress);
WRITE_ATMEGA(EEDR, ucData);
WRITE_ATMEGA(EECR, (EECR |(1<<EEMPE))); /* Write logical one to EEMPE */
WRITE_ATMEGA(EECR, (EECR |(1<<EERE))); /* Start eeprom write by setting EEPE */
}
unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEPE)); /* Wait for completion of previous write */
WRITE_ATMEGA(EEARH,(uiAddress>>8)); /* Set up address register */
WRITE_ATMEGA(EEARL,uiAddress);
WRITE_ATMEGA(EECR, (EECR |(1<<EERE))); /* Start eeprom read by writing EERE */
return EEDR; /* Return data from Data Register */
}
int main(void)
{
initialize();
while(1)
{
if(flag_serial_receiver == 1)
{
flag_serial_receiver = 0;
ReadWriteSerialPort();
}
if(play_recorded_keys)
{
unsigned char TX = EEPROM_read(uiAdd++);
if(uiAdd == 4096 || uiAdd >= uiAddEnd)
{
play_recorded_keys = 0;
uiAdd = 0;
}
while((UCSR0A & (1<<UDRE0)) == 0);
WRITE_ATMEGA(UDR0,TX);
while(TX_complete == 0);
TX_complete;
}
}
return(0);
}
这是 header.h 文件
#ifndef HEADER_H
#define HEADER_H
/*******PORTS******************/
#define PINA 0x0
#define DDRA 0x1
#define PORTA 0x2
#define PINB 0x3
#define DDRB 0x4
#define PORTB 0x5
#define PINC 0x6
#define DDRC 0x7
#define PORTC 0x8
#define PIND 0x9
#define DDRD 0xA
#define PORTD 0xB
#define PINE 0xC
#define DDRE 0xD
#define PORTE 0xE
#define PINF 0xF
#define DDRF 0x10
#define PORTF 0x11
#define PING 0x12
#define DDRG 0x13
#define PORTG 0x14
#define PINH 0xE0
#define DDRH 0xE1
#define PORTH 0xE2
#define PINJ 0xE3
#define DDRJ 0xE4
#define PORTJ 0xE5
#define PINK 0xE6
#define DDRK 0xE7
#define PORTK 0xE8
#define PINL 0xE9
#define DDRL 0xEA
#define PORTL 0xEB
/************TIMERS ************/
#define TCCR0A 0x24
#define TCCR0B 0x25
#define TCNT0 0x26
#define OCR0A 0x27
#define OCR0B 0x28
#define TIMSK0 0x4E
#define TIFR0 0x15
#define COM0A1 0x7
#define COM0A0 0x6
#define COM0B1 0x5
#define COM0B0 0x4
#define WGM02 0x3
#define WGM01 0x1
#define WGM00 0x0
#define CS02 0x2
#define CS01 0x1
#define CS00 0x0
#define OCIE0B 0x2
#define OCIE0A 0x1
#define TOIE0 0x0
/****** Interrupts *******/
#define EICRA 0x49
#define EICRB 0x4A
#define EIMSK 0x1D
#define PCICR 0x48
#define PCMSK0 0x4B
#define PCMSK1 0x4C
#define PCMSK2 0x4D
/************EEPROM************/
#define EECR 0x1F
#define EEDR 0x20
#define EEARL 0x21
#define EEARH 0x22
#define EEAR0 0
#define EEAR1 1
#define EEAR2 2
#define EEAR3 3
#define EEAR4 4
#define EEAR5 5
#define EEAR6 6
#define EEAR7 7
#define EEAR8 8
#define EEAR9 9
#define EEAR10 10
#define EEAR11 11
#define LSB 0
#define MSB 7
#define EERE 0
#define EEPE 1
#define EEMPE 2
#define EERIE 3
#define EEPM0 4
#define EEPM1 5
/************UART Status Control Registers & Data Registers **************/
/** USART3 **/
#define UCSR3A 0x130
#define UCSR3B 0x131
#define UCSR3C 0x132
#define UBRR3L 0x134
#define UBRR3H 0x135
#define UDR3 0x136
#define UDR3_TXB UDR3 /* transmit data buffer register */
#define UDR3_RXB UDR3 /* receive data buffer register */
/** USART2 **/
#define UDR2 0xD6
#define UBRR2H 0xD5
#define UBRR2L 0xD4
#define UCSR2C 0xD2
#define UCSR2B 0xD1
#define UCSR2A 0xD0
#define UDR2_TXB UDR2 /* transmit data buffer register */
#define UDR2_RXB UDR2 /* receive data buffer register */
/** USART1 **/
#define UDR1 0xCE
#define UBRR1H 0xCD
#define UBRR1L 0xCC
#define UCSR1C 0xCA
#define UCSR1B 0xC9
#define UCSR1A 0xC8
#define UDR1_TXB UDR1 /* transmit data buffer register */
#define UDR1_RXB UDR1 /* receive data buffer register */
/** USART0 **/
#define UDR0 0xC6
#define UBRR0H 0xC5
#define UBRR0L 0xC4
#define UCSR0C 0xC2
#define UCSR0B 0xC1
#define UCSR0A 0xC0
#define UDR0_TXB UDR0 /* transmit data buffer register */
#define UDR0_RXB UDR0 /* receive data buffer register */
#define TXB80 0
#define RXB80 1
#define UCSZ02 2
#define TXEN0 3
#define RXEN0 4
#define UDRIE0 5
#define TXCIE0 6
#define RXCIE0 7
#define MPCM0 0
#define U2X0 1
#define UPE0 2
#define DOR0 3
#define FE0 4
#define UDRE0 5
#define TXC0 6
#define RXC0 7
#define UCPOL0 0
#define UCSZ00 1
#define UCSZ01 2
#define USBS0 3
#define UPM00 4
#define UPM01 5
#define UMSEL00 6
#define UMSEL01 7
/******************************/
# define sei() __asm__ __volatile__ ("sei" ::)
# define cli() __asm__ __volatile__ ("cli" ::)
/* vectors in AVR are hard cided to a function by name */
extern void __vector_23 (void) __attribute__ ((interrupt));
/* interrupt is disabled at initilization */
extern void __vector_11 (void) __attribute__ ((interrupt));
/*******ADDR_MULTIPLIER********/
#define ADDR_MULTIPLIER 1
/*******Type Declaration*******/
#define UINT unsigned int
#define P_CHAR volatile unsigned char *
/***LEDs ON-OFF Declaration****/
#define LED_ON 0x00
#define LED_OFF 0xff
#endif
如果有人能帮助我解决这个难题,我将非常感激,因为我已经严重淹没在它之下。
提前致谢。
最佳答案
嗯,检查整个代码有点困难,它很长,当然 AVR 上可能设置了很多不好的东西......
我认为你应该首先删除所有 LED 的代码,然后单独尝试 UART 记录器,直到它工作为止。
我唯一看到的是你所做的:
无符号字符TX = EEPROM_read(uiAdd++);
但你没有将 uiAdd 设置为从 0 开始...
无论如何,我不确定,因为很难遵循程序流程。
关于c - 将字符存储在 EEPROM 中并回显,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4322831/
我正在运行一个辅助角色,并检查 Azure 上托管的存储中是否存在数据。当我将连接字符串用于经典类型的存储时,我的代码可以正常工作,但是当我连接到 V2 Azure 存储时,它会抛出此异常。 “远程服
在我的应用程序的主页上,我正在进行 AJAX 调用以获取应用程序各个部分所需的大量数据。该调用如下所示: var url = "/Taxonomy/GetTaxonomyList/" $.getJSO
大家好,我正在尝试将我的商店导入我的 Vuex Route-Gard。 路由器/auth-guard.js import {store} from '../store' export default
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我的 Windows 计算机上的本地文件夹中有一些图像。我想将所有图像上传到同一容器中的同一 blob。 我知道如何使用 Azure Storage SDKs 上传单个文件BlockBlobServi
我尝试发出 GET 请求来获取我的 Azure Blob 存储帐户的帐户详细信息,但每次都显示身份验证失败。谁能判断形成的 header 或签名字符串是否正确或是否存在其他问题? 代码如下: cons
这是用于编写 JSON 的 NeutralinoJS 存储 API。是否可以更新 JSON 文件(推送数据),而不仅仅是用新的 JS 对象覆盖数据。怎么做到的??? // Javascript
我有一个并行阶段设置,想知道是否可以在嵌套阶段之前运行脚本,所以像这样: stage('E2E-PR-CYPRESS') { when { allOf {
我想从命令行而不是从GUI列出VirtualBox VM的详细信息。我对存储细节特别感兴趣。 当我在GUI中单击VM时,可以看到包括存储部分在内的详细信息: 但是到目前为止,我还没有找到通过命令行执行
我有大约 3500 个防洪设施,我想将它们表示为一个网络来确定流动路径(本质上是一个有向图)。我目前正在使用 SqlServer 和 CTE 来递归检查所有节点及其上游组件,只要上游路径没有 fork
谁能告诉我 jquery data() 在哪里存储数据以及何时删除以及如何删除? 如果我用它来存储ajax调用结果,会有性能问题吗? 例如: $("body").data("test", { myDa
有人可以建议如何为 Firebase 存储中的文件设置备份。我能够备份数据库,但不确定如何为 firebase 存储中的文件(我有图像)设置定期备份。 最佳答案 如何进行 Firebase 存储的本地
我最近开始使用 firebase 存储和 firebase 功能。现在我一直在开发从功能到存储的文件上传。 我已经让它工作了(上传完成并且文件出现在存储部分),但是,图像永远保持这样(永远在右侧加载)
我想只允许用户将文件上传到他们自己的存储桶中,最大文件大小为 1MB,仍然允许他们删除文件。我添加了以下内容: match /myusers/{userId}/{allPaths=**} { al
使用生命周期管理策略将容器的内容从冷访问层移动到存档。我正在尝试以下策略,希望它能在一天后将该容器中的所有文件移动到存档层,但事实并非如此在职的。我设置了选择标准“一天未使用后”。 这是 json 代
对于连接到 Azure 存储端点,有 http 和 https 两个选项。 第一。 https 会带来开销,可能是 5%-10%,但我不支付同一个数据中心的费用。 第二。 http 更快,但 Auth
有人可以帮我理解这一点吗?我创建了Virtual Machine in Azure running Windows Server 2012 。我注意到 Azure 自动创建了一个存储帐户。当我进入该存
我是一名优秀的程序员,十分优秀!