Skocz do zawartości

Atmega644 Pozycjonowanie serwa - proszę o sprawdzenie


Panicz74

Pomocna odpowiedź

Witam,

Napisałem taki program:

Przycisk KEY1 daj obrót 2 serw w przeciwnych kierunkach o 180stopni, przycisk KEY2 to samo w drugą stronę.

Program bez problemu się kompiluje i wgrywa, Eclipse nie pokazuje żadnych błędów. Po naciśnięciu któregokolwiek przycisku serwa jednak nie reagują.

/*
* main.c
*
*  Created on: 11 maj 2015
*      Author: Radek
*/


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define KEY1    (1<<PA0)
#define KEY2    (1<<PA1)

#define KEY1_DOWN ( !(PINA & KEY1) )
#define KEY2_DOWN ( !(PINA & KEY2) )

#define SERVO1 (1<<PB0)
#define SERVO2 (1<<PB1)

#define SERVO_MID       1500
#define SERVO_MIN       600
#define SERVO_MAX       4500


uint16_t servo1, servo2;
volatile uint8_t key_flag;

int main(void)
{

DDRB |= SERVO1 | SERVO2;
TCCR1A |= 1<<WGM11;
TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10;
TIMSK1 |= 1<<OCIE1A;

ICR1 = 19999;//rozciagnij, zawez okres

sei();//uruchomienie przerwań

while(1)
        {
                if(key_flag)
                {
                        key_flag = 0;
                        if (KEY1_DOWN) //klawisz 1 wcisniety
                        {
                                servo1 = SERVO_MAX;
                                servo2 = SERVO_MIN;
                        }
                        if (KEY2_DOWN) //klawisz 2 wcisniety
                        {
                                servo1 = SERVO_MIN;
                                servo2 = SERVO_MAX;
                        }
                }
        }
}
ISR (TIMER1_COMPA_vect)
{
       PORTB |= SERVO1 | SERVO2;
       key_flag = 1;
}

Czy ktoś wie co znowu źle zrobiłem w kodzie?

Połączenia są na pewno ok bo bardzo podobny program do sterowanie ręcznego działa.

Link do komentarza
Share on other sites

Wstawiłem linijkę 2 linijki:

if(TCNT1 > servo1) PORTB &= ~SERVO1; 
if(TCNT1 < servo2) PORTB &= ~SERVO2;


Serwo zaczęło reagować, ale tylko to na pinie PB0, serwo na PB1 stoi. Poza tym serwo nie porusza się tak powinno.

[ Dodano: 11-05-2015, 20:34 ]

Problem rozwiązany, powodem były braki w kodzie:

/*
* main.c
*
*  Created on: 11 maj 2015
*      Author: Radek
*/


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define KEY1    (1<<PA0)				// definicja przycików
#define KEY2    (1<<PA1)

#define KEY1_DOWN ( !(PINA & KEY1) )	// definicja wciśniętego przycisku
#define KEY2_DOWN ( !(PINA & KEY2) )

#define SERVO1 (1<<PB0)					// definicja silników
#define SERVO2 (1<<PB1)

#define SERVO_MID       1500			// definicja położenia silnika
#define SERVO_MIN       1000
#define SERVO_MAX       2000


uint16_t servo1, servo2;
volatile uint8_t key_flag;				// zmienna pomijana przez kompilator

int main(void)
{
servo1 = servo2 = SERVO_MID;		// ustawienie początkowe silników
PORTA |= KEY1 | KEY2;				// wyjścia - przyciski
DDRB |= SERVO1 | SERVO2; 			// wyjścia do silników
TCCR1A |= 1<<WGM11;
TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10;//rejestry odpowiedzialne za PWM
TIMSK1 |= 1<<OCIE1A;					// timer dla TCCR1B & TCCR1A

ICR1 = 19999;//rozciagnij, zawez okres

sei();//uruchomienie przerwań

while(1)
        {
                if(key_flag) // jeśli flaga = 0, wykonaj program
                {
                        key_flag = 0;
                        if (KEY1_DOWN) //klawisz 1 wcisniety
                        {
                                servo1 = SERVO_MAX; //ustawienia odpowiednio servo1 i servo2
                                servo2 = SERVO_MIN;
                        }
                        if (KEY2_DOWN) //klawisz 2 wcisniety
                        {
                                servo1 = SERVO_MIN; //ustawienia odpowiednio servo1 i servo2
                                servo2 = SERVO_MAX;
                        }
                }
                if(TCNT1 > servo1) PORTB &= ~SERVO1; //nakierowanie mechanizmu przerwania
                if(TCNT1 > servo2) PORTB &= ~SERVO2;
        }
}
ISR (TIMER1_COMPA_vect)
{
       PORTB |= SERVO1 | SERVO2;
       key_flag = 1;						 // jeśli flaga = 1, program sie wykonał
}
  • Lubię! 1
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

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.