logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Bascom] [Atmega8] Programowanie matryc 4x 8x8

Labix 12 Kwi 2010 18:19 2824 5
  • #1 7952592
    Labix
    Poziom 10  
    Od kilku dni konstruuję linijkę diodową zbudowaną wstępnie z 4 matryc 8x8 (wspólna katoda). Zasada działania jest taka - linie wierszy są sterowane przez tranzystory pnp z Portu D Atmegi8, natomiast do sterowania kolumnami wykorzystałem drivery (SCT2024). Wstępnie układ zmontowałem i podłączyłem wg załączonego schematu.

    [Bascom] [Atmega8] Programowanie matryc 4x 8x8

    Jestem początkującym programistą, więc mam bardzo duży problem z zaprogramowaniem układu. Poniżej prezentuję listing programu którym chciałem przetestować poprawność układu i niestety pojawiają się problemy:
    Z wypożyczonych książek oraz z informacji od osób które mi bardzo pomagają, dowiedziałem się że najlepiej sterować układem wykorzystując SPI. Niestety sprzętowe SPI kompletnie mi nie działa (tzn. przez chwilę idą 'jakiś sygnały' po czym układ zamiera. Programowe SPI działa tak, że gdy daję napięcie na jeden wiersz, na wszystkich matrycach idzie linijka diodowa - układ działa prawidłowo, natomiast gdy odblokowuję większą ilość wierszy - matryce po max 3 sekundach się zawieszają (co dziwne po gdy załączam tylko dwie matryce to działa nawet przy odblokowanych wszystkich wierszach, na 3-4 matrycach zawsze się zawiesza.) Używam programatora USBasp domowej roboty, oraz kompilatora Bascom avr 1.11.9.8

    
    $regfile = "m8def.dat"   
    $crystal = 8000000
    
    Config Portd = Output 
    Config Pinb.1 = output 
     portd = &b11111110  'odblokowana pierwszy wiersz matrycy
    
    
    Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = PortB.2 , Clock = Portb.5
    
    Spiinit
    
    
    LA alias portb.1
    
    dim w1(4) as byte
    
    
    LA=1
    
    do
    w1(1)=&b01010101 
    w1(2)=&b01010101 
    w1(3)=&b01010101 
    w1(4)=&b01010101 
    
    spiout w1(1),4
    
    LA = 1
    waitms 10
    LA = 0
    
    w1(1)=&b10101010
    w1(2)=&b10101010
    w1(3)=&b10101010
    w1(4)=&b10101010
    
     waitms 50
    
     spiout w1(1),4
    lA=1
    waitms 10
    lA=0
    
     waitms 50
    loop
    
    end
    


    Kłopoty z SPI to nie mój jedyny problem, chciałbym to wszystko jakoś zaprogramować, ale moja wiedza jest bardzo słaba, odniosłem pewne sukcesy programując jedną matryce wg książki M. Wiązania, natomiast zupełnie nie radzę sobie z 4 matrycami.
    Będę wdzięczny za okazaną pomoc, bo nie ukrywam, że jest to moja praca zaliczeniowa i mam niewiele czasu...
  • #2 7952741
    Krauser
    Poziom 26  
    Możliwe, że problem jest z zasilaniem. Za mała wydajność.
  • #3 7952902
    Labix
    Poziom 10  
    Podłączyłem właśnie zasilacz ATX - zasilanie idzie z +5V na tranzystory i przez układ 7805 na procesor. Efekt jest taki ze 'mniej się zawiesza', a przy próbie zapalenia całej matrycy, pali sie co najwyżej jedna cała a pozostałe 'próbują się zapalić'. SPI hard nadal nie działa :/
  • #4 7954748
    Robewit
    Poziom 26  
    Zasilanie procesora z napięcia 5V przez stabilizator 7805 to niedobry pomysł.
    Podłącz 12V z zasilacza na stabilizator i powinno być dobrze. Oczywiście warto dodać na stabilizatorze od wejścia i wyjścia do masy kondensatory 100nF.
  • #5 7954828
    Logan
    Poziom 30  
    Skoro zasilanie idzie z zasilacza ATX to po cholerę jeszcze stabilizator ? Podłączenie pod 12V to też nie jest najmądrzejszy pomysł, ze względu na straty.
  • #6 7956012
    Labix
    Poziom 10  
    Problem zasilania, został częściowo rozwiązany problem polegał na tym ze zasilanie na drivery sterujące należał podpiąć dodatkowo pod kondensator i rezystor. Obecnie pracuję na dość nieprofesjonalnie złożonym układzie 4 matryc więc przy ostatecznym składaniu matrycy wszystkie elementy zabezpieczająco-filtrujące zostaną uwzględnione.

    Proszę natomiast bardzo o pomoc w stworzeniu programu w Bascomie który by coś wyświetlał, bo jak wspomniałem moja wiedza w tym zakresie jest bardzo niewielka... Jak może wyglądać koncepcyjnie program - mam na uwadze wzornictwo na podstawie porgramu z książki m. wiazania (kod jest Tutaj)

    Dodano po 4 [godziny] 33 [minuty]:

    Otóż chciałem się 'pochwalić' swoją niewiedzą na temat programowania w Bascomie i prezentuję swój program, oczywiście niedziałający w celu być może dalszej jego obróbki.

    Zasada działania powinna być taka, że wykorzystując SPI wysyłam binarnie dane do wierszy a nie do kolumn. Chciałbym wyswietlić na matrycy to co jest na dole (fonts)...

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Portd = Output
    Config Pinb.1 = output
    
    
    Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = PortB.2 , Clock = Portb.5
    
    Spiinit
    
    
    LA alias portb.1
    
    Wiersz1 alias portd.0
    Wiersz2 alias portd.1
    Wiersz3 alias portd.2
    Wiersz4 alias portd.3
    Wiersz5 alias portd.4
    Wiersz6 alias portd.5
    Wiersz7 alias portd.6
    Wiersz8 alias portd.7
    
    
    Dim W1(4) As Byte
    Dim W2(4) As Byte
    Dim W3(4) As Byte
    Dim W4(4) As Byte
    Dim W5(4) As Byte
    Dim W6(4) As Byte
    Dim W7(4) As Byte
    Dim W8(4) As Byte
    
    dim nr_wiersz as byte
    
    
    
    Declare Sub Pobierz_znak
    
    
    Sub Pobierz_znak
    
    Select Case Nr_wiersz
    
      Case 0:
      W1(4) = Lookup(0 , Fonts)
      Case 1:
      W2(4) = Lookup(1 , Fonts)
      Case 2:
      W3(4) = Lookup(2 , Fonts)
      Case 3:
      W4(4) = Lookup(3 , Fonts)
      Case 4:
      W5(4) = Lookup(4 , Fonts)
      Case 5:
      W6(4) = Lookup(5 , Fonts)
      Case 6:
      W7(4) = Lookup(6 , Fonts)
      Case 7:
      W8(4) = Lookup(7 , Fonts)
    
    End Select
    End Sub
    
    
    
    
    
    La = 1
    
    
      Reset Wiersz1
      Reset Wiersz2
      Reset Wiersz3
      Reset Wiersz4
      Reset Wiersz5
      Reset Wiersz6
      Reset Wiersz7
      Reset Wiersz8
    
    
     Select Case Nr_wiersz
    
     Case 0:
      Set Wiersz1
      Spiout W1(1) , 4
      Waitms 50
      Toggle La
     Case 1:
      Set Wiersz2
      Spiout W2(1) , 4
      Waitms 50
      Toggle LA
     Case 2:
      Set Wiersz3
      Spiout W3(1) , 4
      Waitms 50
      Toggle LA
     Case 3:
      Set Wiersz4
      Spiout W4(1) , 4
      Waitms 50
      Toggle LA
     Case 4:
      Set Wiersz5
      Spiout W5(1) , 4
      Waitms 50
      Toggle LA
     Case 5:
      Set Wiersz6
      Spiout W6(1) , 4
      Waitms 50
      Toggle LA
     Case 6:
      Set Wiersz7
      Spiout W7(1) , 4
      Waitms 50
      Toggle LA
     Case 7:
      Set Wiersz8
      Spiout W8(1) , 4
      Waitms 50
      Toggle LA
    
     End Select
     Incr Nr_wiersz
     La = 0
     waitms 50
     Toggle La
    
     If Nr_wiersz = 8 Then
    
        Nr_wiersz = 0
    
       End If
    
    
    end
    
    Fonts:
    Data &B00011000 , &B00100100 , &B00100100 , &B01111110 , &B01000010 , &B10000001 , &B10000001
    



    Pytanie jest oczywiste, jak poprawić program, aby działał!
REKLAMA