Witam.
Próbuję zaprojektować urządzenie na układzie ATtiny2313 mające na wyjściu 3 kanały PWM, które były by sterowane za pomocą 6 przycisków (2 na kanał do sterowania szerokością impulsu +/-).
Napisałem taki kod:
i chciałem zapytać czy będzie to działać zgodnie z oczekiwaniami?
A oto oczekiwania:
przyciski na porcie D od 0 do 5 mają sterować wypełnieniem 3 sygnałów PWM na porcie B 5, 6, 7. Ponadto ma to się odbywać z częstotliwością minimum 100Hz. Opóźnienie wynikające z wciśnięcia przyciska nie jest tutaj wadą.
Proszę o wasze odpowiedzi.
Dodam, że w KamAVR kompiluje się bez błędów.
Pozdrawiam.
Próbuję zaprojektować urządzenie na układzie ATtiny2313 mające na wyjściu 3 kanały PWM, które były by sterowane za pomocą 6 przycisków (2 na kanał do sterowania szerokością impulsu +/-).
Napisałem taki kod:
#include <avr/io.h>
#define OSC 8 // was: 4
// makra do sterowania kanałami wyjściowymi
#define RED_ON PORTB |= 0x20 // PORTB.5
#define RED_OFF PORTB &= ~0x20
#define GREEN_ON PORTB |= 0x40 // PORTB.6
#define GREEN_OFF PORTB &= ~0x40
#define BLUE_ON PORTB |= 0x80 // PORTB.7
#define BLUE_OFF PORTB &= ~0x80
// zmienne globalne zawierające aktualne wartości wypełnień kanałów
unsigned char RV; // red value (0-255)
unsigned char GV; // green value (0-255)
unsigned char BV; // blue value (0-255)
// enumeracja kanałów
const unsigned char R = 0; // red
const unsigned char G = 1; // green
const unsigned char B = 2; // blue
//-----------------------------------------------------------
//-----------------------------------------------------------
//-----------------------------------------------------------
void CHNG(unsigned char Color, unsigned char Value){
// red -----------------------------------------
if(Color == R){
if(Value == 2){
if(RV == 0){
RV = 255;
} else {
RV = 0;
}
} else if(Value == 1){
if(RV < 255) RV++;
} else if(Value == 0){
if(RV > 0) RV--;
}
// green ---------------------------------------
} else if(Color == G){
if(Value == 2){
if(GV == 0){
GV = 255;
} else {
GV = 0;
}
} else if(Value == 1){
if(GV < 255) GV++;
} else if(Value == 0){
if(GV > 0) GV--;
}
// blue ----------------------------------------
} else if(Color == B){
if(Value == 2){
if(BV == 0){
BV = 255;
} else {
BV = 0;
}
} else if(Value == 1){
if(BV < 255) BV++;
} else if(Value == 0){
if(BV > 0) BV--;
}
}
}
//-----------------------------------------------------------
//-----------------------------------------------------------
//-----------------------------------------------------------
int main(void){
// port B jako wyjście
DDRB = 0xFF;
// konfiguracja początkowych opcji
RV = 0;
GV = 0;
BV = 0;
// główna pętla programu
while(1){
// aby opóźnić obsługę butonów
unsigned char l;
for(l=0; l<100; l++){
// jeśli wartości koloru są > 0 to włączamy diodę
if(RV > 0) RED_ON;
if(GV > 0) GREEN_ON;
if(BV > 0) BLUE_ON;
// PWM
unsigned char i;
for(i=0; i<256; i++){
// wyłączamy diody kiedy i > %V (% = R,G,B)
if(i > RV) RED_OFF;
if(i > GV) GREEN_OFF;
if(i > BV) BLUE_OFF;
}
}
// Jeśli PIND.X jest w sanie niskim to znaczy, że wciśnięto X buton
//-------------------------------------
if(bit_is_clear(PIND, 0) && bit_is_clear(PIND, 1)){ // RED TO MAX/ZERO
CHNG(R, 2);
} else if(bit_is_clear(PIND, 0)){ // RED +
CHNG(R, 1);
} else if(bit_is_clear(PIND, 1)){ // RED -
CHNG(R, 0);
}
//-------------------------------------
if(bit_is_clear(PIND, 2) && bit_is_clear(PIND, 3)){ // GREEN TO MAX/ZERO
CHNG(G, 2);
} else if(bit_is_clear(PIND, 2)){ // GREEN +
CHNG(G, 1);
} else if(bit_is_clear(PIND, 3)){ // GREEN -
CHNG(G, 0);
}
//-------------------------------------
if(bit_is_clear(PIND, 4) && bit_is_clear(PIND, 5)){ // BLUE TO MAX/ZERO
CHNG(B, 2);
} else if(bit_is_clear(PIND, 4)){ // BLUE +
CHNG(B, 1);
} else if(bit_is_clear(PIND, 5)){ // BLUE -
CHNG(B, 0);
}
}
return 0;
}
//-----------------------------------------------------------
//-----------------------------------------------------------
//-----------------------------------------------------------
i chciałem zapytać czy będzie to działać zgodnie z oczekiwaniami?
A oto oczekiwania:
przyciski na porcie D od 0 do 5 mają sterować wypełnieniem 3 sygnałów PWM na porcie B 5, 6, 7. Ponadto ma to się odbywać z częstotliwością minimum 100Hz. Opóźnienie wynikające z wciśnięcia przyciska nie jest tutaj wadą.
Proszę o wasze odpowiedzi.
Dodam, że w KamAVR kompiluje się bez błędów.
Pozdrawiam.