AVR, I2C, čtení 3. nižší data byte

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

AVR, I2C, čtení 3. nižší data byte

Príspevok od používateľa DanielK » 02 Apr 2020, 22:58

Ahoj, laboruji s AVR a externím ADC (MCP3425) s komunikací po I2C. Ale nevím jak po přečtení vyššího data byte zapsat NAK a číst nižší data byte, a přičíst ho k vyššímu data byte.

Zatím se zdá, že přečtu jen vyšší byte a generuji NAK a pak zase znovu. Hodnotu zapisuji do proměnné.

Musím do TWCR zapsat TWEA ten generuje ACK pak přečíst data a generovat NAK?
Díky za pomoc.

část kodu

Kód: Vybrať všetko

char i2c_read(){
	TWCR = (1<<TWEN) | (1<<TWINT);      // povolení I2C, příznak přerušení
 	while (!(TWCR & (1<<TWINT)));	        // čeká na přečtení všech dat
  	return TWDR;                                          
}
int main (void){
...
        hodnota = i2c_read();
...
}
Prílohy
Snímek obrazovky pořízený 2020-04-02 21-55-30.png
0

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

Re: AVR, I2C, čtení 3. nižší data byte

Príspevok od používateľa DanielK » 05 Apr 2020, 18:13

Podařilo se mi generovat start; ACK; NAK; stop, ale data které ukládám do promněné nejsou správná. Konkrétně data ukládaná do hodnota1, LCD nic nevypisuje. Data ukládaná do hodnota jsou správná čítají od 0 do 255 a pak přetečou. Dokonce i dle I2C dekoderu je to správně.
Poradí mi někdo, kde mám chybu?

Kód: Vybrať všetko

#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>  
#include <avr/interrupt.h>
#include <stdlib.h>  
#include <stdio.h>  
#include "lcd.h" 
#include <avr/eeprom.h>
#include <util/twi.h>

char text[20] = {0,}; 					// pocet charakteru na radku LCD



// inicializace I2C
void i2c_init()
{
	TWBR = 0x62;					// nastaveni frekvence I2C
	TWCR = (1<<TWEN);				//povoleni I2C
	TWSR = 0x00;					//preddelicka
}


//I2C start
void i2c_start()
{
	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);	// start
	while (!(TWCR & (1<<TWINT)));			// pockej dokud start nebude dokonceny
}

//I2C write
void i2c_write(char x)
{
	TWDR = x;
	TWCR = (1<<TWINT) | (1<< TWEN);			// zapis hex hodnoty 
	while (!(TWCR & (1<<TWINT)));			// pockej dokud zapis nebude dokonceny
} 

//I2C read
int i2c_read()
{
	TWCR=(1<<TWEN)|(1<<TWINT);			// cti data a generuj NAK
	while (!(TWCR & (1<<TWINT)));			// pockej dokud cteni nebude dokonceny
	return TWDR;					// prectena hodnota 
}

//I2C ack + read
int i2c_readack()
{
	TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWEA);		//  cti data a generuj ACK
	while (!(TWCR & (1<<TWINT)));			// pockej dokud cteni nebude dokonceny
	return TWDR;					// prectena hodnota 
}


// I2C stop 
void i2c_stop()			
{
    TWCR=(1<<TWSTO)|(1<<TWINT)|(1<<TWEN);		// generuj stop 
    while(TWCR&(1<<TWSTO));				// cekej na stop 
}



int main (void) {



	lcd_init(LCD_DISP_ON); 				// inicializace LCD

	uint16_t hodnota;				//promena pro ulozeni hodnoty
	uint16_t hodnota1;	
	
	i2c_init();					// inicializace I2C


	sei(); 						// povolení globálního přerušení
	
	
	while(1){
	 
		i2c_start();				// start
		i2c_write(0xD7);			// zapis device code (1101), address bit(011), + write(1)
		hodnota1=i2c_readack();			// precte data a generuje ACK
		hodnota = i2c_read();			// precte data a generuje NAK
		i2c_stop();				// stop


		lcd_gotoxy(0,0);
		sprintf(text,"");
		lcd_puts(text);
		sprintf(text,"h:%d           ",hodnota);
		lcd_puts(text);

		lcd_gotoxy(0,1);
		sprintf(text,"");
		lcd_puts(text);		
		sprintf(text,"h1:            ",hodnota1);
		lcd_puts(text);

		lcd_gotoxy(0,2);
		sprintf(text,"");
		lcd_puts(text);		
		sprintf(text,"line3");
		lcd_puts(text);

		lcd_gotoxy(0,3);
		sprintf(text,"");
		lcd_puts(text);		
		sprintf(text,"line4");
		lcd_puts(text);

	}
}
Prílohy
1.png
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: AVR, I2C, čtení 3. nižší data byte

Príspevok od používateľa peterple » 05 Apr 2020, 18:27

Kód: Vybrať všetko

sprintf(text,"h1:            ",hodnota1);
chýba ti tam formatovací znak pre hodnota1. Napr %d ako to máš v prvom výpise
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

Re: AVR, I2C, čtení 3. nižší data byte

Príspevok od používateľa DanielK » 05 Apr 2020, 19:24

No jo. Díky, už to jede.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok