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

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

picassek 04 Cze 2010 17:46 1728 1
  • #1 8154983
    picassek
    Poziom 10  
    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.

    
    $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
  • #2 8156949
    ZbeeGin
    Poziom 39  
    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.
REKLAMA