Hallo zusammen! Folgende Situation bei mir...hab ein STK500 mit Tiny13, funktioniert alles prima bisher. Hier gleich eine kleine Frage am Rande: Hab folgendes Programm:
1 | #include <avr/io.h> |
2 | #include <stdint.h> |
3 | #include <avr/delay.h> |
4 | #include <stdlib.h> |
5 | |
6 | inline uint8_t debounce(volatile uint8_t *port, uint8_t pin) //Tasterentprellung |
7 | {
|
8 | if ( ! (*port & (1 << pin)) ) |
9 | {
|
10 | /* Pin wurde auf Masse gezogen, 100ms warten */
|
11 | _delay_ms(50); // max. 262.1 ms / F_CPU in MHz |
12 | _delay_ms(50); |
13 | if ( *port & (1 << pin) ) |
14 | {
|
15 | /* Anwender Zeit zum Loslassen des Tasters geben */
|
16 | _delay_ms(50); |
17 | _delay_ms(50); |
18 | return 1; |
19 | }
|
20 | }
|
21 | return 0; |
22 | }
|
23 | |
24 | unsigned short get_seed() //Startwert für rand() erzeugen |
25 | {
|
26 | unsigned short seed = 0; |
27 | unsigned short *p = (unsigned short*) (RAMEND+1); |
28 | extern unsigned short __heap_start; |
29 | |
30 | while (p >= &__heap_start + 1) |
31 | seed ^= * (--p); |
32 | |
33 | return seed; |
34 | }
|
35 | |
36 | |
37 | int main (void) |
38 | {
|
39 | DDRB = 0b001111; //PB4 als Eingang, PB0-3 als Ausgang |
40 | |
41 | PORTB &= ~ ((1<<PB2) | (1<<PB3)); // PB2 und 3 einschalten |
42 | PORTB |= (1<<PB0) | (1<<PB4); // PB0 ausschalten, PB4 internen Pull-up deaktivieren |
43 | |
44 | uint16_t zufall; |
45 | |
46 | while(1) |
47 | {
|
48 | if (debounce(&PINB, PB4)) |
49 | {
|
50 | PORTB = PINB ^ (1<<PB1) ^ (1<<PB0); |
51 | srand(get_seed()); |
52 | zufall = rand(); |
53 | }
|
54 | }
|
55 | return 0; |
56 | }
|
Hab mit diesem Programm schon 63% des Programmspeichers vom ATtiny13 verbraucht, hätte echt nicht gedacht, dass der so schnell voll wird. Und dazu meine Frage: wirken sich die inkludierten Header-Files auf die Größe des Programms aus oder werden nur die benötigten Funktionen am µC gespeichert? Das würde ja irgendwie erklären warum dieses Miniprogramm schon so viel Platz benötigt... Aber jetzt zur richtigen Frage. Will letztlich mit diesem µC einen Würfel ansteueren. Hab mich über die Erzeugung von Zufallszahlen schon ausreichend informiert und mich letztendlich für die Variante mit dem SRAM entschieden, da sie für diese Anwendung vollkommen ausreicht. Wie kann ich jetzt 1) den Zufallszahlenbreich auf 1-6 eingrenzen und 2) wenn ich im Watch-Window im AVR-Studio die Variable "zufall" ansehen will, steht bei Value immer nur "Location not valid". Was ist hier falsch? Zu 1) Wäre das eine Möglichkeit?
1 | int zufallszahl () |
2 | {
|
3 | int x; |
4 | |
5 | while( (x = rand()) >= RAND_MAX - (RAND_MAX % 6) ) |
6 | ;
|
7 | return x % 6; |
8 | }
|
Danke schon mal, Lg Andi