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

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

maximus22_kr 08 Sie 2011 16:27 2490 9
  • #1 08 Sie 2011 16:27
    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:

    Code:

    $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

    0 9
  • #2 08 Sie 2011 16:54
    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.

    0
  • #3 08 Sie 2011 16:59
    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.

    0
  • #4 08 Sie 2011 17:27
    xury
    Poziom 38  

    No i co i za tym idzie jeśli nie ma w programie CLS przed użyciem własnych zdefiniowanych znaków to te znaki nie będą wyświetlane.

    0
  • #5 08 Sie 2011 22:29
    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.

    0
  • #7 09 Sie 2011 00:38
    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.

    0
  • #8 09 Sie 2011 10:00
    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

    0
  • #9 02 Paź 2011 16:15
    superhiro2
    Poziom 15  

    Cytat:
    czyli KLA987 = SUT + CKSEL 11 1101

    Nie, KLA987 = cksel + sut, czyli musisz mieć 110111

    0
  • #10 02 Paź 2011 22:24
    emarcus
    Poziom 35  

    maximus22_kr napisał:

    Jak prawidłowo ustawić fusebit KLA987 dla zewnętrznego kwarce 4 MHz, 6MHz i 8 MHz ?
    Programuje procesor programem wbudowanym w Bascom.


    Jeżeli programujesz z programu Bascom to nie wzoruj się na kolejności bitów stosowanych przez Mirka (MK AVR), albo Engbedded AVR Fuse Calculator.
    Bascom stosuje syntax: [SUT0:1, CKSEL3:0] ; gdy tymczasem dwa pozostałe calculatory fuse bitów trzymają się kolejności zapisu [CKSEL3:0, SUT0:1].
    Zatem więc dla 4 MHz (medium freq.):
    W Bascom KLA987 wybrałbym 11 1101 albo 10 1101
    odpowiednikiem w 'Engbedded...' byłby to: 1101 11 albo 1101 10

    Praktyczniejszy jest AVR Studio, gdzie po wybraniu odpowiedniej wartości ustawień z rozwiniętej listy, program koryguje wartości hex (dla obydwu bajtów: Low & High) gotowe do wpisu, które można zweryfikować przed ostatecznym kliknięciem na "Program". Ponadto jeżeli znamy 'nowa' wartość fusebajtów w notacji hex,to jest możliwość bezposredniej edycji tych wartosci w tabeli z pominięciem rozwijanej listy.
    Bascom tego nie robi, więc nie ma pewności co faktycznie będzie wpisane do pamięci processora przed dokonaniem wpisu. Późniejsza weryfikacja wpisu może okazać się nie możliwa, szczególnie dla początkujących i nie uważnych programistów.

    e marcus

    0