Chciałbym za pomocą dwóch innych przycisków traktować drugim sygnałem PWM drugą diodę. Jak to zrobić?
Generalnie program ma za zadanie obsługiwać za pomocą procesora dwa scalaczki jak poniżej sterujące diodami POWERLED.
Nota katalogowa:
http://datasheets.maxim-ic.com/en/ds/MA ... AX1701.pdf
Kod programu
Program główny
#include <avr\io.h>
#include <avr\iom8.h>
#include "led2.h"
#include "poprzednie.c"
#define outp(a, b) b = a
int klawiatura(void)
{
int zwrot=0;
// najpierw ustawiamy piny jako wyjťcia na wysokim poziomie logicznym
// robimy to po to aby prze-adowaŠ pojemnoťci wejťciowe mikrokontrolera
// bo nie stosujemy rezystorˇw podci¦gaj¦cych wejťcia a wejťcia maj¦ du¬¦
// rezystancjŕ wejťciow¦ i zbieraj¦ wszystkie zak-ˇcenia !
sbi(klawisz_s1_DDR,klawisz_s1_pin);
sbi(klawisz_s2_DDR,klawisz_s2_pin);
sbi(klawisz_s1_port,klawisz_s1_pin);
sbi(klawisz_s2_port,klawisz_s2_pin);
sbi(klawisz_s3_DDR,klawisz_s3_pin);
sbi(klawisz_s4_DDR,klawisz_s4_pin);
sbi(klawisz_s3_port,klawisz_s3_pin);
sbi(klawisz_s4_port,klawisz_s4_pin);
//dajemy 5 mikrosekund na prze-adowanie
delay(15);
// teraz prze-¦czamy piny w tryb pracy jako wejťcia
cbi(klawisz_s1_DDR,klawisz_s1_pin);
cbi(klawisz_s2_DDR,klawisz_s2_pin);
cbi(klawisz_s3_DDR,klawisz_s3_pin);
cbi(klawisz_s4_DDR,klawisz_s4_pin);
// sprawdzamy stan wejťŠ
if(bit_is_clear(klawisz_s1_wejscie,klawisz_s1_pin))
{
zwrot=zwrot+1;
}
if(bit_is_clear(klawisz_s2_wejscie,klawisz_s2_pin))
{
zwrot=zwrot+2;
}
if(bit_is_clear(klawisz_s3_wejscie,klawisz_s3_pin))
{
zwrot=zwrot+4;
}
if(bit_is_clear(klawisz_s4_wejscie,klawisz_s4_pin))
{
zwrot=zwrot+8;
}
// tutaj mo¬esz dopisaŠ obs-ugŕ kolejnych klawiszy
// musz¦ one dodawaŠ do zmiennej zwrot kolejno 4 8 16 32 64 128
// takie wagi klawiszy powlaj¦ na rozrˇ¬nianie wciťniŕtych
//kombinacji wielo klawiszowych
return zwrot;
}
int main(void) {
/* set OC2 for PWM output*/
outp((1<<PINB3), DDRB);
/*set timer counter initial value*/
TCNT2=0x00;
/*Set timer output compare register*/
int i=0;
for(;;)
{
OCR2=0x00+i;
if(klawiatura()==1) {i=i+10; LED_OFF;}
if(klawiatura()==2) {i=i-10; LED_OFF;}
if(klawiatura()==4) {i=i+1; LED_ON;}
if(klawiatura()==8) {i=i-1; LED_ON;}
delayms(100);
//i++;
if(i>255) i=255;
if(i<0) i=0;
/*start timer:
without presscaler
Non inverted mode in OC2 pin;
phase corect PWM*/
outp((1<<FOC2)|(1<<COM21)|(1<<COM20)|(1<<WGM20)|(1<<CS00), TCCR2);
}
}
LED2.h
Poprzednie.c#define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1)
#define LED_OFF sbi(DDRB,PB1);cbi(PORTB,PB1)
//definicja pinów wejsc
#define klawisz_s1_port PORTD
#define klawisz_s1_DDR DDRD
#define klawisz_s1_pin PD0
#define klawisz_s1_wejscie PIND
#define klawisz_s2_port PORTD
#define klawisz_s2_DDR DDRD
#define klawisz_s2_pin PD1
#define klawisz_s2_wejscie PIND
#define klawisz_s3_port PORTD
#define klawisz_s3_DDR DDRD
#define klawisz_s3_pin PD2
#define klawisz_s3_wejscie PIND
#define klawisz_s4_port PORTD
#define klawisz_s4_DDR DDRD
#define klawisz_s4_pin PD3
#define klawisz_s4_wejscie PIND
/**/
//Stale
/**/
#define F_CPU 1000000 // 1MHz zegar Procesora
#define CYCLES_PER_US ((F_CPU+500000)/1000000) // cpu cycles per ms
/**/
//Koniec definicji stalych
/**/
void delay(unsigned int us)
{
unsigned int delay_loops;
register unsigned int i;
delay_loops=(us/3)/5*CYCLES_PER_US;// +3 for rounding up
for(i=0;i<delay_loops;i++) {};
}
void delayms(unsigned int ms)
{
unsigned int i;
for(i=0;i<ms;i++)
{
delay(999);
asm volatile(
"WDR"::);
}
}