Skocz do zawartości

Atmega644 - Dziwne działanie bez programatora


Pomocna odpowiedź

Napisano

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?

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

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 ....

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...