⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lab5_small.c

📁 C++ Source code for writing custom characters on an LCD using ATMEGA16 microcontroler.
💻 C
字号:
// Laborator PM 5 - Accesul la o memorie seriala (externa) prin interfata TWI

#include <util/twi.h>
#include <stdio.h>
#include <string.h>

#include "uart.h"

#define SLAVE_ADDRESS   0xA0            // adresa i2c a memoriei

// Functii pentru TWI /////////////////////////////////////////////////////////
uint8_t twst;

void twi_init(void)
{
    TWSR = 0;
    TWBR = (16000000UL / 100000UL - 16) / 2;

	twst = 0;
}

// trimite un start condition
void twi_send_start(void)
{
    TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);
}

// trimite un repeated start condition
void twi_send_rep_start(void)
{
    TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);
}

// trimite un stop condition
void twi_send_stop(void)
{    
	TWCR = (1<<TWINT)|(1<<TWEN)| (1<<TWSTO);
}

// asteapta pana cand slave'ul reactioneaza
void twi_wait_transmit(void)
{
    while( (TWCR & (1<<TWINT) ) == 0 ) // TODO - cand este gata interfata - vezi tutorial
	{}
}
 
// porneste transmisia unui byte
void twi_start_transmit(void)
{
    TWCR = (1<<TWINT) | (1<<TWEN); // TODO - vezi tutorial
}


// Functii pentru accesul la memoria EEPROM ///////////////////////////////////
 
// citeste len bytes de la adresa eeaddr si ii pune in buf
void eeprom_read( uint16_t eeaddr, uint8_t *buf )
{
    uint8_t sla;
    
    // bitii mairi in sla. transmisi tarziu
	// + 1 eeadress bit (bitul de adresa A8 care nu incape in byte-ul urmator)
    sla = SLAVE_ADDRESS | (((eeaddr >> 8) & 0x07) << 1);

	// START
	    twi_send_start();
	    twi_wait_transmit();
	    // get TW_STATUS 

	////// Send HEADER_WRITE
		    TWDR = sla & ~(1); // TODO - headerul contine sla si bitul R/W = ?
		    twi_start_transmit();
		    twi_wait_transmit(); 
			// get TW_STATUS

	////// Send ADDRESA	(A7, A6..... A0 )
		    TWDR = eeaddr;          
		    twi_start_transmit();
		    twi_wait_transmit() ;
			// get TW_STATUS
	
	// START
	    twi_send_rep_start(); 
	    twi_wait_transmit();
		// get TW_STATUS    
	
	////// Send HEADER_READ
			TWDR = sla | 1; // TODO - headerul contine sla si bitul R/W = ?
		    twi_start_transmit();
		    twi_wait_transmit();
			// get TW_STATUS    

	////// Get primul byte de date de la memorie
		    TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWEA); // se trimite si Ack dupa receptie
		    twi_wait_transmit(); 
			// get TW_STATUS
			buf[0] = TWDR;
			
	////// Get al doilea byte de date de la memorie
		    TWCR = (_BV(TWINT) | _BV(TWEN)) & (~(1<<TWEA)); // TODO - send NoACK la sfarsit		
		    twi_wait_transmit(); 
			// get TW_STATUS
			buf[1] = TWDR;
        
	// START
		twi_send_stop();
}


// Main Function //////////////////////////////////////////////////////////////
int main(void)
{
    char bytes[64];

	twi_init();
      
    eeprom_read( 0, (unsigned char*)bytes );

	for(;;);

    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -