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

Tu piszemy wiadomość, jeżeli zadanie domowe sprawia kłopot
i szybko potrzebujemy pomocy w rozwiązaniu.
ODPOWIEDZ
picassek
-
Posty: 4
Rejestracja: 03 cze 2010, 13:52
Lokalizacja: Sosnowiec

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

Post autor: picassek » 05 cze 2010, 13:47

Witam, 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.

Kod: Zaznacz cały

$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
Wszystkim zainteresowanym z góry dziękuję za odpowiedź i pozdrawiam
Załączniki
sonar.rar
skompilowany plik napisany w bascomie 51
(4.24 KiB) Pobrany 417 razy
Ostatnio zmieniony 05 cze 2010, 20:58 przez picassek, łącznie zmieniany 2 razy.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 05 cze 2010, 14:30

picassek pisze:sugestie najlepiej w sposób tzw. łopatologiczny jak można osiągnąć postawiony cel
Poszukać kursu/książki do C, zapoznać się z nim/nią i pozmieniać procedury z bascomowych na C. W przypadku obsługi przerwań poszukać gotowych przykładów (są na stronie edw) i wzorując się na nich przenieść do programu.
Na to, że ktoś za Ciebie to zrobi nie liczyłbym, więc zostaje pouczenie się C.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 05 cze 2010, 14:33

A co ten program ma robić? Skompilować się go da. Natomiast takie moje pierwsze wrażenie po szybkim oglądnięciu to to że ktoś już go pisał niejako w taki sposób aby miał strukturę pseudo asemblerową.
Instrukcja Delay to nic innego jak instrukcja NOP procesora.

picassek
-
Posty: 4
Rejestracja: 03 cze 2010, 13:52
Lokalizacja: Sosnowiec

Post autor: picassek » 05 cze 2010, 15:49

jest to kod sonaru samochodowego z czujnikami ultradźwiękowymi, w bascomie 51 działa kod bez problemu. Co do kursów to przeczytałem " Programowanie_8051_w_C" , "Mikrokontrolery - To takie proste" zamieszczony w elektronice dla wszystkich" ale nie pomogło mi to za wiele. Wyżej zamieściłem opisany kod, co do niektórych fragmentów nie jestem pewien a paru nie potrafilem opisac.

keruseykaryu

Post autor: keruseykaryu » 05 cze 2010, 20:28

picassek pisze: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
Bez opcji automatycznego przeładowywania jak już.
picassek pisze:Delay // Czas opóźnienia wynosi około 100ms przy częstotliwości taktowania 12MHz.
Pomyliłeś jednostki 100mikrosekund, nie 100milisekund.
kayron pisze:Instrukcja Delay to nic innego jak instrukcja NOP procesora.
NOP nie trwa 100us tylko 1us (przy 12MHz).

ODPOWIEDZ