Randomize med AVR?
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().
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().
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?:
//Emil
Ä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
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.
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);
}
}
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?:
Den säger:
//Emil
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;
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.)
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>
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>
Det va så att den tydligen ville ha det på ett speciellt sätt i en switch-sats...
Jag hade:Men den ville ha:
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.
//Emil
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;
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;
}

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.

//Emil
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 ^^
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 ^^
": 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.
':' = 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.
>> 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.
>> 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.