Zdravím kolegové,
začínám s AVR v CodeVision a snažím se rozchodit teplotní čidlo TMP100 od texas instruments komunikující pomocí I2C. Čidlo je připojeno na ATmega32, ke které je připojen LCD displej a na I2C sběrnici společně s čidlem ještě EEPROM 24LC16. V EEPROM jsou uložené znaky abecedy, které se vypisují na LCD (slouží to pouze pro ověření že I2C sběrnice komunikuje). Problém je ale když chci komunikovat s čidlem, nějak z toho nemůžu dostat tu hodnotu teploty na LCD (teplota se musí podle datasheetu přepočítat ale to zatím není třeba, nejde mi vytáhnout to binární slovo a nějak jej zobrazit na LCD). Přikládám tedy ještě zdroják, snad si s tím někdo bude vědět rady, já totiž nevím jestli číslo, které posílám na LCD není moc vysoké a proto se na LCD zobrazuje celý znak 8x5bodů nebo jestli to I2C vůbec nefunguje. Nevím jak to převést aby to na tom LCD zobrazovalo převedenou binární hodnotu do desítkového čísla, příkaz lcd_putchar(); mi bere pouze bin a pomocí funkce itoa to převést zase nejde.
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 1.11.2010
Author : NeVaDa
Company :
Comments:
Chip type : ATmega32
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*****************************************************/
#include <mega32.h>
#include <delay.h>
#include <stdlib.h>
#include <bcd.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x1B ;PORTA
.equ __sda_bit=7
.equ __scl_bit=0
#endasm
#include <i2c.h>
unsigned char d;
unsigned char t1;
unsigned char t2;
int i;
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// I2C Bus initialization
i2c_init();
// LCD module initialization
lcd_init(20);
lcd_gotoxy(0,0);
for(i=0;i<32;i++)\\Výpis dat z EEPROM na LCD (funguje)
{
i2c_init();
i2c_start();
i2c_write(0xA0);
i2c_write(i);
i2c_start();
i2c_write(0xA1);
d=i2c_read(0);
i2c_stop();
lcd_putchar(d);
};
while (1)
{
i2c_init();
i2c_start();
i2c_write(0x9C); \\Adresa čidla je 9C pro zápis
i2c_write(0x00); \\Výběr registru s hodnotou teploty
i2c_write(0x9D); \\Adresa čipu pro čtení (9D)
t1=i2c_read(0); \\Uložení MSB slova
t2=i2c_read(0); \\Uložení LSB slova
i2c_stop();
lcd_gotoxy(15,2);
lcd_putchar(t1); \\Zde se rozsvítí celý znak
lcd_gotoxy(15,3);
lcd_putchar(t2); \\Zde se rozsvítí celý znak
lcd_gotoxy(0,3);
lcd_puts("Teplota:");
delay_ms(100);
// Place your code here
};
}
Díky za rady
Fórum › Mikrokontroléry
Teplotní čidlo TMP100 a CodeVision AVR - help
i2c_init();
i2c_start();
i2c_write(0x9C); \\Adresa čidla je 9C pro zápis
i2c_write(0x00); \\Výběr registru s hodnotou teploty
i2c_write(0x9D); \\Adresa čipu pro čtení (9D)
t1=i2c_read(0); \\Uložení MSB slova
t2=i2c_read(0); \\Uložení LSB slova
i2c_stop();
Myslím že má být
i2c_init();
i2c_start();
i2c_write(0x9C); \\Adresa čidla je 9C pro zápis
i2c_write(0x00); \\Výběr registru s hodnotou teploty
i2c_start();
i2c_write(0x9D); \\Adresa čipu pro čtení (9D)
t1=i2c_read(1); \\Uložení MSB slova ACK
t2=i2c_read(0); \\Uložení LSB slova NACK
i2c_stop();
Pak oba bajty sloučit do wordu, pomocí itoa() převést na string a zobrazit.
Zjistit počet nových příspěvků
Přidej příspěvek
Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 7 hostů
Podobná vlákna
Teplotní čidlo - jak na něj — založil stibi
Codevision attiny25 a externí prerušení — založil Ochy
AVR Toolchain 3.3.0 + AVR studio + ATTiny26 - mala rada — založil xhans69
Avr a C — založil pali6
LCD + AVR — založil Systém
Moderátoři diskuze