2015. május 25., hétfő

Rendőrlámpa - PIC

Sziasztok!

Mint a korábbi cikkem végén ígértem, most a már látott rendőrlámpa, bonyolultabb, programozható változatával készültem.

Ez a lámpa egy kereszteződés teljes felszerelésére is tökéletesen alkalmas, az időzítése úgy lett megoldva, hogy reális hatást keltsen.

A lámpa tartalmaz 2 autó lámpát, illetve 2 gyalogos lámpát. Ezzel egy teljes kereszteződés 8 lámpáját lehet vezérelni, máris kifejtem.

A szemben lévő lámpák egyszerre működnek, tehát az irányítás tele zöldes, ezáltal egy lámpavezérlés valójában 2-t hajt meg egyszerre.

Nos íme, a megálmodott kereszteződés.

A képen azonos számmal jelölt lámpák azonos vezérlőrészhez tartoznak.

Ezen a képen pedig az Proteus 8 Professionalban megépített áramkör látható működés közben:


A következőekben a programot fogom leírni, kommentált van, így a részek megértése könnyebb.

unsigned char ii;
/*
A következő programrész fogja elmagyarázni az IC-nek, hogy a lejjebb elhelyezett
egyszavas parancsok mit is jelentenek.
a #define parancsba szinte bármilyen folyamatot bevehetünk, ami leegyszerűsíti
a programot és korlátozott források esetén elkerülhetőek vele az IC túlterhelé-
séből fakadó esetleges hibák.
*/
#define lampa1zold PORTA.F0=0; PORTA.F1=0; PORTA.F2=1;
#define lampa1sarg PORTA.F0=0; PORTA.F1=1; PORTA.F2=0;
#define lampa1piro PORTA.F0=1; PORTA.F1=0; PORTA.F2=0;
#define lampa1sapi PORTA.F0=1; PORTA.F1=1; PORTA.F2=0;
#define lampa1ki   PORTA.F0=0; PORTA.F1=0; PORTA.F2=0;

#define lampa2zold PORTA.F3=0; PORTB.F5=0; PORTB.F6=1;
#define lampa2sarg PORTA.F3=0; PORTB.F5=1; PORTB.F6=0;
#define lampa2piro PORTA.F3=1; PORTB.F5=0; PORTB.F6=0;
#define lampa2sapi PORTA.F3=1; PORTB.F5=1; PORTB.F6=0;
#define lampa2ki   PORTA.F3=0; PORTB.F5=0; PORTB.F6=0;

#define lampa3zold PORTB.F0=0; PORTB.F1=1;
#define lampa3piro PORTB.F0=1; PORTB.F1=0;
#define lampa3ki   PORTB.F0=0; PORTB.F1=0;

#define lampa4zold PORTB.F2=0; PORTB.F3=1;
#define lampa4piro PORTB.F2=1; PORTB.F3=0;
#define lampa4ki   PORTB.F2=0; PORTB.F3=0;

void lampak(void) {            //ez a programrész gondoskodik a helyes állásról
  if(ii==1) {
    lampa1zold;
    lampa2piro;
    lampa3piro;
    lampa4zold;
  }
  if(ii==20) {
    lampa1sarg;
    lampa2piro;
    lampa3piro;
    lampa4zold;
  }
  if(ii==40) {
    lampa1piro;
    lampa2piro;
    lampa3zold;
    lampa4zold;
  }
  if(ii==60) {
    lampa1piro;
    lampa2sapi;
    lampa3zold;
    lampa4piro;
  }
  if(ii==80) {
    lampa1piro;
    lampa2zold;
    lampa3zold;
    lampa4piro;
  }
  if(ii==100) {
    lampa1piro;
    lampa2zold;
    lampa3piro;
    lampa4piro;
  }

  if(ii==120) {
    lampa1piro;
    lampa2sarg;
    lampa3piro;
    lampa4piro;
  }

  if(ii==140) {
    lampa1sapi;
    lampa2piro;
    lampa3piro;
    lampa4piro;
  }
}

void main() {
  TRISA0_bit=0; //Autó-1 piros   O
  TRISA1_bit=0; //Autó-1 sárga   O
  TRISA2_bit=0; //Autó-1 zöld    O
  
  TRISA3_bit=0; //Autó-2 piros   O
  TRISB5_bit=0; //Autó-2 sárga   O
  TRISB6_bit=0; //Autó-2 piros   O
  
  TRISB0_bit=0; //gyalogos-1 piros  O
  TRISB1_bit=0; //gyalogos-1 zöld   O
  
  TRISB2_bit=0; //gyalogos-2 piros  O
  TRISB3_bit=0; //gyalogos-2 zöld   O
  
  TRISB4_bit=1; //narancs villogás gomb/normál lámpa
  
  while(1) {
    while(PORTB.F4==0) {  //amíg le nem nyomom a gombot a folyamat megy megállás
      ii+=1;              //nélkül
      if(ii==160) {
        ii=1;
      }
      lampak();
      Delay_ms(100);
    }
    while(PORTB.F4==1) {} //Amíg nyomva tartom a gombot a program vár
    lampa3ki;
    lampa4ki;
    while(PORTB.F4==0) {  //itt kezdi el a villogást amíg gombot nem nyomok újra
      lampa1ki;
      lampa2ki;
      Delay_ms(500);
      lampa1sarg;
      lampa2sarg;
      Delay_ms(500);
    }
    while(PORTB.F4==1) {} //Amíg nyomva tartom a gombot a program vár
    lampa1piro;           //minden lámpát pirosra kapcsol
    lampa2piro;
    lampa3piro;
    lampa4piro;
    Delay_ms(300);        //vár ~1/3 másodpercet
    ii=130;               //a folyamatot a legvégső állapothoz állítja
  }                       //a program visszaindul az elejére és kezdi a lámpák
}                         //irányítását, amíg ismét meg nem szakítom.

A fenti program MikroC Pro for PIC v6.0.0 verziójú programban íródott, abba bemásolva tökéletesen működnie kell.

A vezérlőbe égetendő hex fájl itt érhető el.

Alkatrészlista:
piros LED         8db
zöld LED          8db
sárga LED         4db //ezek csak az autós lámpákhoz kellenek
nyomógomb         1db //a lámpaállító gomb, ha kell reset is akkor 2db
10kOhm ellenállás 1db //ha kell reset gomb, akkor ebből is 2db kell
PIC16F628         1db
NYÁK lap          1db //ilyen egyszerű áramkörnél tökéletes az előrefúrt is

Az elkészítéshez szükséges elemek minden elektronikai boltban megtalálhatóak, áruk kedvező.

A PIC programozást igényel, így szükséges hozzá egy programozó eszköz, én K150-es programozót használok, lassú de megbízható szerkezet, régebben rendeltem még a neten, igény szerint elküldöm a linket.

Amennyiben bármilyen segítségre lenne szükséged, keress nyugodtan E-mailben a hovanhenrik1@gmail.com címen. A levél tárgyaként ezt írd: "Forrasztva - rendőrlámpa PIC"
A PIC felprogramozását valamint a NYÁK kimarását örömmel vállalom még tapasztalatlanabb olvasóimnak, ilyen ügyben is hasonlóan e-mailben keressetek ugyanezen tárggyal.

Köszönöm, hogy elolvastad, most végére értem a terepasztalokra szánt áramköreim cikksorozattal, hamarosan egy erősítőt fogok nektek bemutatni. Addig is sziasztok!

Nincsenek megjegyzések:

Megjegyzés küldése