Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

[C] sprawdzenie kodu

picassek
-
-
Posty: 6
Rejestracja: 5 cze 2010, o 15:26
Lokalizacja: sosnowiec

[C] sprawdzenie kodu

Postautor: picassek » 20 cze 2010, o 21:06

witam, z góry zaznaczam, że moja wiedza na temat programowanie jest jeszcze skromna, dlatego chciałbym, żeby ktoś sprawdził moje "wypociny" i powiedział, czy ten program ma wogóle jakis sens, gdzie są błędy, bo napewno są oraz jak je poprawić. Poniżej umieszczam kod.

Kod: Zaznacz cały

#include <REG2051.H> #include <stdio.h> Config Timer0 = Timer, Gate = internal, Mode = 1 #define OSC_FREQ (12000000UL) #pragma language=extended void main (void) { T0_GATE_ = 1; T1_GATE_ = 0 ; sbit Buzer P^3.0; sbit led_1 P^1.7; sbit led_2 P^1.6; sbit led_3 P^1.5; sbit led_4 P^1.4; sbit led_5 P^1.3; sbit led_6 P^1.2; sbit led_7 P^1.1; sbit led_8 P^1.0; sbit Gate_ P^3.7; long int Temp; unsigned char Error; unsigned char B1; unsigned char B2; unsigned char Nled; unsigned char Gd; void Ledy () { unsigned char nled; unsigned char Gd; } void LEDS () { led_1 = 1; led_2 = 1; led_3 = 1; led_4 = 1; led_5 = 1; led_6 = 1; led_7 = 1; led_8 = 1; } void delay() { volatile int i; for(i = 0 ; i < 500000 ; i++ ); } int TIMER0 TIMER0_int; INT0 = 1; EX0 = 1; IT0 = 0; P3_0 = 0; P3_7 = 1; LEDS (); do { Error = 0; TH0 = 0; TL0 = 0; Gate_ = 0; delay(); Gate_ = 1; TR0 = 1; Waitms 1; delay(); IE0 = 0; INT0; } do { Error.1 = TFO; Loop Until Error > 0; if Error.0 = 1 then LEDS = 0; P3_0 = 0; else Error.1 = 1 then B1 = TL0; B2 = TH0; Temp = B2 * 256; Temp = Temp + B1; if Temp < 860 then P1_0 = 1; P1_1 = 1; P1_2 = 1; P1_3 = 1; P1_4 = 1; P1_5 = 1; P1_6 = 1; P1_7 = 1; P3_0 = 1; else Temp > 859 & Temp < 2109 then P1_0 = 1; P1_1 = 1; P1_2 = 1; P1_3 = 1; P1_4 = 1; P1_5 = 1; P1_6 = 1; P1_7 = 0; P3_0 = 1; else Temp > 2108 & Temp < 3359 then P1_0 = 1; P1_1 = 1; P1_2 = 1; P1_3 = 1; P1_4 = 1; P1_5 = 1; P1_6 = 0; P1_7 = 0; P3_0 = 1; else Temp > 3358 & Temp < 4609 then P1_0 = 1; P1_1 = 1; P1_2 = 1; P1_3 = 1; P1_4 = 1; P1_5 = 0; P1_6 = 0; P1_7 = 0; P3_0 = 1; else Temp > 4608 & Temp < 5859 then P1_0 = 1; P1_1 = 1; P1_2 = 1; P1_3 = 1; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; P3_0 = 0; else Temp > 5858 & Temp < 7109 then P1_0 = 1; P1_1 = 1; P1_2 = 1; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; P3_0 = 0; else Temp > 7108 & Temp < 8359 then P1_0 = 1; P1_1 = 1; P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; P3_0 = 0; else Temp 8358 & Temp 10000 then P1_0 = 1; P1_1 = 0; P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 0; P1_6 = 0; P1_7 = 0; P3_0 = 0; else Temp > 9999 then LEDS = 0; P3_0 = 0; } switch (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 = 8; } switch (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; } B2 = Ledy; void Timer0() { Over++; if Over > 9 then TR0 = 1; INT0 = 0; } void Int0() { TR0 = 0; INT0 = 0; Error.1 = 1; } }
oraz co powinien mniej więcej robić ten program:
na początku powinna zostać ustawiona wartość kwarcu na 12 Mhz, następnie powinien zostać ustawiony Timer jako licznik 16 bitowy bez automatycznego ładowania, uaktywnienie bramkowania T0_Gate, bramka T0_Gate powinna mieć wartość 0, przypisanie Buzera do portu 3.0, przypisanie Gate_ do portu 3.7, diody znajdują sie w portach od 1.0 do 1.7, deklaracja Temp jako liczby 32 bitowej, deklaracja Error, B1, B2, Nled, Gd jako bajt przyjmujący wartości 0 - 255, następnie powinien zostać uruchomiony Timer0, przerwanie niskim poziomem sygnału przerywającego (IT0=0), włączenie systemu przerwań, włączenie przerwania przepełnienia licznika Timer0, wyłączenie przerwania INT0, buzer wartość 0, Gate wartość 1, chwilowe wywołanie diod, pętla "do", a w niej : wartości 0 na Gate, Error, TH0 oraz TL0, opóźnienie 500 ms, wartość Gate równa 1, przyłączenie (TR0=1) źródła zliczanych impulsów do wejścia licznika T0, wstrzymanie na 1 milisekundę, ponowne opóźnienie 500 ms, zgłoszenie przerwania na INT0, włączenie INT0, koniec pętli, następna pętla "do" : Error.1 jest równy przepełnieniu licznika T0, sprawdzenie przepełnienie licznika będzie wykonane przynajmniej raz i będzie powtarzane do momentu gdy przyjmie wartość inną niż 0. wywołanie diod, buzer wyłączony, jeżeli Error.1 będzie równy 1 wtedy, bit B2 jest równy bitowi TL0 a B2 jest równy TH0, Temp = B2*256, Temp = Temp + wartość B1, i teraz następuje pomiar odległości : jezeli wartość mniejsza niż X to nie włączają się diody, nie włącza się buzer, następnie jeżeli wartość Temp większa od x i mniejsza od Y to włącza sie 8 diod oraz buzer, przy kolejnej wartości włącza sie 7 diod i buzer itd aż wyjdzie poza zakres pomiaru. Później sprawdzane są przypadki w "Ledy" a na końcu zadeklarowany jest Timer0 oraz Int0.
Załączniki
program.rar
(1.69 KiB) Pobrany 439 razy

Guru
-
-
Posty: 250
Rejestracja: 30 cze 2003, o 13:26
Lokalizacja: Kraków

Postautor: Guru » 21 cze 2010, o 13:16

Wyrzuć wszystkie procedury przed procedurę void main (void)
czyli:
void Ledy ()
{....}
void LEDS ()
{....}
void delay()
{....}

i dopiero procedura
void main (void)
{...}

- a tak wogóle to ten program się kompiluje??

picassek
-
-
Posty: 6
Rejestracja: 5 cze 2010, o 15:26
Lokalizacja: sosnowiec

Postautor: picassek » 22 cze 2010, o 09:08

w dev++ nie chciał sie skompilować bo co chwile był problem z biblioteką obsługującą mikrokontroler, walcze teraz z M-IDE Studio for MCS-51, ale po wybraniu odpowiedniego mikrokontrolera jest problem z portem 3.0 "sbit Buzer P3_0;" -> error.token.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 22 cze 2010, o 10:12

Takie niszowe oprogramowanie może sobie nie radzić ze spacją przed średnikiem:

Kod: Zaznacz cały

T1_GATE_ = 0 ; ^ sbit Buzer P^3.0;

Guru
-
-
Posty: 250
Rejestracja: 30 cze 2003, o 13:26
Lokalizacja: Kraków

Postautor: Guru » 22 cze 2010, o 10:31

OK Dev++ to środowisko w którym piszesz program, czyli programik który odpowiada za to żeby ładnie kod wyglądał na ekranie.
Napisz z jakiego kompilatora korzystasz, wówczas można będzie coś więcej powiedzieć o błędach w kodzie.

picassek
-
-
Posty: 6
Rejestracja: 5 cze 2010, o 15:26
Lokalizacja: sosnowiec

Postautor: picassek » 23 cze 2010, o 23:04

używam M-IDE Studio for MCS-51 a w nim jest zintegrowany kompilator SDCC C Compiler.
Pozdrawiam,

Guru
-
-
Posty: 250
Rejestracja: 30 cze 2003, o 13:26
Lokalizacja: Kraków

Postautor: Guru » 24 cze 2010, o 07:17

Może należy rozpocząć przygodę z C od programiku, który będzie mrugał diodą na wybranym porcie.
Potem dojedziemy do obsługi liczników i przerwań :-)

Więc zaczynamy:

Kod: Zaznacz cały

#include <REG2051.H> __sbit __at (0x80) P0_0; //tak definiujemy bit void delay() { int i,j; for(j=0;j<100;j++) for(i=0;i<0xFFFF;i++); } void main (void) { P0_0 = !P0_0; delay(); }

picassek
-
-
Posty: 6
Rejestracja: 5 cze 2010, o 15:26
Lokalizacja: sosnowiec

Postautor: picassek » 24 cze 2010, o 17:08

programik kompiluje się bez problemu :) czyli dioda ma opóźnienie 100 ms, to jak teraz zrobić poprawnie, żeby zapalały się wszystkie diody? definiuje wszystkie porty od 1.0 do 1.7 i delay pozostawiam bez zmian a do funkcji main dopisuje komendy na wzór "P0_0 = !P0_0;"?
Pozdrawiam.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 23 gości