Witam! Napisalem program do obslugi ściemniacza na atmega16. Korzystamy z portu d. PD5 to pin wyjściowy sterujący triakiem. Impuls podany na PD3 lub PD4
zwieksza lub zmniejsza wartość zmiennej 'sel' regulując sterowaniem fazowym.
PD2(INT0) tu pojawia sie przerwanie zboczem opadajacym od ukladu detekcji zera.
Program ten prawie w ogole nie dziala. Napisalem go dwa razy, śledzilem dzialania krok po kroku i nic. gdy ustawie domyslna wartość świecenia na jakas pośrodku(sel = 5) żarówka dalej świeci pelna para! gdy podaje impuls na na PD4 PD5 żarówka w ogole przestaje świecic. Prosze o jakies sugestie, bo jestem zdesperowany.
zwieksza lub zmniejsza wartość zmiennej 'sel' regulując sterowaniem fazowym.
PD2(INT0) tu pojawia sie przerwanie zboczem opadajacym od ukladu detekcji zera.
Program ten prawie w ogole nie dziala. Napisalem go dwa razy, śledzilem dzialania krok po kroku i nic. gdy ustawie domyslna wartość świecenia na jakas pośrodku(sel = 5) żarówka dalej świeci pelna para! gdy podaje impuls na na PD4 PD5 żarówka w ogole przestaje świecic. Prosze o jakies sugestie, bo jestem zdesperowany.
#include<avr/io.h>
#include<avr/interrupt.h>
#define F_CPU 12000000
#include<util/delay.h>
#include <stdint.h>
#define xISC01 1 << 1
#define xINT0 1 << 6
#define xCS11 1 << 1
#define xOCIE1A 1 << 4
#define xOCIE1B 1 << 3
#define MAX_SEL 8
#define CYCLES_TO_WAIT 0xff
#define xSET_OCR1B 15000
uint16_t del[MAX_SEL] = {11262, 10372, 9485, 8567, 7575, 6432, 4944, 3847};
char sel = 5; // wybor jasnosci
int count = 0;
void pulse(void){
PORTD |= 1 << 5;
_delay_us(10);
PORTD &= ~(1 << 5);
}
void set_I(char en){
if(en == 1){
SREG |= 1 << 7;
} else {
SREG &= ~(1 << 7);
}
}
void start_TCNT1(char en){
if(en == 1){
TCCR1B |= xCS11;
} else {
TCCR1B &= ~xCS11;
}
}
void set_OCIE1A(char en){
if(en == 1){
TIMSK |= OCIE1A;
}else{
TIMSK &= ~OCIE1A;
}
}
void set_OCIE1B(char en){
if(en == 1){
TIMSK |= xOCIE1B;
}else{
TIMSK &= ~xOCIE1B;
}
}
void port_config(void){
//konfiguracja portu D
DDRD = 0x00; // ustawienie wszystkich portow jako wejsciowych
DDRD |= 1 << 5; // konfiguracja 5. bitu portu na wyjściowy
PORTD = 0x00; // konfiguracja wyjsc na 0 i wylaczenie podciagania na wejsciach
PORTD |= 1 << 2 || 1 << 3 || 1 << 4; // podciąganie na portach wejściowym
}
void ext_interrupt_config(void){
MCUCR = 0;
MCUCR |= xISC01; // wywolanie przerwania zboczem opadajacym
GICR = 0;
GICR |= xINT0; // interrupt enable dla int0
}
void counter_config(void){
OCR1B = xSET_OCR1B; // ustawiamy ilosc impulsow odpowiadajacych T/2
TIMSK = 0;
set_OCIE1A(0);
set_OCIE1B(1);// aktywacja przerwań od timera - compare match
TCCR1B = 0;
}
ISR(INT0_vect){
// sprawdzamy czy nie zmienic jasnosci - caly if
if(count == CYCLES_TO_WAIT){
if(!((PORTD & (1 << 3)) == (1 << 3)) && (sel != MAX_SEL - 1)){
++sel;
} else if(!((PORTD & (1 << 4)) == (1 << 4)) && (sel != 0)) {
sel--;
}
OCR1A = del[sel]; // zmiana jasnosci swiecenia po modyfikacji sel
count = 0;
}else{
PORTB = count;
++count;
}
// koniec sprawdzenia
TCNT1 = 0; // wyzerowanie timera
set_OCIE1A(1);
//set_I(0); // wylaczam absluge przerwan aby uruchomic timer1
start_TCNT1(1);
//set_I(1);*/
}
ISR(TIMER1_COMPA_vect){
start_TCNT1(0);
pulse();
set_OCIE1A(0);
set_OCIE1B(1);
TCNT1 = 0;
start_TCNT1(1);
}
ISR(TIMER1_COMPB_vect){
start_TCNT1(0);
pulse();
}
int main(void){
SREG = 0; // zabezpieczenie przed nadejsciem przerwania przed konfiguracja
OCR1A = del[sel];
port_config();
ext_interrupt_config();
counter_config();
SREG = 1 << 7; // ruszamy z praca!
label:
while(1){
}
goto label;
}