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

[AtMega8][Bascom] Moja płytka nie działa

maximus22_kr 08 Sie 2011 16:27 2880 9
REKLAMA
  • #1 9803699
    maximus22_kr
    Poziom 18  
    Witam
    Zachęcony sukcesami z płytką EVB 4.3 zaprojektowałem i zamówiłem swoją - na początek z AtMega8 w DIP. Do tego pamięć 24C32 oraz układ do RS485. Wszystkie układy mają kondensatory 100 nF ( stabilizator 7805 również + jeden elektrolit ). Całość ze złączem pod wyświetlacz 2*24 ( właściwe 4*12 )
    Reset przez rezystor 10 K do +5V
    AtMega8L ( na 8 MHz max )
    Kwarc 8 MHz około 1 cm od układu + dwa kondensatory 18 pF
    Fusebit
    KLA987 001111
    BODLEVEL 4.0V
    BODEN: Disabled

    Przykładowe programy wyświetlający tekst oraz drugi regulujący jasność podświetlania przez PWM działają poprawnie to trzeci ( działający poprawnie na Mega32 ) mający obsługiwać termometr na DS18B20 niestety świruje, wyświetla krzaki, kilka razy udało się, że zadziałał jednak po resecie przyciskiem już nie.
    RESET też dziwnie działa - powinno chyba wszystko zniknąć z ekranu przy naciśnięciu RESET, świecą się dwie linie.

    Dodatkowo nie wyświetla moich znaków, które sobie utworzyłem przez Deflcdchar - wyświetlane jest coś zupełnie innego - jakieś krzaczki

    Czy problem może być w Fusebitach lub w pracy procesora na granicy częstotliwości ?

    Program wygląda tak:
    
    $regfile = "m8def.dat"                                      'definicja procesora
    $crystal = 8000000                                          'taktowanie procesora
    $hwstack = 32                                               ' rozmiar stosu sprzętowego
    $swstack = 10                                               ' rozmiar stosu
    $framesize = 40                                             ' rozmiar ramki
    
    Config Debounce = 30
    
    '********************* Konfiguracja wyświetlacza
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portc.3 , Rs = Portc.1
    Config Lcd = 24 * 2
    
    '********************* Konfiguracja znaku specjalnego LCD
    
    Deflcdchar 0 , 8 , 20 , 8 , 32 , 32 , 32 , 32 , 32          ' znak stopnia celcjusza
    
    '********************* Konfiguracja magistrali I2C
    
    Config I2cdelay = 10                                        ' domyślnie tryb Slow
    Config Sda = Portc.4
    Config Scl = Portc.5
    
    '********************* Konfiguracja podświetlania
    Config Portc.2 = Output                                     'Pin R/W wyświetlacza
    Reset Portc.2
    
    Config Portb.0 = Output                                     'Podswietlanie Niebieskie
    Set Portb.0
    
    'Config Portb.1 = Output                                     'Podswietlanie Czerwone
    'Reset Portb.1
    
    'Config Portb.2 = Output                                     'Podswietlanie Zielone
    'Set Portb.2
    
    '********************* Konfiguracja magistrali 1-Wire
    
    Config 1wire = Portc.0
    
    '********************* Konfiguracja Timer2
    
    'Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
    'Enable Timer1
    
    Enable Interrupts
    
    '********************* Deklaracje zmiennych
    
    Dim Ds1(8) As Byte                                          'zmienna określająca numer układu
    Dim Ds2(8) As Byte                                          'zmienna określająca numer układu
    Dim Ss1 As String * 6
    Dim Ss2 As String * 6
    Dim T1 As Integer                                           'zmienna odczytu dwóch bajtów z DS18B20
    Dim T2 As Integer                                           'zmienna odczytu dwóch bajtów z DS18B20
    
    '********************* Deklaracja podprogramów
    
    '********************* Przypisanie przyjaznych nazw do poszczególnych portów - Aliasów
    
    '********************* Wartości początkowe
    
    Cursor Off
    Cls
    
    Ds1(1) = 1wsearchfirst()                                    'szukanie pierwszego układu
    Ds2(1) = 1wsearchnext()
    
    'Pwm1a = 140                                                 'podświetlanie czerwone
    
    'Pwm1b = 0                                                   'podświetlanie zielone
    
    Do
    
    'Locate 1 , 13
    'Lcd "test"
    
    Locate 2 , 13
    Lcd Chr(0)
    
    '********** magistrala 1-wire wejście 1 czujnik 1
    Disable Interrupts
    
    1wreset                                                     'reset magistrali 1-wire
    1wwrite &H55                                                'rozkaz adresowy SKIP ROM
    1wverify Ds1(1)                                             'sprawdź adres
    1wwrite &HBE                                                'rozkaz funkcyjny polecenie odczytu DS18B20
    T1 = 1wread(2)                                              'odczytaj dwa pierwsze bajty
                                                     
    '********** magistrala 1-wire wejście 1 czujnik 2
    
    1wreset                                                     'reset magistrali 1-wire
    1wwrite &H55                                                'rozkaz adresowy SKIP ROM
    1wverify Ds2(1)                                             'sprawdź adres
    1wwrite &HBE                                                'rozkaz funkcyjny polecenie odczytu DS18B20
    T2 = 1wread(2)                                              'odczytaj dwa pierwsze bajty
                                                  
    '********** konwersja temperatury dla drugiego DS18B20
    1wreset
        1wwrite &HCC
        1wwrite &H44
    
    Enable Interrupts
    
    '**************** pierwsze wejście - pierwszy DS18B20 obliczenia + wyświetlanie **********
    
    T1 = T1 * 10
       T1 = T1 / 16
       Ss1 = Str(t1)
       Ss1 = Format(ss1 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku
    
    Locate 1 , 1                                                'wyświetl w pozycji
    Lcd Ss1 ; " C "                                             'wyświetl wynik formatowania + znak specjalny + C
    
    
    '**************** pierwsze wejście - drugi DS18B20 obliczenia + wyświetlanie **********
    
    T2 = T2 * 10
       T2 = T2 / 16
       Ss2 = Str(t2)
       Ss2 = Format(ss2 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku
    
    Locate 2 , 1                                                'wyświetl w pozycji
    Lcd Ss2 ; " C "                                             'wyświetl wynik formatowania + znak specjalny + C
    
    Loop
    End
    
  • REKLAMA
  • #2 9803797
    xamrex
    Poziom 28  
    maximus22_kr napisał:
    RESET też dziwnie działa - powinno chyba wszystko zniknąć z ekranu przy naciśnięciu RESET, świecą się dwie linie.


    Nie,
    Ja mam płytkę startową od Pana Mirka, i również po wciśnięciu reset, nie 'czyści' się ekran wyświetlacza (co nie znaczy, że rest nie działa)
    Po prostu, bo wciśnięciu reset, program wykonuje się od początku i jeśli nie ma na samym początku programu funkcji czyszczącej ekranu, to ekran się nie wyczyści i będzie wyświetlał to co poprzednio.
  • REKLAMA
  • #3 9803816
    mirekk36
    Poziom 42  
    Dokładnie jak pisze przedmówca ;) .... RESET na płytce podłączony jest tylko do procesora a nie do układów na LCD. Zresztą LCD nie ma nawet wyprowadzonego takiego sygnału RESET. Zatem ma on możliwość zresetowania swojej zawartości albo programowo CLS albo poprzez wyłączenie zasilania.
  • REKLAMA
  • #5 9805353
    maximus22_kr
    Poziom 18  
    Zmiana kwarcu na 4 MHz nic nie pomogła, na każdej z płytek jest tak samo, czyli zły montaż nie wchodzi w grę.

    Raczej obstawiam Fusebity

    Jak prawidłowo ustawić fusebit KLA987 dla zewnętrznego kwarce 4 MHz, 6MHz i 8 MHz ?
    Programuje procesor programem wbudowanym w Bascom.
  • #6 9805500
    piotrva
    VIP Zasłużony dla elektroda
    No to w tym programatorze BASCOM'a masz przecież listy rozwijane, np. cksel i sut masz na liście rozwijanej i wybierasz tam external cristal oscilator i pożądany przedział częstotliwości...
  • #7 9805801
    maximus22_kr
    Poziom 18  
    Tzn. chodzi o zakładkę Lock and Fuse bits ?
    Jeśli tak to mam w niej
    Chip
    Name: MEGA8
    Calibration 0: 9F
    Calibration 1: 9F
    Calibration 2: 99
    Calibration 3: 99

    Lockbits FF
    Lockbit 65: 11
    Lockbit 43: 11
    Lockbit 21: 11

    Fusebit 7D
    Fusebit C: 0:BODLEVEL 4.0V
    Fusebit B: 1:BODEN disabled
    Fusebit KLA987: 111101: Ext. Crystal/Resonator Medium Freq.

    Fusebits High C0
    Fusebits High M 1: PC6 is RESET
    Fusebits High J 1:WDT enabled by WDTCR
    Fusebits High I 0: SPI enabled
    Fusebits High H 0:CKOPT 0
    Fusebits High G: 0:Preserve EEPROM when chip erase
    Fusebits High FE 00: 1024 words boot size
    Fusebits High D 0:Reset Vector is boot loader reset

    Według MKAVR Calculator dla 3-8 MHz powinno być
    CKSEL = 1101
    SUT = 11

    czyli KLA987 = SUT + CKSEL 11 1101

    na wyświetlaczu cały czas są bardziej podświetlone 1 i 3 linia i na nich wyświetlają się różne znaczki, podkreślenie, pytajnik i zero.

    Nie ma problemu z wyświetlaniem jednej linii, natomiast dwóch i więcej tak.
    wyświetlenie napisu TEST - po jednym w każdej linijce nie udaje się, może procesor się nie wyrabia takim wyświetlaczem.

    Czy pin R/W ma być podłączony do GND ?
    Martwi mnie to, że z czasem jest coraz gorzej, przedwczoraj jak skoczyłem montaż płytek, to działało większość, nawet mierzył temperaturę z dwóch DS18B20.

    Poszukam jeszcze zwykłej Atmega8 bez L, ale to chyba nie to.
    No chyba, że do wersji z L trzeba mieć jakieś specjalne podejście. Moja to AtMega8L-8PU w DIP28. Teraz na zewnętrznym kwarcu 4 MHz.
  • REKLAMA
  • #8 9806248
    maximus22_kr
    Poziom 18  
    Może pokażę widok płytki - czy lokalizacja może coś powodować
    Może kwarc jest za daleko ? Pod samym kwarcem nic nie idzie, linie do złaćza LCD są po jego bokach

    [AtMega8][Bascom] Moja płytka nie działa
  • #9 9985621
    superhiro2
    Poziom 15  
    Cytat:
    czyli KLA987 = SUT + CKSEL 11 1101

    Nie, KLA987 = cksel + sut, czyli musisz mieć 110111
  • #10 9987291
    Konto nie istnieje
    Poziom 1  
REKLAMA