Randomize med AVR?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

AVR-GCC följer ANSI C så ja, srand() bör vara samma som "vanliga" C.
Dessutom finns ju definitionen RAND_MAX som ställer högsta önskade värde.

Vill du göra det lätt för dig så kan du oftast använda dig av kompilatorpaketets färdiga gottepåsar för att sköta EEPROM-hantering.
I AVR-GCC har du bl.a. eeprom_write_byte() och eeprom_read_byte().
Användarvisningsbild
Kezo
Inlägg: 711
Blev medlem: 28 november 2005, 19:53:12
Ort: Linköping

Inlägg av Kezo »

sodjan skrev:Ett exempel fanns på de länkar jag postade förrut.
Jag må vara blind men, vilka länkar???
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Ok, nu har jag läst lite om eeprom_write/read_byte() och jag förstår det ungefär men inte riktigt.
Är det typ såhär det ska vara?:

Kod: Markera allt

unsigned int addr = 1; //Kan vara 0-511 läste jag, 512 bytes. Men det bror på om den har 512 bytes EEPROM.
unsigned char info = 33; // Värdet som ska sparas.

eeprom_write_byte((unsigned char *) addr, info); // Skriv till EEPROM

unsigned char ut_info = eeprom_read_byte((unsigned char *) addr); // Läs från EEPROM
//Emil
Användarvisningsbild
flippy
Inlägg: 110
Blev medlem: 10 december 2005, 13:49:44

Inlägg av flippy »

Jag skrev ihop en random funktion, gjorde en på cellular automata rule 30 grejen jag postade innan.
Funkar riktigt bra faktiskt, det är bra spridning på värdena.

Kod: Markera allt

0: 122
1: 141
2: 146
3: 118
4: 129
5: 118
6: 126
7: 116
8: 117
9: 124
10: 132
11: 115
12: 151
13: 133
14: 138
15: 122

Kod: Markera allt

using System;
using System.Collections;

class Test
{
    static void Main()
    {
        int[] a = new int[2048];
        Rand r = new Rand();
        uint l;
        for (int i = 0; i < 2048; i++)
        {
            //Console.Write(r.Next().ToString() + "\r\n");
            l = r.Next();
            a[l % 16]++;
        }
        for (int i = 0; i < 16; i++)
        {
            Console.Write(i.ToString() + ": " + a[i].ToString() + "\r\n");
        }
    }
}

class Rand
{
    bool[] r = new bool[34];
    bool[] t = new bool[34];
    bool[] l = new bool[32];
    public Rand()
    {
        r[3] = true;
    }

    uint ToInt(bool[] b, int s, int e)
    {
        uint k = 0;
        for (int i = s; i <= e; i++)
        {
            k += Convert.ToUInt32(b[i]) << (e - i);
        }
        return k;
    }

    public uint Next()
    {
        for (int k = 0; k < 32; k++)
        {
            for (int i = 1; i < r.Length - 1; i++)
            {
                /*r[0] = r[8];
                r[9] = r[1];*/
                r[0] = r[r.Length - 2];
                r[r.Length - 1] = r[1];
                if (r[i] == false && r[i + 1] == false)
                {
                    t[i] = r[i - 1];
                }
                else
                {
                    t[i] = !r[i - 1];
                }
            }
            r = (bool[])t.Clone();
            l[k] = r[4];
        }
        return this.ToInt(l, 0, 31);
    }
}
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Okej, nu vet jag inte riktigt va detdära gör men förklara gärna hur den fungerar!
Det påminner om Java.

Jag har testat lite och jag har ett problem.
Vad är fel här?:

Kod: Markera allt

uint8_t r1 = (rand() % 128) + 128;
uint8_t r2 = (rand() % 128) + 128;
uint8_t r3 = (rand() % 128) + 128;
Den säger:

Kod: Markera allt

error: syntax error before "r1"
error: `r1' undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
error: for each function it appears in.)
//Emil
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Vad har du anget för standard? C89, gnu99 eller någon annan?

Jag skulle rekomdera gnu99

exempel i make filen:
-std=gnu99

Annars så tyder "error: syntax error before "r1"" att det är ett fel före den raden exempel att du har glömt } eller ; eller något liknade ^^

Det kan även vara så att du behöver includer <stdint.h>
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Det va så att den tydligen ville ha det på ett speciellt sätt i en switch-sats...

Jag hade:

Kod: Markera allt

case 18 :
	uint8_t r1 = (rand() % 128) + 128;
	uint8_t r2 = (rand() % 128) + 128;
	uint8_t r3 = (rand() % 128) + 128;
		
	rgb_comp(r1,r2,r3);
			
	for(int i = 0; i < 100; i++)
		_delay_ms(30);
			
	break;
Men den ville ha:

Kod: Markera allt

case 18 :
{
	uint8_t r1 = (rand() % 128) + 128;
	uint8_t r2 = (rand() % 128) + 128;
	uint8_t r3 = (rand() % 128) + 128;
		
	rgb_comp(r1,r2,r3);
			
	for(int i = 0; i < 100; i++)
		_delay_ms(30);
			
	break;
}
Fast det har alltid funkar med den första förut. :?

Nu när programmet är klart börjar jag bli rädd att den inte kommer få platts i en ATtiny45. .hex filen är 5kB (374 rader) stor och µCn har bara 4kB Flash.
Fast jag har för mig att det inte är så att hex filens storlek blir det som ska in i Flash men man börjar bli lite orolig.
Menmen, WinAVR har inte börjat klaga än så de är nog ingen fara.
Tror jag iaf. :roll:

//Emil
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Vilken miljö sitter du i? Avrstudio?
I Avrstudio talar om hur stor programet blir vid en lyckad kompilering....

Sedan är stor leken ingen fara än så länge då hex-filen använde "hex-tal" för repenstera en byte, exempel a2 = en byte samt att den har check sum och addres, vilket kör att hex filen blir mer än dubelt så stor ^^
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Jag kör i Programmer's Notepad i WinAVR.
Och såhär ser en rad ut i hexfilen:
:1000000021C03BC0CEC039C038C037C036C035C0B3

//Emil
Användarvisningsbild
Icecap
Inlägg: 26662
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

": 10 0000 00 21 C0 3B C0 CEC039C038C037C036C035C0 B3" betyder:
':' = start på raden.
'10' = 0x10 = 16 databytes på den raden.
'0000' = denna radens data börjar på adress 0x0000
'00' = normala data
'21 C0 3B....' = databyten, 0x10 st
'B3' är checksum, alltså den sista byten i raden.

Detta betyder att man kan multiplicera en HEX-fils storlek med 0,372 för att få "verklig" storlek. Detta gäller såklart om man har 16 bytes per rad men det är ganska skapligt rätt.
Senast redigerad av Icecap 17 september 2006, 21:29:05, redigerad totalt 1 gång.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Hehe, då har jag ganska mycket kvar att leka med. :)
Men de är ju bra. Nu kan jag lägga till lite mer finesser.

//Emil
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

>> Originally posted by sodjan:
>> Ett exempel fanns på de länkar jag postade förrut.
>
> Jag må vara blind men, vilka länkar???

Oops, missade det.
Jag har lagt till den i det gamla inlägget och den finns här :
http://www.piclist.com/techref/microchip/rand.htm.
Skriv svar