Projekt - Tablica wynikowa

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
Gatz
-
Posty: 1
Rejestracja: 05 cze 2009, 9:31
Lokalizacja: Warszawa
Kontakt:

Projekt - Tablica wynikowa

Post autor: Gatz » 05 cze 2009, 10:04

Witam!

Mam do zrobienia mały projekcik. Bazując na 2 mikrokontrolerach 80C51 mam stworzyć tablice wyświetlające wyniki (taką jakiej np używają do wyświetlania wyników w koszykówce).

Jak widać na schemacie poniżej, mamy 4 przyciski:
1. Ustawia drużyne której punkty modyfikujemy
2. Dodaje 1 punkt
3. Odejmuje 1 punkt
4. Reset

Według wskazówek jakie otrzymałem, tak to powinno zostać zrobione. Pierwszy mikrokontroler powinien zapomocą printf wysłać 4 zmienne ( części dziesiętne i części jedności liczby punktów obu drużyn) do drugiego mikrokontrolera. Tam zostają wrzucone do tablicy. W momencie kiedy wszystkie 4 zmienne będą już w tej tablicy zapalamy sobie stworzoną przez nas flage. Na ten znak mikrokontroler drugi mam skopiować zmienne z tablicy do innej tablicy i z niej wrzucać na wyświetlacze, gasząc przy tam zapaloną wcześniej flagę. Wybrano takie rozwiązanie aby podczas przekazu danych między kontrolerami caly czas był wyświetlany jakiś wynik.

Schemat

Do stworzenia schematu został użyty Proteus ISIS Profesional 7.4 SP3. (Schemat w proteusie moge podesłać tylko trzeba mi dać znać na maila lub na gg)

Schemat mam już gotowy, ale oprogramowanie kontrolerów idzie mi dość opornie. Jak narazie mam zrobioną obsługe przerwania dla pierwszego kontrolera, ale dalej nie wiem już jak to ugryść. Mam czas do poniedziałku do północy aby to skończyć.

Tu zamieszczam fragment kodu, którym już dysponuję (fragment w komentarzu jest potencjalnie zły). Kodu dla drugiego kontrolera jeszcze nie zacząłęm.

Kod: Zaznacz cały

// Autor:
#include <REG51.H>
#include <math.h>

sbit Clear=P1^7;

unsigned int data licz1, licz2, dzies1, dzies2, jedno1, jedno2;
unsigned char bdata dru;
volatile unsigned char bdata Key;

sbit B1 = Key^0;
sbit B2 = Key^1;
sbit B3 = Key^2;
sbit B4 = Key^3;

/*
void Przyciski(void)
  {
//ZMIANA DRUZYNY
   if(B1 != 1)
     {
   	   if (dru ==1)
	     {
	     dru=2;
	     }
       else
         {
         dru=1;
         }
	}
//ZMIANA DRUZYNY
  
//DODAWANIE
   if(B2 !=1)
     {
	if (dru ==1)
	  {	
	  licz1++;
	  if(licz1 == 100)
	    {
		licz1=0;
	    }
	  dzies1=floor(licz1/10);
	  jedno1=licz1-(10*dzies1);
	  }
	
	if (dru ==2)
	  {
	  licz2++;
	  if(licz2 == 100)
	    {
		licz2=0;
	    }
	  dzies2=floor(licz2/10);
	  jedno2=licz2-(10*dzies2);
	  }
	 }
//DODAWANIE
  
//ODEJMOWANIE
   if(B3 != 1)
   	 {
	
	 if (dru ==1)
	   {
	   licz1--;
	   if(licz1 < 0)
	     {
		 licz1=99;
	     }
	   dzies1=floor(licz1/10);
	   jedno1=licz1-(10*dzies1);
	   }

	 if(dru ==2)
	   {
	   licz2--;
	   if(licz2 < 0)
	     {
		   licz2=99;
	     }
	     dzies2=floor(licz2/10);
	     jedno2=licz2-(10*dzies2);
	   }
	 }
//ODEJMOWANIE

//RESET
	 if(B4 != 1)
	   {
	     licz1 =0;
	     dzies1=floor(licz1/10);
	     jedno1=licz1-(10*dzies1);

	     licz2 =0;
 	     dzies2=floor(licz2/10);
	     jedno2=licz2-(10*dzies2);
	   }
//RESET
  }  
*/  
	
void Wait(int T)
  {
   int i;
   for (i=0; i<T; i++) {;} 
  }

void przINT0(void) interrupt 0
 {
   Key = P1 & 0x0F;
   Clear = 0;
   Wait(100);
   Clear = 1;
   
 }

void SerialInit(void)
  {
    SCON = 0x50;          // Ustaw rejestr kontroli portu szeregowego 
						  // Tryb 1: 8-bit uart, zmienna predkosc transmisji
						  // REN = 0: odbiornik wylaczony
    PCON &= 0x7F;         // SMOD = 0: predkosc transmisji x 1
	PCON |= 0x80;         // SMOD = 1: predkosc transmisji x 2
    TMOD &= 0xCF;         // 8 bit Timer1 z automatycznym przeladowywaniem
	                      // wyzeruj bity M1 i M0
	TMOD |= 0x20;         // ustaw bit M1
	TH1 = 0xFF;           // ustaw wartosc poczatkowa rejestru TH1
	TL1 = 0xFF;           // ustaw wartosc poczatkowa rejestru TL1

	                      // predkosc 12800 dla czestotliwoasci 2.4576 MHz
	TR1 = 1;              // start timer 1
	TI = 1;               // ustaw flage TI gotowosci do nadawania
  }

void Init (void)
  {
    dru =1;
	IT0=1;
	EX0=1;
	EA=1;
  }

void main (void)
  {
     Init();
	 SerialInit();
	 while(1)
	  {
		Przyciski();
  	  }
  }
Z góry dziękuję za jaką kolwiek okazaną pomoc.

Pozdrawiam.

Awatar użytkownika
haterkmp
Użytkownik
Posty: 652
Rejestracja: 08 sie 2008, 11:47
Lokalizacja: Wałbrzych

Post autor: haterkmp » 05 cze 2009, 10:21

a po co ten układ jest tak skomplikowany? wystarczy jeden mikrokontroler, cztery tranzystory no i cały stuff do wyświetlania i obsługi.
no chyba że MUSISZ to wykorzystać...

[ Dodano: 2009-06-05, 11:24 ]
dokładniej to segmenty wyświetlacza podłączasz do portów procesora anody przez tranzystorki wszystko w multiplexingu. cztery słicze też. możesz nawet wziąć attiny2313 i napisać to w bascomie - banał nawet ja bym to zrobił

ODPOWIEDZ