گارد
6.65K subscribers
3.09K photos
858 videos
2.82K files
1.61K links
مدیریت مجموعه:
مهندس حمید نجفی
@GARD_Manager

گروه پرسش و پاسخ:
@GARD_Academy_Group

سایت و فروشگاه:
GARD-Academy.com

صفحه اینستاگرام:
http://instagram.com/gard_academy

با مجوز رسمی از سازمان آموزش فنی و حرفه ای کشور و برند رسمی گارد

تلفن: ۴۴۲۰۴۱۱۴
Download Telegram
Forwarded from گارد
کار مهندس محمد حسین خدامی
دوره "طراحی برد مبتنی بر FPGA"
مجتمع فنی تهران شعبه حافظ
@najafielectronic
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
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
آموزش قدم به قدم و تصویری ماژول وایفای esp8266 و بلوتوث hc05

از طرف مهندس @alisajjadi97 👇
عکسی که دیگر تکرار نخواهد شد !

جمعی از بزرگترین دانشمندان معاصر که جهان را متحول کردند!
بسیاری معتقدند بشر چنین جمعی دیگر به خود نخواهد دید !!

سالوی ، 1927 بروکسل بلژیک


🆔 @engineer_tasisat
pc keybord.rar
101.9 KB
ارتباط Keyboard کامپیوتر با AVR
LCD Graphic-Designer.rar
6 MB
راه اندازی LCD گرافیکی KS0108 بهمراه نرم افزار تبدیل فایل BMP به آرایه
LCD.exe
446 KB
تبدیل فایل BMP به آرایه. طراحی یک دوست قدیمی
ماه رمضان مبارک باد
خودآموز کاملا عملی STM32 به همراه نقشه شماتیک و PCB برد کتاب و فیلم های آموزشی فارسی در DVD همراه

فروش در
Chipkadeh.ir
نکات مربوط به طراحی PCB های فرکانس بالا👇
دقایقی خارج از علم👇
Forwarded from گارد
راهنمای فارسی modelsim