Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Jak uruchomić 2 kanał PWM na ATMEGA8

Mrrudzin
-
-
Posty:71
Rejestracja:16 maja 2007, o 17:55
Lokalizacja:Polska
Jak uruchomić 2 kanał PWM na ATMEGA8

Postautor: Mrrudzin » 8 cze 2007, o 14:35

Zaznacze na początku, że nie jestem jeszcze zbyt mocny jeśli chodzi o mikrokontrolery. Napisałem (na podstawie kodów znalezionych w sieci) programik, który za pomocą przycisków pozwala zwiększać/zmniejszać wypełnienie sygnału (PWM) i traktuje nim diodę.
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.

Obrazek

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
#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
Poprzednie.c
/**/
//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"::);
}
}

kuczus
-
-
Posty:15
Rejestracja:14 lip 2006, o 17:20
Lokalizacja:Rybnik
Kontaktowanie:

Postautor: kuczus » 19 lip 2007, o 08:37

moja skromna opinia brzmi tak że musisz złożyć drugą taką konstrukcje. Ale mówię to tak na ślepo, ponieważ nie znam tego układu.

Mrrudzin
-
-
Posty:71
Rejestracja:16 maja 2007, o 17:55
Lokalizacja:Polska

Postautor: Mrrudzin » 25 lip 2007, o 08:50

Niekoniecznie. Po przeryciu dokumentacji i kilku programów przykładowych uruchomiłem 3 kanału PWM (jeszcze jeden do regulacji jasności podświetlanych kontrolek).

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości