www.ele.hu
  • Börze kínálat
  • Áramkörmodul
  • Technológia
  • Gép-Ész
  • Szaki-baki
  • Foto Sarok

Főmenü

Felhasználói Menü

Alkatrészek:

Alkatrészek
Nyomtatottáramkör
Müszerek

Vásárlókosár

A kosara üres
Impresszum: Szerkeszti ELEHU! site-gazda GERCO Elektronika szerviz
P001-Random LED Light
Áramkörmodulok
Írta: elight   
2008. december 16. kedd, 10:03

 KELLEMES KARÁCSONYT és Boldog Új Évet Kívánunk!!!

P001  MiniPic Szoftver: Random-light




Más régebben MiniPic néven bemutattam egy kis panelt,amelynek segítségével kipróbálhatjátok
a PIC programozás rejtelmeit asm-ben , basic-ben vagy akár C-ben. Most egy érdekes kis
programot szeretnék mellékeln egy kicsit magasabb fokon. Ez C nyelven mutatja be hogyan tudunk
LED -eket vezérelni szoftver PWM jel segítségével. A kapcsolást egy vezérelhetõ FET-es
áramgenerátorral kiegészítve nagy teljesítményû POWER LED -ek vezérlésére is felhasználhatjátok,
Házi feladat lehet az is hogy a véletlenszerû fények helyett az a nyomógombokkal történjen a
fényerõ szabályzás :-)

 

 

 

 

Természetesen a futtatásához szükségetek
lesz valamilyen PIC programozóra vagy ICD-re , a proto-panelre
és egy C szintû pic fordítóra. A programot MPLAB és Microchip
vagy Hitec C segítségével fordíthatjátok beégethetõ kóddá.
A Program PIC 16F628 IC-re megírt, így azt kell a fordításkor
és programozáskor beállítani és fordítás után beégetni.
4 MHz rezonátorral szerelt lap esetén



XT_OSC, WDT_OFF, CP_OFF, PWRT_OFF paramétereket
érdemes beállítani az égetéshez.

 A Random_Light LED villogtató program lista :


//START -----------------------------------------------------------------------------------------
/*
-- 4 LED RANDOM PISLOGÁSA <pislogo2.c> 2005.10.02
- PIC 16C628 fordítva - -OK-

minta program: www.ele.hu

TMR0 interrupt használata..
Véletlen idõzítéssel pislogtatja a ledet
A pislogást szoftware generált PWM jel vezérli.
Ha páros a szám akkor kétszer pislog
A Pislogó ledek száma 1-4 is véletlen szerû.
A LED-ek a PORTB 0 - 3 bitekre vannak kötve.
A PORTA 0 jelzi az interrupt mûködés ütemét.

*/

#include <pic.h>
#include <stdlib.h>
#include <stdio.h>

void delay(unsigned int count);
void init(void);
void pislant(unsigned char szam);

static bit INT_EVENT; // interrupt megtörtént
static bit DOWN; // csökkenõ fényerõ
static bit UP; // növekedõ fényerõ

static unsigned int milisec;
static unsigned char value;
static unsigned char idozites;
static unsigned char led_szam;

void
main(void) // FÕPROGRAM
{
unsigned int clock;

init();
clock = 1;
srand(clock); /* Véletlenszám inicializálása */
value = 5;


while(1)
{
if(INT_EVENT)
{
INT_EVENT=0;
PORTA = 0;
milisec++;
if (milisec >= 500)
{
milisec = 0;
idozites++;
if(idozites >= value)
{
value = (char) rand();
value = value & 0x0F;
led_szam = (char) rand();// LED szam
led_szam = led_szam & 0x03;
pislant(led_szam);
if( value & 0x01 ) // páros?
{
delay(200);
pislant(led_szam); // akkor dupla pislantás
}
}
}
}
}
}

static void interrupt
isr(void) // Interrupt rutin paraméterátadás nélkül
{
T0IF = 0; // interrupt flag törlése, vár a következõre
INT_EVENT=1; // int ació .... aktiv.
PORTA ^= 1; // PORTA 0bit jelzi kifelé az int-et
}

void init(void)
{
PORTB = 0x0F; // Alsó négy led bekapcsolása
PORTA = 0x00; // POrta KI
TRISA=0x00; // A port teljesen kimenet
TRISB=0x00; // B port teljesen kimenet

OPTION = 0x03; // Timer 0 beállítása számlálásra
T0IE = 1; // Engedélyezi a TMR0 interrupt túlcsordulást
GIE = 1; // Az összes /global/ interruptot engedélyezi
}


void pislant( unsigned char szam)
{
// a pislogás szotwer PWM ( fény elhalvanyulása és felerõsödése)
unsigned char port_maskl;
unsigned char port_maskh;
unsigned int pwm_num;
unsigned char i;

port_maskl = 0xfe;
port_maskh = 0x01;
for( i = szam; i > 0; i--)
{
port_maskh = port_maskh << 1;
port_maskl = ~port_maskh;
}
pwm_num=0xfE; // 0xfe tõl szamol nulláig és vissza
DOWN = 1;
UP = 0;
while(pwm_num < 0xff) // Ha ujra elérte a maximumot akkor kilép
{
if(DOWN==1)
{
pwm_num--;
}
if(UP==1)
{
pwm_num++;
}
switch (pwm_num) // PWM kod maszkolása
{
case 0xff: { PORTB = PORTB | port_maskh; break;}
case 0xf1: { PORTB = PORTB & port_maskl; break;}
case 0xf0: { PORTB = PORTB | port_maskh; break;}
case 0xe2: { PORTB = PORTB & port_maskl; break;}
case 0xe0: { PORTB = PORTB | port_maskh; break;}
case 0xd3: { PORTB = PORTB & port_maskl; break;}
case 0xd0: { PORTB = PORTB | port_maskh; break;}
case 0xc4: { PORTB = PORTB & port_maskl; break;}
case 0xc0: { PORTB = PORTB | port_maskh; break;}
case 0xb5: { PORTB = PORTB & port_maskl; break;}
case 0xb0: { PORTB = PORTB | port_maskh; break;}
case 0xa6: { PORTB = PORTB & port_maskl; break;}
case 0xa0: { PORTB = PORTB | port_maskh; break;}
case 0x97: { PORTB = PORTB & port_maskl; break;}
case 0x90: { PORTB = PORTB | port_maskh; break;}
case 0x88: { PORTB = PORTB & port_maskl; break;}
case 0x80: { PORTB = PORTB | port_maskh; break;}
case 0x79: { PORTB = PORTB & port_maskl; break;}
case 0x70: { PORTB = PORTB | port_maskh; break;}
case 0x6a: { PORTB = PORTB & port_maskl; break;}
case 0x60: { PORTB = PORTB | port_maskh; break;}
case 0x5b: { PORTB = PORTB & port_maskl; break;}
case 0x50: { PORTB = PORTB | port_maskh; break;}
case 0x4c: { PORTB = PORTB & port_maskl; break;}
case 0x40: { PORTB = PORTB | port_maskh; break;}
case 0x3d: { PORTB = PORTB & port_maskl; break;}
case 0x30: { PORTB = PORTB | port_maskh; break;}
case 0x2e: { PORTB = PORTB & port_maskl; break;}
case 0x20: { PORTB = PORTB | port_maskh; break;}
case 0x1f: { PORTB = PORTB & port_maskl; break;}
case 0x10: { PORTB = PORTB | port_maskh; break;}
case 0x0f: { PORTB = PORTB & port_maskl; break;}
}
if(pwm_num == 0)
{
DOWN = 0;
UP = 1; // ha eléri a nullát: számolási irány megfordítása
}
delay(500);
}
}

void delay(unsigned int count) // várakozási rutin
{
while(count--)
;
return;
}
// END -----------------------------------------------------------------------------------------



Sok sikert!


Módosítás dátuma: 2009. június 25. csütörtök, 08:42
 

Ajánlatunk:

Alkatreszkinalat: ELEKTROLIGHT.

Impresszum: Szerkeszti ELEHU! site-gazda GERCO Elektronika szerviz