Skocz do zawartości

Atmega644 - Dziwne działanie bez programatora


Panicz74

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?

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

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
Link do komentarza
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 ....

Link do komentarza
Share on other sites

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

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.