ايران ويج

نسخه‌ی کامل: راه اندازی LCD با ATMEGA16 or 32
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام.
من فکر کنم تا حالا 5 6 تا پروژه برای راه اندازی ال سی دی 2 در 16 با ای تی مگا 16 یا 32 از اینترنت و جای دیگه گرفتم. مدارشونو می بندم برنامه ریزی هم میکنم. ال سی دی روشن میشه ولی هیچ چی روش نمینویسه.
یکیش همین لینکه
میشه یه پروژه معرفی کنید بعد یه خورده هم مفصل روش توضیح بدید.
راستی اگه تو مدارای ای وی آر بجای کریستال ذکر شده کریستال با مقدار دیگه بذاری چه تاثیری داره؟ مثلا 4 مگا بجای 12 مگا
دستان پر توان برس به داد این ناتوان اینم از گجت.....
تنک یو
سلام دوست عزیز ...

برای کار با lcd اول باید lcd به میکرو معرفی کنید و پایه های اون به میکرو معرفی کنید و همین طور نوع اون که از چه مدلی استفاده می کنید

کد:
معرفی پایه های lcd
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6
معرفی نوع lcd
Config Lcd = 16 * 2

بعد ار این می توانید با تایپ کردن دستور
کد:
LCD "welcom"
یک متن یا رشته یا یک متغیر یه کارکتور را نمایش بدی

پیشنهاد می کنم قبل از هر دستوری از cls برای پاک کردن صفحه نمایش lcd استفاده کنید

اخر سر هم حتما اتصال های بین میکرو و lcd حتما تست کن ببین درست بر قرار هست بهتر از یک پتانسیو متر برای تنظیم نور lcd استفاده کنی

اینم یک برنامه ساده برای کار

کد:
$regfile = "m8def.dat"
$crystal = 16000000

'lcd
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = _
Pind.5 , E = Pind.1 , Rs = Pind.0
Config Lcd = 16 * 2

Dim A As Integer , B As Single

Cls

Lcd "welcom"
Locate 2 , 2

A = 10
B = 11
B = A + B
Lcd "a + b =",B

End 'end program

درمورد کریستال : باید از همون کریستال استفاده کنی یا با دستور
Config Clockdiv = x
مقدار کریستال بدست بیاری
مقدار x می تونه : 1 , 2 , 4 , 8 ,16 , 32 ,64 , 128 , 256 باشه


اینم نحوه اتصال به میکرو
[تصویر:  oj5mc5ew8v4f68lhaab.png]

سلام
شما اون پتانسیومتر رو وصل کردی؟
اگه وصل کردی آیا باهاش بازی میکنی؟منظورم اینه که کم و زیادش میکنی؟
آخه اون پتانسیومتر برای تغییر کنتراست کارکترهاست . با چرخوندن پتانسیومتر میتونی کارکتر هاتو محو یا تاریک تاریک کنی.
نقل قول: اخر سر هم حتما اتصال های بین میکرو و lcd حتما تست کن ببین درست بر قرار هست بهتر از یک پتانسیو متر برای تنظیم نور lcd استفاده کنی
اگه از سالم بودن lcd مطمئنی به توصیه آقای h0x00i گوش کن در چون اگه مقدار پتناسیومتر تنظیم کنتراست درست نباشه و یا اصلا وجود نداشته باشه صفحه به صورت خالی نمایش داده میشه. اگر هم نشد که احتمالا lcd شما مشکل داره ...
راستی یادم رفته بود تغییر کریستال تو این برنامه ها فقط سرعت کار رو تغییر میده.
نکته: نا گفته نماند که اگه شما جایه کریستال 1مگ یه کریستال 16مگ استفاده کنی برنامه دیگه کار نمیکنه چون توابع lcd از کریستال 1 مگ برای محاسبه زمانهای تاخیر استفاده کردن که این باعث میشه با کریستال 16مگ lcd دیگه پاسخ گو نباشه
آقا خیلی متشکر راستی من این برنامه ای که دادید رو توی bascom avr اجرا و کامپایل کنم؟
من atmega 8 ندارم اگه همین کد رو که دادید تو atmega16a چه تغییری میکنه؟
آخه اگه اون لینکی که بالا نوشتم رو ببینیند . من بردم توی winavr و موقع make allتوی برنامه programmers notepad خطا داد که متغیر ctrl نمیشناسه منم بالای کدها بعد از هدرها نوشتم int ctrl=0
بعد کامپایل شد. ولی گفتم ال سی دی روشن میشه حتی تموم خونه های سطر اولش هم به صورت نقطه چین در میومد ولی اون کلمه A رو نشون نمیداد.




(۱۰-آبان-۱۳۹۰, ۱۵:۵۵:۳۴)parviz2012 نوشته است: [ -> ]آقا خیلی متشکر راستی من این برنامه ای که دادید رو توی bascom avr اجرا و کامپایل کنم؟
من atmega 8 ندارم اگه همین کد رو که دادید تو atmega16a چه تغییری میکنه؟
آخه اگه اون لینکی که بالا نوشتم رو ببینیند . من بردم توی winavr و موقع make allتوی برنامه programmers notepad خطا داد که متغیر ctrl نمیشناسه منم بالای کدها بعد از هدرها نوشتم int ctrl=0
بعد کامپایل شد. ولی گفتم ال سی دی روشن میشه حتی تموم خونه های سطر اولش هم به صورت نقطه چین در میومد ولی اون کلمه A رو نشون نمیداد.

بله دوست عزیز توسط بسکام کامپایل کنید

وه به جای
کد:
$regfile = "m8def.dat"
بنویسید
کد:
$regfile = "m16def.dat"
پس چرا این تو codevision جواب نمیده؟
یه بررسی کن بی زحمت.
کد:
کد:
#include <mega16.h>
#include <lcd.h>
#include <stdio.h>
#define xtal 8000000

#asm
.equ __lcd_port=0x1B ;PORTA
#endasm

unsigned char second, minute,hour;
unsigned char lcd_buff[10];

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
if(second==59)
{
second=0;
if(minute==59)
{
minute=0;
if(hour==24)
hour=0;
else
hour++;
}
else
minute++;
}
else
second++;

sprintf(lcd_buff,"Time = %d:%d:%d",hour, minute, second);
lcd_clear();
lcd_puts(lcd_buff);
}

// Declare your global variables here


void main(void)
{

// Timer/Counter 2 initialization
// Clock source: TOSC1 pin
// Clock value: PCK2/128
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;

lcd_init(16);

#asm("sei") // Global enable interrupts

while (1);

}

و عکس مدارش در پیوست البته من به ال سد دی 5 ولت میدم ولی بازم گفتم یه سطر کلا خونه هاش روشن میشه و چیزی نمینویسه.
سلام

اگه از سخت افزارش مطمئني ، اين برنامه رو تست كن . من هميشه براي نشون دادن متغيير تو ال سي ذي كاركتري از اين روش استفاده ميكنم .
کد:
#include <mega16.h>

// Alphanumeric LCD functions
#include <lcd.h>
#include <stdlib.h>
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm



unsigned int second, minute,hour;
unsigned char *a;

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
hour=0;
}
}
lcd_gotoxy(0,0);
lcd_putsf("Time=");
itoa(hour,a);
if(hour<10)
lcd_putsf("0");
lcd_puts(a);
lcd_putsf(":");
itoa(minute,a);
if(minute<10)
lcd_putsf("0");
lcd_puts(a);
lcd_putsf(":");
itoa(second,a);
if(second<10)
lcd_putsf("0");
lcd_puts(a);
}


void main(void)
{

// 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=0xFF;


// Timer/Counter 2 initialization
// Clock source: TOSC1 pin
// Clock value: PCK2/128
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;



lcd_init(16);

// Global enable interrupts
#asm("sei")

while (1);
}
فايل شبيه سازيشم اينجا گذاشتم .
با عرض سلام و خسته نباشید
من یه ال سی دی گرافیکی ks1080p و متاسفانه یه چند ثانیه کل مدار رو با 12 ولت روشن کردم میکروم که atmega32 بود سوخت و ال سی دی هم کار نمی کنهبا ینکه یه سری قطعات پشت ال سی دی هست آیا میشه اون رو دوباره تعمیر و راه اندازی کرد و یا تستی برای این ال سی دی ها وجود دارد.
با تشکر
(۱۲-آبان-۱۳۹۰, ۰۳:۳۱:۳۳)parviz2012 نوشته است: [ -> ]پس چرا این تو codevision جواب نمیده؟
یه بررسی کن بی زحمت.
کد:
کد:
#include <mega16.h>
#include <lcd.h>
#include <stdio.h>
#define xtal 8000000

#asm
.equ __lcd_port=0x1B ;PORTA
#endasm

unsigned char second, minute,hour;
unsigned char lcd_buff[10];

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
if(second==59)
{
second=0;
if(minute==59)
{
minute=0;
if(hour==24)
hour=0;
else
hour++;
}
else
minute++;
}
else
second++;

sprintf(lcd_buff,"Time = %d:%d:%d",hour, minute, second);
lcd_clear();
lcd_puts(lcd_buff);
}

// Declare your global variables here


void main(void)
{

// Timer/Counter 2 initialization
// Clock source: TOSC1 pin
// Clock value: PCK2/128
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;

lcd_init(16);

#asm("sei") // Global enable interrupts

while (1);

}

و عکس مدارش در پیوست البته من به ال سد دی 5 ولت میدم ولی بازم گفتم یه سطر کلا خونه هاش روشن میشه و چیزی نمینویسه.

مهندس اینکه شبیه سازیش نادرسته!!

به پایه 2 تغذیه وصل نیست!

باید به این طریق اتصال داده میشد؛

[تصویر:  slrhscrtlgrp35acuv.jpg]
البته توی شبیه سازی لازم نیست lcd تغذیه داشته باشه .


(۱۲-آبان-۱۳۹۰, ۰۳:۳۱:۳۳)parviz2012 نوشته است: [ -> ]پس چرا این تو codevision جواب نمیده؟
یه بررسی کن بی زحمت.
کد:
کد:
#include <mega16.h>
#include <lcd.h>
#include <stdio.h>
#define xtal 8000000

#asm
.equ __lcd_port=0x1B ;PORTA
#endasm

unsigned char second, minute,hour;
unsigned char lcd_buff[10];

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
if(second==59)
{
second=0;
if(minute==59)
{
minute=0;
if(hour==24)
hour=0;
else
hour++;
}
else
minute++;
}
else
second++;

sprintf(lcd_buff,"Time = %d:%d:%d",hour, minute, second);
lcd_clear();
lcd_puts(lcd_buff);
}

// Declare your global variables here


void main(void)
{

// Timer/Counter 2 initialization
// Clock source: TOSC1 pin
// Clock value: PCK2/128
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;

lcd_init(16);

#asm("sei") // Global enable interrupts

while (1);

}

و عکس مدارش در پیوست البته من به ال سد دی 5 ولت میدم ولی بازم گفتم یه سطر کلا خونه هاش روشن میشه و چیزی نمینویسه.

برنامت مشکل داره در قسمت تایمر اصلاحش کن

کد:
while (1)
{
lcd_gotoxy(0,0);
lcd_putsf("iranvig.com");
};
کد زیز اضافه کنی متوجه میشه lcd مشکلی نداره
صفحه‌ها: 1 2