Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATtiny 2313 prawidłowe podłączenie

GregoriusPL 23 Mar 2013 02:22 1380 8
  • #1 23 Mar 2013 02:22
    GregoriusPL
    Poziom 10  

    Mam problem który nie daje mi swobodnie rozwijać swoich umiejetności programowania. Otóż jak wygląda prawidłowe podłączenie attiny 2313? Jaki rezystor do reseru, czy wpinać kondensator do masy ( jeśli tak to jaki)? W zależnośći czy podłącze kondensator czy nie to mikroprocesor działa zupełnie inaczej i nie wiem do końca czy to program jest zły czy podłączenie.

    Taka sytuacja np: podłączony mam do uC wyświetlacz LED, gdy mam wpięty kondensator 100nF do masy to gdy przycisk niewciśniety nic sie nie świeci, jak wcisne to sie wszystko zapala. Gdy nie ma tego kondensatora to wszystko się zapala i mikrokontroler nie reaguje zupełnie na przycisk. Prosze o pomoc bo juz naprawde nie wiem które ustawienie jest prawidłowe.

    0 8
  • Arrow Multisolution Day
  • #2 23 Mar 2013 07:14
    Rokita1993
    Poziom 19  

    Wstępnie powiem ci, że rezystor między RESET'em a Vcc (zasilaniem) musi być i musi zawierać się w przedziale 4K7-20K Ohm. Zalecany 10K Ohm.
    Kondensator między Vcc a Gnd (masą) też jest obowiązkowy. Stosuje kondensator ceramiczny 100nF.

    Co do rozwiązania twojego problemu to musisz pokazać schemat według którego podłączasz układ i program jaki wgrywasz do uC.

    Pozdrawiam :)

    0
  • Arrow Multisolution Day
  • #3 23 Mar 2013 11:16
    GregoriusPL
    Poziom 10  

    schematu nie mam nigdzie rozrysowane ale jest prosty jak budowa cepa. Z zasilania +5V podłączony rezystor 1k do wspólnej anody wyświetlacza 7 seg, z poszczególnych segmentów połączenie z rezystorem 330R( i tu sie zastanawiam czy potrzebne te oporniki są, bo wyświetlacz słabo świeci przy wszystkich zapalonych segmentach) do całego portuB. Klawisz podłączony do PD6 i do masy. Kondensator 100nF do masy z uC

    co do programu ma on służyc do czegos innego ale narazie mam problem zeby wyswietlic chociaż jedna zaplanowaną cyfre

    Code:
    #include <stdio.h>  
    
    #include <string.h> 
    #include <stdlib.h>
    #include <avr/io.h>
    #define SEG_A PB0
    #define SEG_B PB1
    #define SEG_C PB2
    #define SEG_D PB3
    #define SEG_E PB4
    #define SEG_F PB5
    #define SEG_G PB6
    #define SEG_DP PB7
    #define KLAWISZ PD6


    int main(void)
    {
      /* Wszystkie linie portu B będą wyjściami */
      DDRB =0b11111111;
      PORTB = 0b10000000;
       
     
      DDRD = (0<<KLAWISZ);
      PORTD = (1<<KLAWISZ);
     
      while(1)
      {
        /* Jeśli przycisk wciśnięty */
        if(!(PIND = (1<<KLAWISZ)))
        {
         PORTB = (1<<SEG_B)|(1<<SEG_C)|(1<<SEG_F)|(1<<SEG_G);
       
        }
       
      }
     
      }
     
     


    z tego zapisu wynika ze na początku wszystkie segmenty powinny byc zapalone oprocz kropki, a po wcisnieciu przycisku gasic sie powinny 4 segmeny. Efekt jest taki ze na poczatku nic sie nie swieci a po nacisnieciu zapala sie "ósemka"

    0
  • #4 23 Mar 2013 11:34
    Dople
    Poziom 19  

    Nie powinno być rezystora na anodzie, tylko rezystory na katodach.

    0
  • #6 23 Mar 2013 14:26
    GregoriusPL
    Poziom 10  

    Otóż sprawa ma się następująco. W programie ustawiłem zeby tylko wyświetlił mi daną cyfre, nie uwzględniłem nawet klawisza i nie świeci mi się nic. Dopiero jak podłącze mase od raz do uC, pomijając kondensator, segmenty się zapalają. Jak to rozwiązać? Nie mam już pomysłów jak to obejść.

    0
  • #7 23 Mar 2013 14:29
    McMonster
    Poziom 32  

    Jeśli nie przeczytasz informacji w powyższych linkach, to nawet się nie dowiesz, dlaczego nikomu się nie pali, zeby ci pomóc. Mamy z ciebie wyciągać na siłę informacje i wróżyć, co jest nie tak i jak pomóc?

    0
  • #8 24 Mar 2013 15:36
    Rokita1993
    Poziom 19  

    Ewentualnie wrzuć zdjęcia układu, który zbudowałeś w dwóch wersjach. Pierwsza bez kondensatora, a druga z kondensatorem.
    Zastanawia mnie jak ty ten kondensator podłączyłeś. I w tym doszukiwałbym się błędu.

    Pozdrawiam :)

    0
  • #9 24 Mar 2013 17:14
    GregoriusPL
    Poziom 10  

    Juz nie ma problemu, nawet nie będe mówił jak podłączyłem kondensator bo wstyd... Juz jest ok.

    Natomiast mam pytanie odnośnie kodu który ma robić następujacą rzecz: Na początku wyświetlacz wskazuje 0, za każdym naciśnięciem na wyświetlaczu pokazuje się kolejna liczba. Jako liczba 10 jest kropka, i w tym momencie program powinien sie zresetować i znowu powinno byc zero i znowu liczy itp.

    Code:

    #include <stdio.h>
    #include <string.h> 
    #include <stdlib.h>
    #include <util/delay.h> 
    #include <avr/io.h>
    #define SEG_A PB0
    #define SEG_B PB1
    #define SEG_C PB2
    #define SEG_D PB3
    #define SEG_E PB4
    #define SEG_F PB5
    #define SEG_G PB6
    #define SEG_DP PB7
    #define KLAWISZ PD6


    int main(void)
    {
     
      /* Wszystkie linie portu B będą wyjściami */
      DDRB =0b11111111; 
     
     DDRD = (0<<KLAWISZ);
      PORTD = (1<<KLAWISZ);
     
     
      unsigned char cyfra[] = { 
        (1<<SEG_G)|(1<<SEG_DP),                                                            // 0 
        (1<<SEG_A)|(1<<SEG_D)|(1<<SEG_E)|(1<<SEG_F)|(1<<SEG_G)|(1<<SEG_DP),             // 1                              // 1 
        (1<<SEG_C)|(1<<SEG_F)|(1<<SEG_DP),                                                // 2 
        (1<<SEG_E)|(1<<SEG_F)|(1<<SEG_DP),                                               // 3 
        (1<<SEG_A)|(1<<SEG_D)|(1<<SEG_E)|(1<<SEG_DP),                                    // 4 
        (1<<SEG_B)|(1<<SEG_E)|(1<<SEG_DP),                                                // 5 
        (1<<SEG_B)|(1<<SEG_DP),                                                           // 6 




        (1<<SEG_D)|(1<<SEG_E)|(1<<SEG_F)|(1<<SEG_G)|(1<<SEG_DP),                        // 7 
        (1<<SEG_DP),                                                                      // 8 
        (1<<SEG_E)|(1<<SEG_DP),                                                            // 9
        (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(1<<SEG_E)|(1<<SEG_F)|(1<<SEG_G),   //DP
       
      }; 
       
         int a,b;
     
      while(1)
      {
     
      while(!(PIND & (1<<KLAWISZ)))
           
        _delay_ms(75);
        PORTB=cyfra[a];
        b=a+=1;
        while(PIND & (1<<KLAWISZ))
       
        _delay_ms(75);
       
     }
    if(b>10)
     
        {
       

    asm("cli");
    asm("jmp 0");
    }
    }


    do momentu osiągnięcia przez program kropki jest ok, a poźniej cuda się dzieją. Cały wyswietlacz miga i ogólne fajerwerki są. Próbowałem aby zmienna b (czyli a+1) gdy osiągnie wartość 10 to następuje reset programu. No ale coś nie działa. Próbowałem też z watchdogiem, nieudolnie. Można by też do tabelki "wrzucić" reset, ale wklejam to na ostatnią pozycje to wyskakuje błąd express expected before asm. Nie mam już wiecej pomysłów jak sobie z tym poradzić.

    0