Forum: PC-Programmierung "Simulationsumgebung" für Mikrocontroller


von Max S. (Gast)


Lesenswert?

Hallo zusammen,

ich hätte eine kleine Frage.
Ich habe mir aus LEDs mal ein Display gebastelt und wollte damit ein 
wenig spielen. Jetzt kam mir die Idee darauf ein Tetris zu programmieren 
und des weiteren möchte ich eventuell nachher "Bilder" vom PC auf das 
"Display" schicken.

Mir fällt es etwas schwer das Tetris direkt auf der Hardware zu 
programmieren, da es immer ewig dauert bis alles auf dem Chip ist. 
Außerdem kann ich nur daran arbeiten wenn die Hardware neben mir steht. 
Ich wollte mir jetzt möglichst schnell ne Gui zusammenschustern und dann 
das Tetris ausprobieren (andere Sachen gehen ja leider nicht, 
Schnittstellen etc.) Eventuell kann ich das dann auch noch für den 
zweiten Anwendungszweck nutzen.

Fragen:
Ist QT dafür geeigent?
Wird das normalerweise so gemacht?

Danke.
Max

von Simon S. (-schumi-)


Lesenswert?

Max S. schrieb:
> Mir fällt es etwas schwer das Tetris direkt auf der Hardware zu
> programmieren, da es immer ewig dauert bis alles auf dem Chip ist.
Warum? Bei drücke ich F9 und 1-10 Sekunden später (je nach 
Programmgröße, meistens 3-5) läuft das Programm schon auf der Hardware.


Mal ein Beispiel (Bürolaptop mit 2.3Ghz Dualcore und 3GB RAM auf Linux 
(Elementary OS)):
1
simon@simon-TravelMate-5735Z:~/Documents/Laminator/src$ wc -l *.c *.h
2
   73 ADC.c
3
   49 BUTTON.c
4
  160 LCD.c
5
  140 main.c
6
   48 ADC.h
7
   31 BUTTON.h
8
   22 GLOBAL.h
9
   60 LCD.h
10
  583 total  //<<<<<<<<<<<<<<<< Gesamtquellcodezeilen (zugegeben nicht sooo viel ;-) )
11
simon@simon-TravelMate-5735Z:~/Documents/Laminator/src$ time make clean
12
13
-------- begin --------
14
15
Cleaning project:
16
rm -f main.hex
17
rm -f main.eep
18
rm -f main.obj
19
rm -f main.cof
20
rm -f main.elf
21
rm -f main.map
22
rm -f main.obj
23
rm -f main.a90
24
rm -f main.sym
25
rm -f main.lnk
26
rm -f main.lss
27
rm -f main.o LCD.o ADC.o BUTTON.o  
28
rm -f  main.lst LCD.lst ADC.lst BUTTON.lst
29
rm -f main.s LCD.s ADC.s BUTTON.s
30
rm -f main.d LCD.d ADC.d BUTTON.d
31
rm -f .dep/*
32
Errors: none
33
-------- end --------
34
35
36
real  0m0.075s
37
user  0m0.004s
38
sys  0m0.004s
39
simon@simon-TravelMate-5735Z:~/Documents/Laminator/src$ time make program
40
41
Compiling: main.c
42
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=4000000  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst  -std=gnu99 -Wp,-M,-MP,-MT,main.o,-MF,.dep/main.o.d main.c -o main.o 
43
44
Compiling: LCD.c
45
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=4000000  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=LCD.lst  -std=gnu99 -Wp,-M,-MP,-MT,LCD.o,-MF,.dep/LCD.o.d LCD.c -o LCD.o 
46
47
 [BLABLABLA] 
48
49
avrdude done.  Thank you.
50
51
52
real  0m3.187s
53
user  0m0.224s
54
sys  0m0.040s
55
simon@simon-TravelMate-5735Z:~/Documents/Laminator/src$
(Bei meinem Editor liegt "make program" auf F9, also normal gebe ich 
keinen Befehle ein)
Und Programmer ist ein selbstgebastelter USBasp, also nicht gerade 
high-end. Das Programmieren dauert damit auch am längsten, Kompilieren 
macht von den 3.187s gerade mal 0.345s aus.


Also dein Argument mit der Zeit kann ich nicht so ganz nachvollziehen..

Dass du dann immer die Hardware brauchst ist schon klar, aber das war 
bisher bei mir kein Problem.. Und die Hardware als Simulation 
nachzuprogrammieren ist doch ein wahnsinns Aufwand?!

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

Max S. schrieb:
> Fragen:
> Ist QT dafür geeigent?
> Wird das normalerweise so gemacht?

Welches Betriebssystem verwendest du?
Wenn du mit Windows arbeitest, ist QT (ich rede von QT für C/C++) viel 
zu groß und unhandlich (meine Erfahrung). Da ist dir mit C#, Java und 
Co. deutlich besser geholfen. Wenn du Python kannst, ist PyQt noch ne 
alternative zum "normalen" QT.
C#, Java und Co., und PyQt sind besser geeignet, weil du schneller erste 
erfolge erzielst.

Grüße

von Max (Gast)


Lesenswert?

Hallo,

danke für die Antworten.
Ich habe die Hardware nicht immer verfügbar wenn ich Zeit habe. Der 
Prozessor ist ein LPCXXXX und da dauert es schon eine Weile bis der das 
rübergeschoben hat.

Außerdem kann ich das ja auch noch später verwenden (um Bilder 
rüberzuschieben) und außerdem wollte ich mal was lernen.
Die Frage war also ehr ob es sinnvollere Alternativen gibt.

Privat bin ich eigentlich nur unter Windows unterwegs. Ich kann ein 
bisschen Pascal, C++ ist gut und reines C habe ich sehr gut drauf.
Was meinst du mit unhandlich? Bei C wollte ich schon gerne bleiben, das 
kann ich und damit wird auch der µC programmiert. Der MinGW Kompiler ist 
ja nicht schlecht.

von Masl (Gast)


Lesenswert?

Das kommt auf deine SW-Architektur an.

Beispiel: Tetris ist deine Applikation.
Diese benutzt zum Zeichnen aufs Display Funktionen wie drawLine(), 
drawRectangle() etc. die vom Kernel zur Verfügung gestellt werden.
Der Kernel wiederum setzt oder löscht nur Bits in einem internen 
Framebuffer, wenn eine dieser Funktionen aufgerufen wird.
Eine Timer-ISR oder ein schneller, hochpriorisierter Task laufen im 
Hintergrund und schieben den Framebuffer zyklisch ins Display.

Dein Tetris selbst muss so keine Ahnung haben wie das Display genau 
angesteuert wird, ob da irgendwie gemultiplext wird, oder gar welche 
I/O-Pins in die Ansteuerung des Displays involviert sind.
Dein Tetris benutzt einfach nur hochlevelige Zeichenfunktionen.

So, jetzt soll dein Tetris unverändert auf dem PC laufen und anstatt auf 
ein LED-Display soll in eine Windows-Form gezeichnet werden.
Aus "Tetris-Sicht" hat sich nichts geändert. Tetris benutzt immer noch 
fleissig drawRectangle() etc.
Nur werden diese nicht mehr vom Kernel zur Verfügung gestellt sondern 
von einer von dir zu schreibenden Lib.
Im einfachsten Fall ist dies einfach ein Wrapper um irgendwelche 
Qt-Funktionen.

Ich kenn Qt nicht im Detail, aber so könnte das aussehen:

void drawRectangle(int x, int y, int width, int height)
{
  myForm.drawRectangle(x, y , width, height)
}

Bevor dein Tetris ausgeführt wird musst du natürlich noch dein Fenster 
initialisieren, also myForm anlegen usw.

Wenn deine Software eher Wildwuchs ist und deine Tetris-Applikation 
munter irgendwelche Pins toggelt um das Display anzusteuern, dann seh 
ich schwarz.
Um deine Applikation in eine Simulationsumgebung einzubetten musst du 
sauber abstrahieren.

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.