Skocz do zawartości

Attiny2313 konfiguracja PWM.


Pomocna odpowiedź

Najlepiej sprawdzać program partiami, tj. np. inicjalizacja PWM, ADC, jakieśtam funkcje itd. oddzielnie. Pozwoli to wyłapać wadliwe fragmenty i na nich się skupić.

U Ciebie widzę np., że za każdym razem ustawiasz rejestr timera. Zrób to raz na początku, potem jest to zbędne. Co więcej, wszystkie funkcje od PWM wyglądają identycznie.

  • 2 tygodnie później...

Całość działa już prawie tak jak bym chciał. W tej chwili kiedy nacisnę przycisk że pojazd ma jechać do przodu potem w lewo działa ale kiedy pusze przycisk on jedzie dalej a chciałbym aby stany na porcie były tylko ustawiane w chwili kiedy trzymam przycisk, Krótko jak przycisk jest wciśnięty jedzie a jak puszczony stoi. Próbowałem już polecenia else przy ifach ale nic nie dało. Ma ktoś jakiś pomysł?

#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>

void pwm_lewo()

{
  TCCR1A= (1 << COM1A1)|(0 << COM1A0)|(1 << COM1B1)|(0 << COM1B0)| (1 << WGM11)|(0 << WGM10); // Fast PWM
  TCCR1B= (0 << ICNC1)|(0 << ICES1)|(1 << WGM13)|(1 << WGM12)| (0 << CS12)|(0 << CS11)|(1 << CS10); // No prescaling
  ICR1=0xFFFE; //(65534)
  OCR1A=32767;
  OCR1B=32767;
  }
void pwm_prawo()

{
  TCCR1A= (1 << COM1A1)|(0 << COM1A0)|(1 << COM1B1)|(0 << COM1B0)| (1 << WGM11)|(0 << WGM10); // Fast PWM
  TCCR1B= (0 << ICNC1)|(0 << ICES1)|(1 << WGM13)|(1 << WGM12)| (0 << CS12)|(0 << CS11)|(1 << CS10); // No prescaling
  ICR1=0xFFFE; //(65534)
  OCR1A=32767;
  OCR1B=32767;
}
void pwm_max()

{
  TCCR1A= (1 << COM1A1)|(0 << COM1A0)|(1 << COM1B1)|(0 << COM1B0)| (1 << WGM11)|(0 << WGM10); // Fast PWM
  TCCR1B= (0 << ICNC1)|(0 << ICES1)|(1 << WGM13)|(1 << WGM12)| (0 << CS12)|(0 << CS11)|(1 << CS10); // No prescaling
  ICR1=0xFFFE; //(65534)
  OCR1A=32767;
  OCR1B=32767;

}

int main(void)
{
/* Wszystkie linie portu B będą wyjściami */
DDRB = 0xff;
PORTB = 0xff;
/* PWszystkie linie portu D będą wejściami, PD2...PD5 podciągnięte do VCC */
DDRD = 0x00;
PORTD = 0x3c;
/* Początek nieskończonej pętli */
while(1)
{
if(!(PIND & 0x04))
{
	pwm_max ();
	PORTB=0xFA;
	_delay_ms(100);
}


if(!(PIND & 0x08))
{
	pwm_max ();
	PORTB=0xDD;
	_delay_ms(100);
}

if(!(PIND & 0x10))
{
	pwm_prawo ();
	PORTB=0xDE;
	_delay_ms(100);
}


if(!(PIND & 0x20))
{
	pwm_lewo ();
	PORTB=0xF9;
	_delay_ms(100);
}



}

}

P.S. nie zwracajcie uwagi na wartości podawane w PWM. to są przykładowe. Ale PWM działa bo sprawdzałem 😃

else {} ale kompilator pokazywał błąd zresztą nic dziwnego jak później się nad tym zastanowiłem, później else { "czekaj 100 ms" }, ale nie zauważyłem żadnej różnicy. Mógłbym w else po prostu ustawić PORTB tak aby silniki stały ale wydaje mi się to złym rozwiązaniem. Chciałbym żeby program działał tak że jeśli przycisk jest wciśnięty wykonuje on instrukcje a kiedy zostanie on zwolniony to mikroprocesor sprawdza cały czas czy nie został wciśnięty któryś przycisk jeśli tak to ponownie wykonuje instrukcje aż przycisk nie zostanie puszczony itd.

Generalnie to należy napisać nieco inaczej, ale poratować się możesz stosują konstrukcję z else if:

  if(PIND & (1<<PD2)){

    pwm_max (); 
    PORTB=0xFA; 
    _delay_ms(100); 

 }else if(PIND & (1<<PD3)){

    ... //tutaj wstaw kod 

 }else if(PIND & (1<<PD4)){

    ... //tutaj wstaw kod

 }else if(PIND & (1<<PD5)){

    ... //tutaj wstaw kod

 }else{
    //tutaj wyłączenie PWM
    ...
 }

Więcej tutaj: http://www.java2s.com/Tutorial/C/0120__Statement/Theifelseifstatement.htm

I nie stosuj liczb 0x04 tylko przesuwanie bitu w lewo: (1<

Odpowiednio pozostałe tak samo pozmieniaj. Wzrasta czytelność kodu i łatwiej go przonosić pomiędzy procesorami.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...