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.

[Bascom] poprawa opisu oraz stworzenie kodu w C i asemblerze

picassek 04 Cze 2010 17:46 1296 1
  • #1 04 Cze 2010 17:46
    picassek
    Poziom 9  

    Witam, cel pozostał ten sam, lecz zmienił się kod, tym razem bez Lcd, więc
    jako zadanie dostałem opisanie krok po kroku otrzymanego kodu oraz przeniesienie kodu z języka Bascom na kod Asemblera i C. Jako, że programowanie nie jest moją mocną stroną, prosiłbym o pomoc (rady, sugestie najlepiej w sposób tzw. łopatologiczny jak można osiągnąć postawiony cel i jak wogóle się najlepiej za to zabrać) w przetransformowaniu kodu z języka Bascom na język Asemblera i C (o ile nie będzie problemów z jakimiś fragmentami kodu, które dla C mogą być niezrozumiałe) oraz opisaniu kodu bascoma (Ogólnie zaznaczyłem, reszty nie jestem pewien). Mikrokontroler to AT89C2051, a dokładniej jest to zestaw nowy elektronik k 372 " sonar z czujnikami ultradźwiękowymi.

    Code:

    $crystal = 12000000  // ustawienie częstotliwości zegara taktującego procesor (liczba określająca częstotliwość w Hz kwarcu lub oscylatora taktującego procesora)

    $regfile = "89C2051.DAT" // Informuje kompilator, by użył podanego pliku definicji rejestrów, zamiast określonego w opcjach kompilatora.

    Config Timer0 = Timer , Gate = Internal , Mode = 1  // Ustala sposób działania sprzętowego licznika-czasomierza TIMER0 , działa jako licznik 16 bitowy bez możliwości ładowania ? , GATE Służy do uaktywnienia zewnętrznego bramkowania licznika. Do bramkowania przebiegu wykorzystywane jest wejście zewnętrznego przerwania INT. INT0 bramkuje licznik T0 INT1 licznik T1.'Gate = Internal  : brak zewnętrznego bramkowania

    Tmod.3 = 1 // Słowo określa tryb pracy liczników T0 i T1. Sposób pracy każdego licznika określają 4 bity. Starsza czwórka (TMOD.7-TMOD.4) określa tryb pracy licznika T1, młodsza (TMOD.3-TMOD.0) tryb pracy licznika T0.

    Tmod.7 = 0 // Słowo określa tryb pracy liczników T0 i T1. Sposób pracy każdego licznika określają 4 bity. Starsza czwórka (TMOD.7-TMOD.4) określa tryb pracy licznika T1, młodsza (TMOD.3-TMOD.0) tryb pracy licznika T0.

    Gate_alias P3.7 // Instrukcję ALIAS stosuje się do zmiany nazw zmiennych na przyjazne. Jest to szczególnie użyteczne przy nazywaniu rejestrów, czy portów procesora. Można także używać instrukcji ALIAS by nadać nazwę konkretnym bitom w zmiennej.

    Booz_alias P3.0 // to co wyzej   
     Ledy Alias P1 // to co wyzej

    Dim Temp As Long  // deklaracja zmiennej Temp jako liczbę 32 bitową
    Dim Error As Byte // deklaracja zmiennej Error jako bajt 0-255
    Dim B1 As Byte    // deklaracja zmiennej B1 jako bajt 0-255
    Dim B2 As Byte    // deklaracja zmiennej B2 jako bajt 0-255

    Declare Sub Ledy_(nled As Byte , Gd As Byte) // Definiuje nagłówek procedury. Każda procedura musi być zdefiniowana instrukcją DECLARE SUB przed jej pierwszym użyciem w programie. Jest to konieczne, gdyż kompilator musi określić jakie parametry powinny być przekazane procedurze.




    Dim Nled As Byte // deklaracja zmiennej Nled jako bajt 0-255
    Dim Gd As Byte   // deklaracja zmiennej Gd jako bajt 0-255

    On Timer0 Timer0_int // uruchamianie timera
    On Int0 Int0_int    // ??
    Tcon.0 = 0         // wyzerowanie bitów w rejestrze Tcon
    Priority Set Int0  // ustalenie wysokiego priorytetu przerwania Int0
    Enable Interrupts  // włączenie całego systemu przerywań
    Enable Timer0      // włączenie przerywania przepełnienia licznika Timer0
    Disable Int0      //  wyłączenie przerywania Int0 ?

    'Początek programu

    Booz_ = 0          // ustawienie wartości buzzera na 0 ?
    Gate_ = 1          // ? ?
    Call Ledy_(8 , 0)  // wywołuje i wykonuje procedurę włączenia ledów ?

    'Początek pętli głównej

    Do
       Error = 0   // ?
        Th0 = 0   // Bajt MSB licznika Timer0 ?
        Tl0 = 0   // Bajt MSB licznika Timer0 ?
       Gate_ = 0  // ?
        Delay  //
        Delay  // Opóźnia działanie programu na krótki czas.
        Delay  // Można używać instrukcji DELAY by opóźnić działanie programu.
        Delay  // Czas opóźnienia wynosi około 100ms przy częstotliwości taktowania 12MHz.
        Delay  //
       Gate_ = 1 // ?
      Tcon.4 = 1 //   wyzerowanie bitów w rejestrze Tcon ?
    Waitms 1     // wstrzymanie działania programu na 1 milisekundę
        Delay   //
        Delay   //
        Delay   //  Jak wyżej.
        Delay   //
        Delay   //
      Tcon.1 = 0 // wyzerowanie bitów w rejestrze Tcon ?
     Enable Int0 // przerwanie zewnętrzne ?

    Do

     Error.1 = Tcon.5      //  ??

    Loop Until Error > 0 //Wykonuje blok kodu umieszczony wewnątrz pętli jeden raz i powtarza go do czasu gdy zostanie spełniony warunek umieszczony na końcu pętli

       If Error.0 = 1 Then  // jeżeli Error.0 osiągnie wartość 1 wtedy
       Call Ledy_(0 , 0)    // włącza instrukcję włączenia ledów
       Booz_ = 0            // z buzerem nic się nie dzieje   
       Print "T"            // drukuje stałą "T"
    Elseif Error.1 = 1 Then  // jeżeli Error.1 osiągnie wartość 1 wtedy
       B1 = Tl0              // bajt B1 jest równy bajtowi Tl0 licznika Timer0
       B2 = Th0              // bajt B2 jest równy bajtowi Th0 licznika Timer0

    Temp = B2 * 256          // bit B2 zostaje pomnożony przez 256
    Temp = Temp + B1         // do Temp zostaje dodany bit B1

    If Temp < 860 Then       // jeżeli Temp jest mniejsze niż 860 wtedy
       Call Ledy_(8 , 0)     // zapalają się 8 ledów
       Booz_ = 1             // włącza się buzer
    Elseif Temp > 859 And Temp < 2109 Then  // jeżeli Temp jest wiekszy niz 859 i mniejszy od 2109 wtedy
       Call Ledy_(7 , 0)  // włącza sie 7 ledów
       Booz_ = 1          // włącza się buzer
    Elseif Temp > 2108 And Temp < 3359 Then // analogicznie
       Call Ledy_(6 , 0)
       Booz_ = 1
    Elseif Temp > 3358 And Temp < 4609 Then // analogicznie
       Call Ledy_(5 , 0)
       Booz_ = 1
    Elseif Temp > 4608 And Temp < 5859 Then // analogicznie
       Call Ledy_(4 , 0)
       Booz_ = 0  // buzer się nie włącza
    Elseif Temp > 5858 And Temp < 7109 Then
       Call Ledy_(3 , 0)
       Booz_ = 0
    Elseif Temp > 7108 And Temp < 8359 Then
       Call Ledy_(2 , 0)
       Booz_ = 0
    Elseif Temp > 8358 And Temp < 10000 Then
       Call Ledy_(1 , 0)
       Booz_ = 0
    Elseif Temp > 9999 Then // jeżeli Temp większe niz 9999 wtedy
       Call Ledy_(0 , 0)  // nie włączają się ledy
       Booz_ = 0      // nie włącza się buzer

    End If  // konie
    End If
    Waitms 200 // wstrzymanie działania programu na 200 milisekund
    Loop

    'Koniec pętli głównej

    Sub Ledy_(nled As Byte , Gd As Byte)  // rozpoczęcie procedury Ledy oraz definicja zmiennych nled oraz Gd
    Select Case Gd                 // instrukcja wykonująca odpowiedni ciąg instrukcji na podstawie wartości zmiennej Gd
       Case 0 :                     //
          Select Case Nled          // sprawdzenie sprzypadku Nled ?
             Case 0 : Ledy = 255    // ???
             Case 1 : Ledy = 254
             Case 2 : Ledy = 252
             Case 3 : Ledy = 248
             Case 4 : Ledy = 240
             Case 5 : Ledy = 224
             Case 6 : Ledy = 192
             Case 7 : Ledy = 128
             Case 8 : Ledy = 0
          End Select       //  zakończenie wykonywania instrukcji select
       Case 1 :
          Select Case Nled
             Case 0 : Ledy = 255
             Case 1 : Ledy = 127
             Case 2 : Ledy = 63
             Case 3 : Ledy = 31
             Case 4 : Ledy = 15
             Case 5 : Ledy = 7
             Case 6 : Ledy = 3
             Case 7 : Ledy = 1
             Case 8 : Ledy = 0
          End Select   //  zakończenie wykonywania instrukcji select
    End Select        //  zakończenie wykonywania instrukcji select
    B2 = Ledy       //  bit B2 jest równy bitowi Ledy ?
    End Sub         // zakończenie procedury Ledy

    Timer0_int:   //  timer0 ?
    '  Incr Over_count  // zwiększenie wartości zmiennej Over_count o 1
    '  If Over_count > 9 Then  // jeżeli wartość zmiennej Over_count jest większa niż 9 wtedy
    '  Tcon.4 = 0      // wyzerowanie bitów Tcon.4
      Disable Int0    // przerwanie zewnętrzne
       Error.0 = 1    // ? ?
    '  End If       //  koniec pętli if
    Return         

    Int0_int:           //
       Tcon.4 = 0     // wyzerowanie bitów Tcon.4
      Disable Int0   //  przerwanie zewnętrzne
       Error.1 = 1  // ??
    Return

    End

    End

    Wszystkim zainteresowanym z góry dziękuję za odpowiedź i pozdrawiam

    0 1
  • #2 05 Cze 2010 09:53
    ZbeeGin
    Poziom 38  

    Jeśli nigdy nie miałeś większej styczności z SDCC ani z asemblerem MCS51 to tego zadania nie zrobisz w całości. Nawet porządne skomentowanie tego programu wymaga znajomości wewnętrznych struktur procesora z rodziny '51.

    0