Forum: Mikrocontroller und Digitale Elektronik Random Grafiktafel


von Erwin D. (erwin_d) Flattr this


Angehängte Dateien:

Lesenswert?

Entstehen soll ein Bild warauf max 16 Figuren zufällig gedreht werden. 
Die Figuren überschneiden sich und so wird eine sich stehtig ändernde 
Gesamtform erzeugt.

Ein Atini13A erzeugt eine Zufallszahl zwischen 1 und 255
Diese Zahl wird in das B-Register geschrieben.

Die Pins des Pregisters 0 1 2 und 3 werden mit einem 4 zu 16 Multiplexer 
auf 16 Ausgänge gemultiplext. Es ist immer nur ein Ausgang aktiv. 
CD74HC4067
Je 8 Leitungen werde mit 2 Darlington-Arrays ULN2803 ausgekoppelt.
Es gibt somit 16 belastbare Ausgänge zur Steuerung der Aktoren.
Weiter gibt es 16 LED's zur optischen Kontrolle.

Nicht nur die Aktoren sollen abwechselnd bewegt werden sondern auch die 
Zeit wie lange das geschehen soll.

Hier der Code:
1
/*
2
 * Biotronic.cpp
3
 * Attiny13A
4
 * Created: 11.11.2023 16:08:24
5
 * Author : ED
6
 */ 
7
8
#include <avr/io.h>  //Holt Grundfunktionen des Atmega
9
#define F_CPU 1000000UL // 1 MHz
10
#include <util/delay.h>  //Bindet Wartefunktionen ein
11
#include <stdlib.h>
12
int i=0, pause=0 ;  //Variablen dekarieren
13
14
int main(void)    //Jedes Programm braucht diese Startfunktion
15
{
16
DDRB =  0b11111111;    //PORTB als Ausgang
17
PORTB = 0b00000000;    //alle PINS PORTB auf Low  
18
  
19
       while (1) {
20
   //  Zufallszahl 0 bis 15 generieren
21
  int zahl = rand() % 16; // random int between 0 and 15
22
  PORTB  = zahl ;    // Zufallszahl in PortB schreiben
23
    
24
   // Zufallszeit 1000 bis 10000 generieren
25
  int pause = rand() % 30; // random int between 0 and 29
26
  for (i = 0; i < pause; ++i); {
27
  _delay_ms (1000);   //pause-mal durchlaufen
28
  }
29
    }
30
}
Die zufällige Ansteuerung der 16 Ausgänge funktioniert.
Die zufällige Verzögerung funktioniert nicht.
_delay_ms braucht eine Konstante. Um ein variables Delay zu erreichen 
wird _delay_ms (1000) mit der Zufallszahl pause random-mal durchlaufen.
Genau das geht bei mir nicht :-(
Was mache ich falsch?
Mit freundlichem Gruss    ed

: Verschoben durch Moderator
von Harald K. (kirnbichler)


Lesenswert?

Erwin D. schrieb:
> Was mache ich falsch?

Forum: Projekte & Code

Hier könnt ihr Projekte, Schaltungen oder Codeschnipsel vorstellen. 
Projekte bitte nur mit Code oder Schaltplan posten (falls ihr nur Fotos 
vorstellen möchtet, bitte in "Zeigt her eure Kunstwerke"). Bitte hier 
keine Fragen posten.

von Malte _. (malte) Benutzerseite


Lesenswert?

Alles sollte wie geplant gehen. Nur sind deine Pausen zu groß. Falls 
dein AVR mit 16MHz läuft (Annahme aus meiner Glaskubel), du aber 1MHz 
definierst, sind die Pausen 16x länger. Und da du bis zu 29sec warten 
möchtest, können daraus 7min werden.

von Max D. (max_d)


Lesenswert?

Erwin D. schrieb:
> for (i = 0; i < pause; ++i) *;* {

Was macht der Strichpunkt da ?

: Bearbeitet durch User
von Erwin D. (erwin_d) Flattr this


Lesenswert?

Max D. schrieb:
> Was macht der Strichpunkt da ?

Danke Max, der musste weg - und jetzt geht's wie gewünscht.
--------
  int pause = rand() % 30; // random int between 0 and 29
  for (i = 0; i < pause; ++i) {
  _delay_ms (1000); }      //pause-mal durchlaufen
--------
Malte _. schrieb:
> Und da du bis zu 29sec warten
> möchtest, können daraus 7min werden.

Hoi Malte, das ist gewünscht. Das generierte mechanische Grafikbild soll 
sich so langsam bewegen das es kaum wahrgenommen wird.

Ich werde noch weiter daran arbeiten. Drehrichtung wechseln, mechanische
Rückkopplung auswerten etc.

Grüsse   ed

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.