من با استفاده از توابع i2c یک برنامه نوشته ام که رجیستر 1 یک slave را میخونه و روی lcd به وسیله مگا 16 نمایش می ده.وهمین برنامه را به وسیله twi هم نوشته ام. جوابی که باید بگیرم این است که با ید با خوندن رجیستر slave که یک بایت است عدد از 0تا 255 را بگیرم . ولی در برنامه ای که با توابع i2c نوشته ام به جای 0تا 255 اعداد 128تا 255 را می گیرم .ولی در برنامه ای که با twi نوشته ام جواب درست رامی گیرم.
من هر دوی این برنامه ها را در ادامه آوردم واز دوستانی که با i2c آشنا هستند می خواهم که ببینند آیا این برنامه مشکلی دارد یا نه.وسوال دیگر این است که فرکانس i2c در این کار باید 100 کیلو هرتز باشد آیا این فرکانس در کد ویژن خودکار تعریف میشه (البته این فرکانس با فرکانس اصلی میکرو که 4 مگا هست فرق می کنه) . دو برنامه هم به این صورت هستند که من تو ضیحاتی را هم که خودم فهمیده ام را دربرنامه نوشته ام واگر اشتباهی دارد بگویید . باتشکر
[/code]
من هر دوی این برنامه ها را در ادامه آوردم واز دوستانی که با i2c آشنا هستند می خواهم که ببینند آیا این برنامه مشکلی دارد یا نه.وسوال دیگر این است که فرکانس i2c در این کار باید 100 کیلو هرتز باشد آیا این فرکانس در کد ویژن خودکار تعریف میشه (البته این فرکانس با فرکانس اصلی میکرو که 4 مگا هست فرق می کنه) . دو برنامه هم به این صورت هستند که من تو ضیحاتی را هم که خودم فهمیده ام را دربرنامه نوشته ام واگر اشتباهی دارد بگویید . باتشکر
کد:
#include <mega16.h> #include <stdio.h> #include <stdlib.h> // I2C Bus functions #asm .equ __i2c_port=0x12 ;PORTD .equ __sda_bit=0 .equ __scl_bit=1 #endasm #include <i2c.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x18 ;PORTB #endasm #include <lcd.h> char s[21]; void main(void) { // I2C Bus initialization i2c_init(); // LCD module initialization lcd_init(16); while (1) { unsigned char h; unsigned int h; lcd_gotoxy(0,0); i2c_start(); i2c_write(0xC0); i2c_write(1); i2c_start(); i2c_write(0xC1); h=i2c_read(0); i2c_stop(); sprintf(s,"C = %3d.%d\xDF",h/10,h%10); lcd_puts(s); [code/][/left] [font=Verdana] برنامه دوم: : [/font] [code] #include <mega16.h> #include <stdio.h> #include <stdlib.h> #include <lcd.h> #asm .equ __lcd_port=0x1B ;PORTA #endasm unsigned int i2c_readf(char ,char ); char s[21]; void main(void) { unsigned int angle=0; TWBR=0x0C; فرکانس برابر 100کیلو هرتز با پالس ساعت 4 مگا هرتز lcd_init(16); while(1) { angle = i2c_readf(0xC0,1) <<8; sprintf(s,"degree=%3d.%d\xDF",angle/10,angle%10); lcd_gotoxy(0,0); lcd_puts(s); } } unsigned int i2c_readf(char address, char reg) { char read_data = 0; TWCR = 0xA4; فرستاده می شود STARTشرط TWSTAو TWENدراین دستور با یک کردن بیتهای while(!(TWCR & 0x80)); یک شودTWINT منتظرمیشود تا پرچم TWDR = address; ریخته میشود TWDR آدرس در TWCR = 0x84; رایک میکند تا ارسال ادرس اغاز شودTWINTبیت while(!(TWCR & 0x80)); یک شودTWINT منتظرمیشود تا پرچم TWDR = reg; می ریزد TWDRشماره رجیستری که میخواهیم از ان بخوانیم رادر TWCR = 0x84; رایک میکند تا ارسال ادرس اغاز شودTWINTبیت while(!(TWCR & 0x80)); یک شودTWINT منتظرمیشود تا پرچم TWCR = 0xA4; فرستاده می شود STARTشرط TWSTAو TWENدراین دستور با یک کردن بیتهای while(!(TWCR & 0x80)); یک شودTWINT منتظرمیشود تا پرچم TWDR = address+1; ریخته میشود TWDRآدرس که بیت اخرش یک شده در while(!(TWCR & 0x80)); یک شودTWINT منتظرمیشود تا پرچم TWCR = 0x84; رایک میکند تا ارسال ادرس اغاز شودTWINTبیت while(!(TWCR & 0x80)); یک شودTWINT منتظرمیشود تا پرچم read_data = TWDR; را درون متغیر می ریزدTWDR داده های TWCR = 0x94; TWSTOوTWENوTWINTبایک کردن بیتهای STOPفرستادن return read_data; داده متغیر را برمی گرداند }
دیدگاه