Skocz do zawartości

Attiny2313 konfiguracja PWM.


nyta

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.

Link do komentarza
Share on other sites

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 😃

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.