Forwarded from گارد
Forwarded from گارد
نحوه مدیریت زمان در پروژه های میکروکنترلری
مرحله به مرحله میگم(با فرض AVR)
1. اول یکی از تایمر ها رو طوری تنظیم کن که رو 10 میلی ثانیه بهت وقفه بده
این 10ms میشه پایه زمانی سیستمت یا اصطلاحا sys_tick
برای اینکار بیا یه تایمر 16 بیتی رو تو avr فرکانس ورودیشو با prescaler بزار 1mhz
بعد با 9999 مقایسه کن در حالت مقایسه ایی وقفه بگیر
دقیقا میشه 10ms
حالا تو وقفه تایمرت
اینو بزار
t1++;
این اولین عامل زمانیه
حالا میدونیم هر 10ms یکی به این اضافه میشه
میام تو حلقه واسه بررسی کلید
while(1){
.
.
.
if(s==0)
{
if(PINB.0==0)
{
t1=0;
s=1;
code;
}
}
else{
if(t1>19)
s=0;
}
}//while
}//main
این تا بزنی عمل میکنه
با گرفتن بانز کلید با سیستم تیک
بانز رو حدودا 200 میلی ثانیه گرفتم
اگه نیازه توضیحش بدم؟
اینم بگم s یه متغیره که در ابتدا صفر هست
بسته بندی کد رو دقت کن
یه if و else داریم
که به s اشاره میکنه
در ابتدا s برابره صفر و if درش بازه
پس مدام دستور های توش برزسی میشه تو حلقه
هر زمانی اولین صفر روی پایه دیده بشه. حتی اگه دارای بانز باشه
شمارنده زمان بانز که همون t1 هست صفر میشه برای شمارش زمان بانز که حدودا 200 میلی گرفتیم
متغیر s میشه 1
و کد کلید اجرا میشه
میاد بیرون و حلقه میچرخه به سرعت
برگرده، در دوم باز شده و در اول بستش
حالا دوباره باید در اول برای کلید زدن های بعد باز بشه
باز شدن یا همون برابری s دوباره با صفر زمانیه که t1 بشه 20 یعنی گذشت 200ms
وقتی شد مقدار s میشه صفر
و دوباره در بالا باز میشه
زمانشو کم و زیاد کردن دستوخودته
با همون 19
حتی اگه تاخیر هم خواستی بگیری
یه
t2++;
t3++;
بزار
بیا تو حلقه بگو
while(1){
if(t2>49){
t2=0;
code1;}
if(t3>99){
t3=0;
code2;}
}
}
-----------------------------------
نوع دیگر کلید که تا دست روی کلید باشد عمل نکرده و با برداشتن دست عمل می کند. بدون توقف
while(1){
.
.
.
if(s==0)
{
if(PINB.0==0)
{
t1=0;
s=1;
}
}
else{
if(t1>19)
{
if(PINB.0==0)
t1=0;
else{
code;
s=0;}
}
}
}//while
}//main
میکروکنترلرهای جدید دارای واحد systick می باشند
@najafielectronic
مرحله به مرحله میگم(با فرض AVR)
1. اول یکی از تایمر ها رو طوری تنظیم کن که رو 10 میلی ثانیه بهت وقفه بده
این 10ms میشه پایه زمانی سیستمت یا اصطلاحا sys_tick
برای اینکار بیا یه تایمر 16 بیتی رو تو avr فرکانس ورودیشو با prescaler بزار 1mhz
بعد با 9999 مقایسه کن در حالت مقایسه ایی وقفه بگیر
دقیقا میشه 10ms
حالا تو وقفه تایمرت
اینو بزار
t1++;
این اولین عامل زمانیه
حالا میدونیم هر 10ms یکی به این اضافه میشه
میام تو حلقه واسه بررسی کلید
while(1){
.
.
.
if(s==0)
{
if(PINB.0==0)
{
t1=0;
s=1;
code;
}
}
else{
if(t1>19)
s=0;
}
}//while
}//main
این تا بزنی عمل میکنه
با گرفتن بانز کلید با سیستم تیک
بانز رو حدودا 200 میلی ثانیه گرفتم
اگه نیازه توضیحش بدم؟
اینم بگم s یه متغیره که در ابتدا صفر هست
بسته بندی کد رو دقت کن
یه if و else داریم
که به s اشاره میکنه
در ابتدا s برابره صفر و if درش بازه
پس مدام دستور های توش برزسی میشه تو حلقه
هر زمانی اولین صفر روی پایه دیده بشه. حتی اگه دارای بانز باشه
شمارنده زمان بانز که همون t1 هست صفر میشه برای شمارش زمان بانز که حدودا 200 میلی گرفتیم
متغیر s میشه 1
و کد کلید اجرا میشه
میاد بیرون و حلقه میچرخه به سرعت
برگرده، در دوم باز شده و در اول بستش
حالا دوباره باید در اول برای کلید زدن های بعد باز بشه
باز شدن یا همون برابری s دوباره با صفر زمانیه که t1 بشه 20 یعنی گذشت 200ms
وقتی شد مقدار s میشه صفر
و دوباره در بالا باز میشه
زمانشو کم و زیاد کردن دستوخودته
با همون 19
حتی اگه تاخیر هم خواستی بگیری
یه
t2++;
t3++;
بزار
بیا تو حلقه بگو
while(1){
if(t2>49){
t2=0;
code1;}
if(t3>99){
t3=0;
code2;}
}
}
-----------------------------------
نوع دیگر کلید که تا دست روی کلید باشد عمل نکرده و با برداشتن دست عمل می کند. بدون توقف
while(1){
.
.
.
if(s==0)
{
if(PINB.0==0)
{
t1=0;
s=1;
}
}
else{
if(t1>19)
{
if(PINB.0==0)
t1=0;
else{
code;
s=0;}
}
}
}//while
}//main
میکروکنترلرهای جدید دارای واحد systick می باشند
@najafielectronic
Forwarded from Hamed entesari
به یک برنامه نویس جهت همکاری درقالب یک پروژه در زمینه درایور های مالتی مدیا تحت ویندوز نیازمندیم. لطفا سابقه و روزمه های کاری را به آی دی زیر تلگرام کنید. @H_E_768
Forwarded from گارد
@najafielectronic
👇👇👇👇👇👇👇👇👇👇👇👇👇
◀️ استفاده از struc در C
یک نمونه نحوه استفاده از struct که در تنظیم یک واحد سخت افزاری در میکروکنترلرها که در کتابخانه های سطح بالا از جمله HAL بکار می رود (با فرض AVR به مثال زیر توجه کنید)
در این مثال توسط struct تنظیمات، ابتدا پورت در حالت خروجی تنظیم شده و سپس بیت اول آن روشن می گردد و در نهایت struct مربوط به تنظیمات به تابع اعمال گر، اعمال می شود.
#include <mega32.h>
typedef struct{
unsigned char PA_DIR;
unsigned char PB_DIR;
unsigned char PC_DIR;
unsigned char PD_DIR;
unsigned char PA_ VAL;
unsigned char PB_ VAL;
unsigned char PC_ VAL;
unsigned char PD_ VAL;
}port_init;
void PORT_INIT(port_init *port){
DDRA=port->PA_DIR;
DDRA=port->PB_DIR;
DDRA=port->PC_DIR;
DDRA=port->PD_DIR;
PORTA=port->PA_VAL;
PORTB=port->PB_VAL;
PORTC=port->PC_VAL;
PORTD=port->PD_VAL;
}
#define PORT_OUT 0xff
#define PORT_IN 0x00
#define PIN_1_SET 0x01
#define PIN_2_SET 0x02
port_init po;
void main(void){
.
.
.
while(1){
po.PA_DIR=PORT_OUT;
po.PA_VAL=PIN_1_SET;
PORT_INIT(&po);
}
}
//--------------------------------@najafielectronic
توضیحات:
ابتدا با دستور typedef یک نوع از جنس struct با مقادیر مربوطه برای تنظیم رجیستر های DDR و PORT با نام port_init تعریف شده است👇
typedef struct{
unsigned char PA_DIR;
unsigned char PB_DIR;
unsigned char PC_DIR;
unsigned char PD_DIR;
unsigned char PA_ VAL;
unsigned char PB_ VAL;
unsigned char PC_ VAL;
unsigned char PD_ VAL;
}port_init;
سپس تابعی به نام PORT_INIT با یک ورودی بصورت اشاره گری از جنس port_init تعریف شده
درون تابع چون ورودی، اشاره گری از جنس struct می باشد برای دسترسی به اجزا struct از علامت "<-" استفاده می شود👇
void PORT_INIT(port_init *port){
DDRA=port->PA_DIR;
DDRA=port->PB_DIR;
DDRA=port->PC_DIR;
DDRA=port->PD_DIR;
PORTA=port->PA_VAL;
PORTB=port->PB_VAL;
PORTC=port->PC_VAL;
PORTD=port->PD_VAL;
}
برای مقدار دهی ساده تر ماکروهایی تعریف شده است تا دسترسی محاوره ایی تری اعمال شود👇
#define PORT_OUT 0xff
#define PORT_IN 0x00
#define PIN_1_SET 0x01
#define PIN_2_SET 0x02
متغیری به نام po از جنس port_init نیز برای تنظیمات تعریف می شود تا در برنامه مقدار دهی شده و سپس به تابع اعمال گردد👇
port_init po;
در برنامه متغیر po با علامت "." مقدار دهی می شود👇
po.PA_DIR=PORT_OUT;
po.PA_VAL=PIN_1_SET;
در نهایت po چون متغیر است و ورودی تابع یک اشاره گر، با علامت "&" در ورودی تابع قرار می گیرد👇
PORT_INIT(&po);
//--------------------------------@najafielectronic
توجه
لطفا با ذکر منبع انتشار دهید
کانال چیپکده👇
https://t.me/joinchat/AAAAADwxwnEkxhnl9m4iMA
سوپر گروه چیپکده👇
https://telegram.me/joinchat/BFiq5j961QA9TlEkFYMT0Q
👇👇👇👇👇👇👇👇👇👇👇👇👇
◀️ استفاده از struc در C
یک نمونه نحوه استفاده از struct که در تنظیم یک واحد سخت افزاری در میکروکنترلرها که در کتابخانه های سطح بالا از جمله HAL بکار می رود (با فرض AVR به مثال زیر توجه کنید)
در این مثال توسط struct تنظیمات، ابتدا پورت در حالت خروجی تنظیم شده و سپس بیت اول آن روشن می گردد و در نهایت struct مربوط به تنظیمات به تابع اعمال گر، اعمال می شود.
#include <mega32.h>
typedef struct{
unsigned char PA_DIR;
unsigned char PB_DIR;
unsigned char PC_DIR;
unsigned char PD_DIR;
unsigned char PA_ VAL;
unsigned char PB_ VAL;
unsigned char PC_ VAL;
unsigned char PD_ VAL;
}port_init;
void PORT_INIT(port_init *port){
DDRA=port->PA_DIR;
DDRA=port->PB_DIR;
DDRA=port->PC_DIR;
DDRA=port->PD_DIR;
PORTA=port->PA_VAL;
PORTB=port->PB_VAL;
PORTC=port->PC_VAL;
PORTD=port->PD_VAL;
}
#define PORT_OUT 0xff
#define PORT_IN 0x00
#define PIN_1_SET 0x01
#define PIN_2_SET 0x02
port_init po;
void main(void){
.
.
.
while(1){
po.PA_DIR=PORT_OUT;
po.PA_VAL=PIN_1_SET;
PORT_INIT(&po);
}
}
//--------------------------------@najafielectronic
توضیحات:
ابتدا با دستور typedef یک نوع از جنس struct با مقادیر مربوطه برای تنظیم رجیستر های DDR و PORT با نام port_init تعریف شده است👇
typedef struct{
unsigned char PA_DIR;
unsigned char PB_DIR;
unsigned char PC_DIR;
unsigned char PD_DIR;
unsigned char PA_ VAL;
unsigned char PB_ VAL;
unsigned char PC_ VAL;
unsigned char PD_ VAL;
}port_init;
سپس تابعی به نام PORT_INIT با یک ورودی بصورت اشاره گری از جنس port_init تعریف شده
درون تابع چون ورودی، اشاره گری از جنس struct می باشد برای دسترسی به اجزا struct از علامت "<-" استفاده می شود👇
void PORT_INIT(port_init *port){
DDRA=port->PA_DIR;
DDRA=port->PB_DIR;
DDRA=port->PC_DIR;
DDRA=port->PD_DIR;
PORTA=port->PA_VAL;
PORTB=port->PB_VAL;
PORTC=port->PC_VAL;
PORTD=port->PD_VAL;
}
برای مقدار دهی ساده تر ماکروهایی تعریف شده است تا دسترسی محاوره ایی تری اعمال شود👇
#define PORT_OUT 0xff
#define PORT_IN 0x00
#define PIN_1_SET 0x01
#define PIN_2_SET 0x02
متغیری به نام po از جنس port_init نیز برای تنظیمات تعریف می شود تا در برنامه مقدار دهی شده و سپس به تابع اعمال گردد👇
port_init po;
در برنامه متغیر po با علامت "." مقدار دهی می شود👇
po.PA_DIR=PORT_OUT;
po.PA_VAL=PIN_1_SET;
در نهایت po چون متغیر است و ورودی تابع یک اشاره گر، با علامت "&" در ورودی تابع قرار می گیرد👇
PORT_INIT(&po);
//--------------------------------@najafielectronic
توجه
لطفا با ذکر منبع انتشار دهید
کانال چیپکده👇
https://t.me/joinchat/AAAAADwxwnEkxhnl9m4iMA
سوپر گروه چیپکده👇
https://telegram.me/joinchat/BFiq5j961QA9TlEkFYMT0Q
Forwarded from کانال مرجع مهندسان ایران
عکسی که دیگر تکرار نخواهد شد !
جمعی از بزرگترین دانشمندان معاصر که جهان را متحول کردند!
بسیاری معتقدند بشر چنین جمعی دیگر به خود نخواهد دید !!
سالوی ، 1927 بروکسل بلژیک
🆔 @engineer_tasisat
جمعی از بزرگترین دانشمندان معاصر که جهان را متحول کردند!
بسیاری معتقدند بشر چنین جمعی دیگر به خود نخواهد دید !!
سالوی ، 1927 بروکسل بلژیک
🆔 @engineer_tasisat
LCD Graphic-Designer.rar
6 MB
راه اندازی LCD گرافیکی KS0108 بهمراه نرم افزار تبدیل فایل BMP به آرایه
خودآموز کاملا عملی STM32 به همراه نقشه شماتیک و PCB برد کتاب و فیلم های آموزشی فارسی در DVD همراه
فروش در
Chipkadeh.ir
فروش در
Chipkadeh.ir