[C] sprawdzenie kodu

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
picassek
-
Posty: 4
Rejestracja: 03 cze 2010, 13:52
Lokalizacja: Sosnowiec

[C] sprawdzenie kodu

Post autor: picassek » 20 cze 2010, 21:08

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 458 razy

Awatar użytkownika
c4r0
Moderator
Posty: 2150
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 20 cze 2010, 21:20

Nie wiem jaki sens ma ten post - spróbuj skompilować program, a kompilator lepiej niż ktokolwiek inny wskaże Ci błędy w kodzie. Jak doprowadzisz do tego, że będzie się poprawnie kompilował, to też możesz przecież sprawdzić sam czy działa, a jeśli coś nie działa to sprawdzić przynajmniej co, a może i uda się samemu dojść dlaczego nie działa. Dopiero jak będzie jakiś problem, który będzie ciężko rozwiązać należy zgłosić się na forum dokładnie opisując o co chodzi...

atelszewski
Użytkownik
Posty: 143
Rejestracja: 12 sie 2005, 9:36
Lokalizacja: Banie

Post autor: atelszewski » 20 cze 2010, 22:37

Witam,

Ten kod w ogóle się nie skompiluje poprawnie, gdyż jest mieszanką C i Basic-a.

ODPOWIEDZ