- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 C 语言的初学者。我正在尝试写入和读取外部 eeprom (AT24c02B),然后将 eeprom 中存储的数据字节显示到 PORTB 中的 LED 和/或 LCD。所以我知道数据成功存储在eeprom中。
PORTB 中的 LED 低电平有效。
这是代码,我从 cvAVR 帮助中得到它:
#include <mega16a.h>
// Alphanumeric LCD functions
#include <alcd.h>
// Declare your global variables here
// TWI functions
#include <twi.h>
#include <delay.h>
/* 7 bit TWI bus slave address of the AT24C02B 2kbyte EEPROM */
#define EEPROM_TWI_BUS_ADDRESS (0xA0 >> 1)
void main(void)
{
// Declare your local variables here
struct
{
struct
{
unsigned char msb;
unsigned char lsb;
} addr;
unsigned char data;
} twi_eeprom;
unsigned char eeprom_rd_data;
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRA=(1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) | (1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// Port B initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=1 Bit6=1 Bit5=1 Bit4=1 Bit3=1 Bit2=1 Bit1=1 Bit0=1
PORTB=(1<<PORTB7) | (1<<PORTB6) | (1<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (1<<PORTB0);
// TWI initialization
// Mode: TWI Master
// Bit Rate: 100 kHz
twi_master_init(100);
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);
// Global enable interrupts
#asm("sei")
/* write the byte 0x55 to the AT24C02B EEPROM address 0x210 */
twi_eeprom.addr.msb=0x02;
twi_eeprom.addr.lsb=0x10;
twi_eeprom.data=0x55;
twi_master_trans(EEPROM_TWI_BUS_ADDRESS,(unsigned char *) &twi_eeprom,3,0,0);
/* 10ms delay to complete the write operation */
delay_ms(10);
/* read the byte back into the eeprom_rd_data variable */
twi_master_trans(EEPROM_TWI_BUS_ADDRESS,(unsigned char *) &twi_eeprom,2,&eeprom_rd_data,1);
while (1)
{
// Place your code here
PORTB = ; //What variable should I call?
delay_ms(3000);
}
}
twi.h
/******************************************************************************
TWI driver library for the CodeVisionAVR C V2.05.1+ Compiler
Copyright (C) 2010-2011 Pavel Haiduc, HP InfoTech S.R.L., All rights reserved.
*******************************************************************************/
#ifndef _TWI_INCLUDED_
#define _TWI_INCLUDED_
#include <stdbool.h>
// TWI transaction result values
#define TWI_RES_OK 0
#define TWI_RES_BUFFER_OVERFLOW 1
#define TWI_RES_ARBITRATION_LOST 2
#define TWI_RES_BUS_ERROR 3
#define TWI_RES_NACK_RECEIVED 4
#define TWI_RES_BUS_TIMEOUT 5
#define TWI_RES_FAIL 6
#define TWI_RES_UNKNOWN 7
extern unsigned char twi_tx_index; // data index in the transmit buffer
extern unsigned char twi_rx_index; // data index in the receive buffer
extern unsigned char twi_result; // holds the result of the last TWI transaction
// TWI master initialization
// bit_rate - SCL bit rate [kHz]
void twi_master_init(unsigned int bit_rate);
// function used for performing a TWI master transaction
// slave_addr - 7 bit address of the TWI slave with which the transaction must be performed
// tx_data - pointer to the buffer that holds the data to be transmitted to the slave
// tx_count - number of bytes that must be transmitted to the slave during the transaction
// rx_data - pointer to the buffer that holds the data received from the slave
// rx_count - number of bytes that must be received from the slave during the transaction
// returns true on success
bool twi_master_trans(
unsigned char slave_addr,
unsigned char *tx_data, unsigned char tx_count,
unsigned char *rx_data, unsigned char rx_count);
// TWI slave initialization
// match_any_addr - if true, the slave match address logic responds to all received addresses
// addr - 7 bit address of the TWI slave
// rx_buffer - pointer to the slave receive buffer
// rx_buffer_size - size of the slave receive buffer
// tx_buffer - pointer to the slave transmit buffer
// slave_rx_handler - pointer to the TWI slave receive processing function
// slave_tx_handler - pointer to the TWI slave transmit processing function
void twi_slave_init(
bool match_any_addr,
unsigned char addr,
unsigned char *rx_buffer,
unsigned char rx_buffer_size,
unsigned char *tx_buffer,
bool (*slave_rx_handler)(bool rx_complete),
unsigned char (*slave_tx_handler)(bool tx_complete)
);
#pragma library twi.lib
#endif
我想问的是:
1. 写入eeprom后,我应该调用什么变量来显示8个LED上的字节?
ex: after writing bytes: 0xF0, then LED in PORTB will be 0xF0 (11110000)
twi_master_trans(EEPROM_TWI_BUS_ADDRESS,(unsigned char *) &twi_eeprom,3,0,0);
twi_master_trans(EEPROM_TWI_BUS_ADDRESS,(unsigned char *) &twi_eeprom,2,&eeprom_rd_data,1);
有人可以解释一下吗? &twi_eeprom,3,0,0
的实际含义是什么?
设备:Atmega16a
程序:Codevision AVR 3.12
外部EEPROM:AT24c02b
任何答案和评论将不胜感激。
谢谢,请原谅我的英语。
伊平
最佳答案
TWI 是一种从主设备到从设备双向传输数据的方法。在您的情况下,您的代码在主机上运行,而 EEPROM 是从机。数据同时在设备之间移动。也就是说,一个字节传输到从机的同时还有一个字节从从机传回。
twi.h 中给出的函数描述了启动此过程的方法,并且其中描述了参数。
unsigned char slave_addr,
unsigned char *tx_data,
unsigned char tx_count,
unsigned char *rx_data,
unsigned char rx_count
第一个参数是代码中给定的常量。
接下来的两个参数是要从中获取数据的缓冲区的地址以及要获取的长度。
接下来的两个是放入接收到的数据的缓冲区的地址和长度。
要将0x55
写入EEPROM的特定地址,您需要向EEPROM发送三个字节。这些已为您安排在一个结构中。如果您向函数提供结构体的地址和长度 3,该函数将为您处理它。 (unsigned char *) &twi_eeprom
是结构体的地址。
您现在不关心接收,因此只需输入 0 和 0 作为要接收的地址和长度。
读回该值时,只需将该字节的地址发送到EEPROM即可。因此发送相同的结构,但只有两个字节。您还需要保存接收到的字节。它将进入变量eeprom_rd_data
,因为您将该变量的地址传递给了函数。将 PORRTB 设置为等于 eeprom_rd_data
以显示其值。
关于Codevision AVR 使用 TWI 访问外部 eeprom 24c02B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30416578/
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
CodevisionAVR 获取一个.c 文件并生成.hex 和.o 输出。 是否也可以从中生成 .asm 文件? 最佳答案 根据这个CodeVisionAVR tutorial , 当您按下工具栏上
我正在尝试使用 USART 通信接收和发送数据,我使用的是 atmega16。我在 PC 中创建了一个程序来将字符串发送到 micro,如果字符串匹配,micro 将激活 adc 并将 adc 数据发
我是 C 语言的初学者。我正在尝试写入和读取外部 eeprom (AT24c02B),然后将 eeprom 中存储的数据字节显示到 PORTB 中的 LED 和/或 LCD。所以我知道数据成功存储在e
在许多语言中,例如java,c#,...,我们使用 //region Variables . . . //endregion 用于类别代码。我们在 CodeVision 编辑器中使用“
在下面您可以看到我用 Codevision(C 语言)编写的整个程序。当我想编译它时,我收到一些关于 Switch block 的错误!我很确定我的 block 的形式是正确的!你能看一看吗? ***
我有一个设置为 CodeVision AVR 项目的遗留代码。我想迁移到 AVR Studio 甚至更好的 NetBeans(使用 AVR 工具链或 WinAVR)。 有什么想法吗? 最佳答案 你应该
我是一名优秀的程序员,十分优秀!