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.
Wszystkim zainteresowanym z góry dziękuję za odpowiedź i pozdrawiam
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