na fakultetu sam uzeo za projekat da odradim light dimmer upotrebom Atmelovog mikrokontrolera 328p.
Cijeli projekat sam radio u Proteusu, međutim, simulacija cijelog projekta mi nije proradila, dok je simulacija detekcije prolaska proradila. (radio sam odvojeno)
Evo i koda:
Code: Select all
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile int brightness=39; //Podešavanje jačine svjetlosti na 50%, brightness = jačina svjetlosti
int main(void)
{
//Setup for User Button
DDRD&=(1<<3); // set PD3 to input
PORTD|=(1<<3); // set PD3 to high
//Setup External interrupt for Zero-crossing detection
DDRD&=(1<<2); // set PD2 to input
EIMSK |= (1<<INT0); //External interrupt enabled (PD2)
EICRA |= (1<<ISC01) | (1<<ISC00); //The rising edge of INT0 (PD2) generates an interrupt request.
DDRC|=(1<<0); // set PC0 to output (TRIAC)
//Setup Timer
TCCR0A |= (1<<WGM01); // Config TIMER0 CTC mode
TCCR0B |= (1<<CS02) | (1<<CS01); //Prescaler 8MHz/1024 = 7812.5Hz period=0.128 ms 1ms = 7.8125*period
TIMSK0 |= (1<<OCIE0A); // Enable Output Compare Match A Interrupt
sei();
while(1)
{
if(!PINC&(1<<3)) //Provjera je li tipka pritisnuta
{
brightness+=7.8125;
if (brightness>=78.125)
brightness=0;
}
OCROA=brightness;
}
}
ISR(TIMER0_COMPA_vect)
{
PORTC|=(1<<0); //FIRE TRIAC
_delay_ms(1);
PORTC&=(1<<0);
}
//Zero-crossing interrupt
ISR(INT0_vect)
{
OCROA=0; //Ako je mrežni signal prošao kroz nulu, podesi TOP VALUE na 0
}
Shema detekcije prolaska kroz nulu:
http://img255.imageshack.us/img255/1489/zcde.jpg
Shema cijelog projekta:
http://img546.imageshack.us/img546/1862/shemaz.jpg
Što se tiče sheme, dobio sam potvrdu od profesora da je dobra, međutim, nisam siguran je li mi ispravan kod.
Unaprijed zahvaljujem na odgovorima.
PS
Novi sam u svijetu MCU, ovim projektom sam TEK naučio osnovne stvari.