ARM7 LPC2138

0

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?

0

Tzn. nie tyle że nie mam płytki co środowiska do programowania. Kail jakoś u mnie w domu działa jak by chciał, a nie mógł.

0

pomimo że miałem dołączone biblioteki
a tą właściwą też miałeś?

0

'tą właściwość' czyli rand()?
a w jaki sposób ją dołączyć?

0

#include <stdlib.h>

0

miałem miałem.. masz może tą płytkę u siebie?

0

taki kod powinien zadziałaś i wyświetlić wylosowaną liczbę na początku programu, prawda?

#include <LPC213x.H>
#include "switches_pins.h" // sprawdź zawartość biblioteki i opis najważniejsze funkcje
#include <stdlib.h>
 
#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;        
        int cou = 0 + rand() % 256;
        IOCLR1=0x00FF0000;
        while(1)
        {
                WaitForSwitchDown();
                IOPIN1&=~0x00FF0000;
                IOPIN1|=(cou)<<16;
                WaitForSwitchUp();        
        }
}
0

powtarzasz deklarację "cou",
wydaje się ok

0

właśnie widziałem ale nie chciałem zaśmiecać drugi raz forum :)

0

w tej pętli cou się nie zmiena!
jeżeli program z rand() się nie kompiluje to zajrzyj do pliku stdlib.h może okrojony? Sam Arm nie ma czasem generatora losowych?

a poza tym to popytaj na elektroda.pl, spotkasz tam wielu oblatanych w temacie.

0

Tak ,wiem że się nie zmienia, chciałem tylko zrobić tak na oko żeby pokazać jak ja to widzę.
A jak zajrzeć do tego pliku?

0

notatnikiem

1 użytkowników online, w tym zalogowanych: 0, gości: 1