Sida 2 av 2

Postat: 17 september 2006, 15:30:34
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().

Postat: 17 september 2006, 16:25:07
av Kezo
sodjan skrev:Ett exempel fanns på de länkar jag postade förrut.
Jag må vara blind men, vilka länkar???

Postat: 17 september 2006, 18:10:27
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

Postat: 17 september 2006, 18:15:44
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);
    }
}

Postat: 17 september 2006, 19:57:08
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

Postat: 17 september 2006, 20:24:29
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>

Postat: 17 september 2006, 20:39:00
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

Postat: 17 september 2006, 20:48:24
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 ^^

Postat: 17 september 2006, 21:00:31
av Korken
Jag kör i Programmer's Notepad i WinAVR.
Och såhär ser en rad ut i hexfilen:
:1000000021C03BC0CEC039C038C037C036C035C0B3

//Emil

Postat: 17 september 2006, 21:11:30
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.

Postat: 17 september 2006, 21:22:48
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

Postat: 18 september 2006, 00:22:44
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.