Witam.
Mam pewien kod odpowiadający za przycisk na płycie ARM7, który obsługuje diody (wyświetla binarne liczby od 0 do 256, po wciśnięciu przycisku).
////////////////////////////////////////////////////////
// Function: Switch example
// Target: LPC2138
// Board: ZL6ARM
// Quartz: 12MHz
// Compiler: ARM-GCC
// Na podstawie książki Emil Stawski, "Mikrokontrolery LPC2000 w przykładach"
////////////////////////////////////////////////////////
#include <LPC213x.H>
#include "switches_pins.h" // sprawdź zawartość biblioteki i opis najważniejsze funkcje
#define SW_DELAY delay(0x8000)
void delay(unsigned int del_time)
{
unsigned int i;
for(i=0;i<del_time;i++);
}
//*******************************
// Wait for switch SW1 pressed
//*******************************
void WaitForSwitchDown(void)
{
while(1)
{
while(SW1!=0)
SW_DELAY;
SW_DELAY;
if(SW1==0)
return;
}
}
void WaitForSwitchUp(void)
{
while(1)
{
while(SW1==0)
SW_DELAY;
SW_DELAY;
if(SW1!=0)
return;
}
}
//*******************************
// MAIN
//*******************************
int main (void)
{
int cou;
VPBDIV&=0xFFFFFFFC;
VPBDIV|=0x01;
IODIR0=0xFF000000;
IODIR1=0x00FF0000;
cou=0;
IOCLR1=0x00FF0000;
while(1)
{
WaitForSwitchDown();
IOPIN1&=~0x00FF0000;
IOPIN1|=(++cou)<<16;
WaitForSwitchUp();
}
}
Wszystko działa idealnie do czasu kiedy chcę dołączyć funkcję losującą liczbę z przedziału od 0 do 256.
W języku C, kod za to odpowiedzialny to
int cou = 0 + rand() % 256;
Starałem się również podpiąć funkcję losującą liczbę z podanego przedziału
int xrand(int range_min, int range_max)
{
int tmp_range;
/* jeżeli maksymalny zakres jest większy/równy minimalnemu, wtedy zmniejszamy jego wartość o wartość zakresu minimalnego */
if ( range_max >= range_min ) range_max -= range_min;
else
{
/* jeżeli zakres maksymalny ma mniejszą wartość niż minimalny, obliczamy różnice miedzy zakresami...*/
tmp_range = range_min - range_max;
range_min = range_max; /* ... a następnie zamieniamy je miejscami */
range_max = tmp_range;
}
/* jeżeli zakres maksymalny jest <> 0, wtedy funkcja zwróci liczbę losową z danego zakresu
* w przeciwnym wypadku zwróci wartość podaną jako zakres minimalny */
return (int)(range_max ? range_min + rand() / (RAND_MAX + 1.0) * (double) range_max : range_min);
}
Lecz zawsze wywalało mi jakieś błędy, tak jakby coś z funkcją rand pomimo że miałem dołączone biblioteki.
Teraz niestety nie mam dostępu do płytki i nie mogę podać jakie to były konkretnie błędy.
Mógł by mnie ktoś nakierować jak mam podpiąć losowanie liczby do podanego przykładu tak, aby to zadziałało?