Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[BASCOM]Kod z AT90S2313 nie działa na ATTiny2313

mazomen 01 Mar 2009 22:30 2096 6
  • #1
    mazomen
    Level 15  
    Witam.
    Na początku chciałbym zaznaczyć że dopiero zaczynam "przygodę" z mikroprocesorami. Jestem w trakcie przerabiania materiału z książki Pana Góreckiego "Mikroprocesory dla początkujących". Doszedłem do ćwiczenia 29. Generator impulsów- tryb porównywania i natknąłem się na pewien problem. Otóż na portb.3 (oc1) powinien pojawić się sygnał o częstotliwości i długości impulsu ustawionym przez mikroprocesor i obrazowany przez podłączoną do tego portu diodę. U mnie dioda ta wogóle nie świeci i to przy żadnych ustawieniach długości impulsu.

    Używam ATtiny2313 zamiast AT90S2313 oraz BASCOM AVR 1.11.8.1

    Bardzo proszę o pomoc

    Poprawiłem tytuł - regulamin p.11.1 , p.11.2
    [zumek]
  • #3
    janbernat
    Level 38  
    ATtiny2313 to nie jest to samo co AT90S2313.
    Ściągnij noty katalogowe z Atmela i porównaj rejestry.
    BASCOM AVR 1.11.8.1 mógł jeszcze nie obsługiwać dobrze wszystkich funkcji dla ATtiny2313.
    Przynajmniej ja tak miałem w starszej wersji Bascoma
    ale już nie pamiętam w której.
    Ściągnij ze strony MCS wersję BASCOM AVR 1.11.9.3 może pomóc.
    Nowszą wersję ściągnąłem dopiero wczoraj i nie wiem jeszcze czy w ATtiny2313 wszystko obsługuje.
  • #4
    mazomen
    Level 15  
    Oto kod jednego z programów z którym mam problemy:
    
    'C029f.bas          Generator impulsów prostokątnych
    ' UWAGA! Wejsciem EN(able) modułu LCD steruje końcówka PB.1
    ' do wyjscia PB.3 dołączona przez rezystor 1k anoda diody LED (katoda do masy)
    Dim Impuls As Word , Przerwa As Word , Czas As Single , Zmiana As Bit , Napis As String * 9
    Config Timer1 = Timer , Prescale = 256 , Compare A = Toggle , Clear Timer = 1
    On Compare1 Wpis Nosave                                     'po przerwaqniu od COMPARE1 skocz do procedury Wpis
    
    Cls : Lcd "Cwiczenie 29f" : Wait 2                          'na początek pracy programu jednorazowo
    Portd = 127                                                 'podciągnij wejścia, w tym PD.0 i PD.1 - umożliw pracę przycisków S1, S2
    Przerwa = 15625 : Impuls = 6250 : Gosub Wyswietl            'początkowo - przerwa  1s, impuls - 400ms
    Compare1a = Przerwa : Timer1 = 0 : Portd.3 = 0              'T/C1 niech liczy od zera, zgaś diodę
    Enable Interrupts : Enable Compare1a                        'dopiero teraz odblokuj przerwanie COMPARE1
    
    Do                                                          'główna pętla programu
    If Pind.0 = 0 Then                                          'jeśli naciśniety S1
       Incr Przerwa                                             'zwiększ czas przerwy
       Zmiana = 1                                               'ustaw flagę Zmiana
    End If
    If Pind.1 = 0 Then                                          'jeśli naciśniety S1S2
       Incr Impuls                                              'zwiększ czas impulsu
       Zmiana = 1                                               'ustaw flagę Zmiana
    End If
    If Zmiana = 1 Then                                          'wyświetl
       If Pind = 127 Then
          Gosub Wyswietl                                        'ale dopiero po zwolnieniu przycisków
          Zmiana = 0                                            '       jednorazowo
       End If
    End If
    Waitus 200                                                  'szybkość zmian czasów
    Loop : End                                                  'koniec pętli głównej
    
    Wpis:                                                       'obsługa przerwania COMPARE
    If Pinb.3 = 0 Then                                          'nie można Portb.3, tylko właśnie Pinb.3
       Compare1a = Przerwa
       Else
       Compare1a = Impuls
    End If
    Return
    
    Wyswietl:                                                   'procedura wyświetlania wyniku
       Disable Interrupts                                       'zablokuj przerwania, żeby spokojnie wyświetlić wyniki
       Czas = Impuls * 0.064                                    'oblicz czas impulsu w milisekundach
       Napis = Fusing(czas , "#.###")                           'zaokrąglij wynik - trzy miejsca po przecinku
       Cls : Lcd "ON =" ; Napis ; "ms  "                        'wyświetl czas impulsu
       Czas = Przerwa * 0.064                                   'oblicz czas przerwy w milisekundach
       Napis = Fusing(czas , "#.###")                           'zaokrąglij wynik - trzy miejsca po przecinku
       Lowerline : Lcd "OFF=" ; Napis ; "ms  "                  'w dolnej linii wyświetl czas przerwy
       Enable Interrupts                                        'umożliw normalną pracę generatora
    Return


    A jeśli chodzi o noty katalogowe to problem w tym że nie znam angielskiego (w szkole miałem niemiecki :/) a polskich not jeszcze nie znalazłem.

    Proszę stosować znaczniki [code] - uzupełniłem.
    [zumek]
  • #5
    janbernat
    Level 38  
    Zaraz Ci moderator wstawi uwagę kod.
    Kod się wkleja przez "kod"
    Jeśli nie uczyłeś się angielskiego to i tak musisz się go nauczyć w stopniu podstawowym jeżeli chcesz zajmować
    się elektroniką.
    To jak łacina w średniowieczu-cywilizowany człowiek zna chociaż 500 słów.
    Są translatory w googlu i słowniczki- zawsze coś.
    A opisy rejestrów są w wielu książkach po polsku-jak załapiesz o co chodzi to i angielski będzie zrozumiały.
    "Mikrokontrolery ATtiny w praktyce"-R. Baranowski
    "Programowanie mikrokontrolerów AVR w języku Bascom"-M. Wiązania.
    A jak wkleisz dobrze kod to pewnie ktoś mądrzejszy
    Ci coś wyjaśni.

    Regulamin p.8.4
    [zumek]
  • Helpful post
    #6
    User removed account
    Level 1  
  • #7
    mazomen
    Level 15  
    Wielkie dzięki atom1477. Po dopisaniu linijki kodu DDRB.3 = 1 program zaczoł działać. Nie musiałem nawet zmieniać BASCOMA.

    Jeszcze raz wielkie dzięki za pomoc :)