Skocz do zawartości
Panicz74

Atmega644 - Dziwne działanie bez programatora

Pomocna odpowiedź

Witam,

Mam taki problem, gdy układ pracuje z podłączonym programatorem wszystko działa elegancko. Jak odłączam taśmę (nie usb) to układ zaczyna robić co mu się podoba. Pewnie coś zmaściłem w schemacie.

Oto schemat:

Zasilacz to popularny "YwRobot MB102 3,3/5V".

Dodatkowo podaję kod programu (steruje on 5 serwami ale do testów na schemacie wystarczy jedno serwo):

/*
* main.c
*
*  Created on: 8 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 KEY3    (1<<PA2)
#define KEY4    (1<<PA3)
#define KEY5    (1<<PA4)
#define KEY6    (1<<PA5)
#define KEY7    (1<<PA6)
#define KEY8    (1<<PA7)
#define KEY9    (1<<PB6)
#define KEY10   (1<<PB7)

#define KEY1_DOWN ( !(PINA & KEY1) )
#define KEY2_DOWN ( !(PINA & KEY2) )
#define KEY3_DOWN ( !(PINA & KEY3) )
#define KEY4_DOWN ( !(PINA & KEY4) )
#define KEY5_DOWN ( !(PINA & KEY5) )
#define KEY6_DOWN ( !(PINA & KEY6) )
#define KEY7_DOWN ( !(PINA & KEY7) )
#define KEY8_DOWN ( !(PINA & KEY8) )
#define KEY9_DOWN ( !(PINB & KEY9) )
#define KEY10_DOWN ( !(PINB & KEY10) )

#define SERVO1 (1<<PB0)
#define SERVO2 (1<<PB1)
#define SERVO3 (1<<PB2)
#define SERVO4 (1<<PB3)
#define SERVO5 (1<<PB4)

#define SERVO_MID       1500
#define SERVO_MIN       1000
#define SERVO_MAX       2500

uint16_t servo1, servo2, servo3, servo4, servo5;
volatile uint8_t key_flag;//informacja dla kompilatora zeby mi sam nie zmienil tej zmiennej

int main(void)
{
       servo1 = servo2 = servo3 = servo4 = servo5 = SERVO_MID;
       PORTA |= KEY1 | KEY2 | KEY3 | KEY4 | KEY5 | KEY6 | KEY7 | KEY8; //podciagnięcie wejsc
       PORTB |= KEY9 | KEY10;
       DDRB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5; //wyjscia
       TCCR1A |= 1<<WGM11;
       TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10;//wszystkie rejestry wyjasnie w gotowej pracy
       TIMSK1 |= 1<<OCIE1A;

       ICR1 = 6000;//rozciagnij, zawez okres

       sei();//uruchomienie przerwań

       while(1)
       {
               if(key_flag)
               {
                       key_flag = 0;
                       if (KEY1_DOWN) //klawisz 1 wcisniety
                       {
                               if(servo1 < SERVO_MAX) servo1++;
                       }
                       if (KEY2_DOWN) //klawisz 2 wcisniety
                       {
                               if(servo1 > SERVO_MIN) servo1--;
                       }

                       if (KEY3_DOWN) //klawisz 3 wcisniety
                       {
                               if(servo2 < SERVO_MAX) servo1++;
                       }
                       if (KEY4_DOWN) //klawisz 4 wcisniety
                       {
                               if(servo2 > SERVO_MIN) servo2--;
                       }

                       if (KEY5_DOWN) //klawisz 5 wcisniety
                       {
                               if(servo3 < SERVO_MAX) servo3++;
                       }
                       if (KEY6_DOWN) //klawisz 6 wcisniety
                       {
                               if(servo3 > SERVO_MIN) servo3--;
                       }

                       if (KEY7_DOWN) //klawisz 7 wcisniety
                       {
                               if(servo4 < SERVO_MAX) servo4++;
                       }
                       if (KEY8_DOWN) //klawisz 8 wcisniety
                       {
                               if(servo4 > SERVO_MIN) servo4--;
                       }

                       if (KEY9_DOWN) //klawisz 9 wcisniety
                       {
                               if(servo5 < SERVO_MAX) servo5++;
                       }
                       if (KEY10_DOWN) //klawisz 10 wcisniety
                       {
                               if(servo5 > SERVO_MIN) servo5--;
                       }
               }
               if(TCNT1 > servo1) PORTB &= ~SERVO1; //nakierowanie mechanizmu przerwania
               if(TCNT1 > servo2) PORTB &= ~SERVO2;
               if(TCNT1 > servo3) PORTB &= ~SERVO3;
               if(TCNT1 > servo4) PORTB &= ~SERVO4;
               if(TCNT1 > servo5) PORTB &= ~SERVO5;
       }
}

ISR (TIMER1_COMPA_vect)
{
       PORTB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5;
       key_flag = 1;
}

Dodatkowo wrzucam film z działaniem z i bez programatora:

Czy ktoś wie co źle zrobiłem?

Udostępnij ten post


Link to post
Share on other sites

Brak rezystora 10k łączącego RESET z VCC...

Udostępnij ten post


Link to post
Share on other sites

Po podpięciu RESET - 10K Ohm - +5V, układ w ogóle nie reaguje bo jest ciągle w stanie resetu 🙁

Udostępnij ten post


Link to post
Share on other sites

Na pewno podpiąłeś reset do vcc a nie gnd? 😃

Podepnij też kondensator 100nF do aref (a drugi koniec do gnd)

Udostępnij ten post


Link to post
Share on other sites

Zrobiłem jak radzisz. Niestety, serwo teraz w ogóle nie reaguje 🙁 Jakieś inne pomysły?

Udostępnij ten post


Link to post
Share on other sites

To pytanie może się wydawać głupie, ale czy na pewno wszystko co ma być podłączone do +5V jest podłączone? Bo po schemacie widać, że VCC procka nie jest połączone z "VCC_5V_ZASILACZ"...

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Panie Złoty!!! Odłączyłem VCC od programatora i włączyłem do 5V zasilacza. Serwo śmiga aż mu się uszy trzęsą 🙂

To się nie popisałem, taka pierdoła ....

Udostępnij ten post


Link to post
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...