پاسخ : طراحی شمارنده 0_99 برای atmega16 و 7seg چهارتایی
نوشته اصلی توسط morteza_omidi
بله میخوام مثل ثانیه بشماره...
تنظیمات شمارندت که سادس
اگر کلاک سیستمتو 1000000در نظر بگیری و تایمر 1 را با تقسیم فرکانسی 64 تعریف کنی با تنظیمات زیر
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0xC2;
TCNT1L=0xFA;
و تنظیمات وقفه زیر
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer1 value
TCNT1H=0xC2FA >> 8;
TCNT1L=0xC2FA & 0xff;
// Place your code here
c++;
}
هرباری که c زیاد میشه 1ثانیه گذشته
میتونی 1حلقه 99تایی برایc تعریف کنی که بهتره داخل تابع اصلی اینکارو انجام بدی.
من تاحالا با 7segment کار نکردم و اطلاعات چندادی ازش ندارم. شما اگر چیزی میدونی بزار تا با هم اون قسمتشم ردیف کنیم(در کل کار ساده ای باید باشه)
پاسخ : طراحی شمارنده 0_99 برای atmega16 و 7seg چهارتایی
دوست عزیز از کمکت ممنون.یه چیزهایی را فهمیدم و این کمک بزرگی بود. اما باز آنچه که من میخواستم نبود اول اینکه سخت افزار با atmega32 نباشه و با 16 باشه دوم اینکه چون من کلاس avr میرم و این را به عنوان تمرین دریافت کردم و حتما بایدبه زبان c انجامش بدم اگه میشه از دستور ref استفاده نکنید و باز هم اگه زحمتی نیست تا 999 بشماره.
یه دنیا ممنون
پاسخ : طراحی شمارنده 0_99 برای atmega16 و 7seg چهارتایی
نوشته اصلی توسط morteza_omidi
دوست عزیز از کمکت ممنون.یه چیزهایی را فهمیدم و این کمک بزرگی بود. اما باز آنچه که من میخواستم نبود اول اینکه سخت افزار با atmega32 نباشه و با 16 باشه دوم اینکه چون من کلاس avr میرم و این را به عنوان تمرین دریافت کردم و حتما بایدبه زبان c انجامش بدم اگه میشه از دستور ref استفاده نکنید و باز هم اگه زحمتی نیست تا 999 بشماره.
یه دنیا ممنون
عزیزم اون ref دستور نیست اسم تابعه (ref_seg) تو اگه باهاش مشکل داری عوضش کن هر چی دلت میخواد بزارش
اما درباره 999 :
فکر نکنم زیاد سخت باشه
همین کارها رو با اضافه کردن یه پورت دیگه انجام میدی
اما در رابطه با atmega16:
من خودم فقط با mega32 کار کردم
اما تا اونجایی که من اطلاع دارم زیاد با هم فرق ندارن
پس بی زحمت خودت هم یه آستینی بالا بزن و یه کاری بکن
اگه نشد، چشم. ما در خدمتیم :nerd:
پاسخ : طراحی شمارنده 0_99 برای atmega16 و 7seg چهارتایی
با عرض سلام خدمت شما دوست عزیز
برای کار شمامیکرو mega16 با میکرو mega32 فرقی با هم نمی کنه.
برای این که یک ثانیه شمار از 0 تا 999 یا هر عدد دیگری بسازید در ابتدا شما یک شمارنده احتیاج دارید که هر یک ثانیه یکی به مقدار قبلی آن اضافه شود که این کار را می توانید توسط یک تایمر یا توسط یک دستور تاخیر delay ایجاد کنید.
سپس این عدد را می بایست بر روی 7seg نمایش بدهید پس بهتر است یک تابع برای آن بنویسید که یک عدد صحیص را دریافت و روی 7seg های شما نمایش دهد.
اصول کار برای 7seg ها هم بدین صورت است که سون سگمنت رو را به صورت مولتی پلکسی درایو می کنند.
به این صورت که رقم اول را روی سگمنت نمایش می دهند سپس ان سگمنت رو روشن می کنند بعد از یه فاصله زمانی کوتاه آن سون سگمنت رو خاموش می کنند سپس رقم بعد رو روی سگمنت نمایش می دهند و سپس سگمنت دوم را روشن می کنند و بعد از یه فاصله زمانی خاموش می کنند الی آخر.
به این صورت تمام رقم هایی که می خواهید نمایش بدید را روی سگمنت ها به ترتب باید نمایش بدید.
شکل متصل کردن سون سگمنت هاتون هم باید به این صورت باشد که تمام a ها به هم متصل باشند و به یک پین میکروی شما باید متصل باشند و به همین ترتیب همه b ها ..... g ها به هم متصل باشند و به پین دیگر میکروی شما متصل باشند.
البته اگر سون سگمنت شما چند رقمی هست به صورت بالا عمل کنید.
خوب حالا فرض را بر این میگیریم که شما به ترتب زیر عمل کرده اید:
a -> PORTB.0
b->PORTB.1
c->PORTB.2
......
g->PORTB.6
پایه مشترک هر رقم سون سگمنت شما هم به شکل زیر متصل شده است:
segment1 ->PORTC.0
segment2 -> PORTC.1
...
segmentN -> PORTm.n
حال مدار شما آماده است.
برای نمایش عدد ها باید کدی که آن رقم را تولید می کند رو بدست بیاورید مثلا برای نمایش عدد 1 باید c , b را روشن کنید که طبق مدار بالا کدی که عدد 1 را می سازد می شود 0x06 برای این کار می تونی از یک آرایه استفاده کنی به شکل زیر:
دیدگاه