ARM7 LPC2138

Odpowiedz Nowy wątek
2011-12-07 21:30
bogus
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?

Pozostało 580 znaków

2011-12-07 21:39
bogus
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ł.

Pozostało 580 znaków

2011-12-07 22:31
0

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

Pozostało 580 znaków

2011-12-08 13:45
bogus
0

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

Pozostało 580 znaków

2011-12-08 14:31
0

#include <stdlib.h>

edytowany 2x, ostatnio: Xitami, 2011-12-08 14:31

Pozostało 580 znaków

2011-12-08 18:52
bogus
0

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

Pozostało 580 znaków

2011-12-08 18:57
bogus
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();        
        }
}

Pozostało 580 znaków

2011-12-08 19:04
0

powtarzasz deklarację "cou",
wydaje się ok

edytowany 1x, ostatnio: Xitami, 2011-12-08 19:05

Pozostało 580 znaków

2011-12-08 19:07
bogus
0

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

Pozostało 580 znaków

2011-12-08 19:38
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.

Pozostało 580 znaków

2011-12-08 19:42
bogus
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?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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