Hallo Miteinander,
Hallo ich bin neu hier und mit der Hoffnung dass ihr mir helfen könnt.
obwohl das ich von Programmieung nicht so viel verstehen kann habe ich
mir vor genommen in C-Code ein Assembler Code was ich hier gefunden habe
zu integrieren. Beitrag "AtTiny13 PWM Lauflicht"
habe schon im forum gelesen und davon weis ich teilweise ein Programm
teilchen integrieren kann. Aber ein ganzes Programm unter Switch
Case...???
Was meint ihr, ist es überhaupt möglich oder soll ich es sein lassen?
Vielen Dank im voraus.
Dimi
Hallo Leute,
Danke für eure antworten.
ich versuche es Ja seit Sonntag die ASM code zu integrieren klappts aber
nicht. Es gibt Ja so viele punkte das ich nicht vertehen kann.
Aber dieser ASM code hat super sanfte überlauf und gefehlt. Es gefelt
mir richtig gut. Leider in Assembler und nach menrere versuche habe ich
nicht in C hin gekrigt. Die Assembler code könnte ich nicht lesen.
Gruss
Dimi
Warum möchtest Du das Programm aus einem C Programm aufrufen? Weshalb
übernimmst Du nicht einfach das Assembler-Programm "solo"? Soll das
Assembler-Programm als eine mehrerer Optionen laufen? Unter
Berücksichtigung der Fakten im oben von mir genannten 3. Link lässt
sich das Assembler-Programm sicher so umschreiben, dass es aus C
aufrufbar ist.
Ich schließe mich ansonsten den anderen an: Es ist bestimmt sinnvoll, Du
lernst Assembler (um das Programm als *.S umzuschreiben oder um es zu
verstehen und nach C zu portieren) -- oder Du bleibst bei C und
versuchst zu begreifen, wieso Dein C Programm nicht optimal läuft.
Hi,
weil ich in C programmieren kann und nicht in Assembler.
Natürlich wenn ich Assembler könnte wäre alles anderes als jetzt.
Ausserdem eine Programmier sprace zu lernt man nicht in kürze zeit.
Ich tue mich sowieso mit C zuschwer.
Hab mich an euch gewendet mit der Hoffnung dass ihr mir Helfen könnt.
Ich denke für das C und Assemler könner kein Problem in C zu schreiben.
Ich will nicht anderes als zu vertehen wie in C dieser assembler code zu
realisieren.
Danke
Dimi
Dimitris ahoi schrieb:> Hallo Leute,>> Danke für eure antworten.>> ich versuche es Ja seit Sonntag die ASM code zu integrieren klappts aber> nicht. Es gibt Ja so viele punkte das ich nicht vertehen kann.>> Aber dieser ASM code hat super sanfte überlauf und gefehlt. Es gefelt> mir richtig gut. Leider in Assembler und nach menrere versuche habe ich> nicht in C hin gekrigt. Die Assembler code könnte ich nicht lesen.>> Gruss> Dimi
Um ASM richtig verstehen zu können, musst du auch wissen wie der µC
funktioniert, wie die Hardware zusammen arbeitet.
Da ist es gut, wenn du dich zunächst auf einen µC "einschießt" und
lernst das Datenblatt zu verstehen.
Vielleicht mache ich mich jetzt unbeliebt, aber mir hat der Debugger im
Atmel Studio (ich benutze immer die neuste Version) sehr geholfen die
Abläufe im µC und die Auswirkungen vom Programmcode besser zu verstehen.
Gleichwohl muss ich sagen, ich lerne immer noch.
Zum erlernen des gesamten Bereiches, habe ich mich auf den Tiny13
festgelegt. Zum einen, weil der für viele kleinere Sachen ausreichend
ist, das Datenblatt mit 176 Seiten noch recht überschaubar ist und zum
anderen ist er recht günstig und man kann "in engen Grenzen" vielleicht
mehr lernen , wenn man versucht noch hier und da etwas raus zu
quetschen. Das zum Beispiel, wenn man das Programm oder Teile in
Assembler schreiben wird.
Dimitris ahoi schrieb:> ich versuche es Ja seit Sonntag die ASM code zu integrieren klappts aber> nicht.
Anfänger denken, es wäre leicht, Assembler in C zu integrieren. Das ist
ein großer Irrtum!
Schmeiß den Assembler weg und schreibe es neu in C.
Es gibt wirklich nur sehr, sehr, sehr wenige Fälle, wo Assembler
sinnvoll ist.
Ich hab einmal Assembler einbauen müssen, weil die original 64Bit lib
(5kB) mir den Flash gesprengt hat.
Da kannst Du Dir ja mal ansehen, wie Assembler aussehen muß, damit er
mit C zusammen gelinkt werden kann:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=113673&highlight=
Meine Vorredner haben Recht. Mit C allein bist Du besser beraten.
Trotzdem lohnt es sich, Assembler zu lernen und vielleicht auch einmal
ein Projekt mit einem aus C aufgerufenen Assembler-Programm zu
realisieren. Für Deinen Fall könnte das so aussehen (schnell
umgeschrieben, keine Garantie; kompiliert unter Atmel Studio 6):
C (*.c):
1
externvoidLEDS(void);
2
3
intmain(void){
4
LEDS();
5
while(1);
6
}
Assembler ("*.s"):
1
#ifndef __ASSEMBLER__
2
#define __ASSEMBLER__
3
#endif
4
#include <avr/io.h>
5
6
.global LEDS
7
8
#define TEMP r18
9
#define STORE r19 // enthält Port-Wert für die aktuelle LED
10
#define STORE2 r20 // enthält Port-Wert für die nächsten LED
11
#define OUTER r21 // fading Zähler
12
#define INNER r22 // PWM Zähler
13
14
#define wait 20 // Rotation geschwindigkeit
15
16
// I/O setup
17
// =========
18
LEDS: ldi TEMP,30 // switch PB0..PB5 to output
19
out _SFR_IO_ADDR(DDRB), TEMP
20
ldi STORE,30 // Last Startwert (LED0 on)
21
ldi STORE2,29 // Last nächste wert (LED1 on)
22
23
LOOP:
24
inc INNER // innere zähler Incrementieren
25
cpi INNER,wait // haben wir den maximalen WERT ereeicht?
26
27
brne GO_ON // wenn ja, erhöhe die äußere
28
29
clr INNER // innere Zähler zurücksetzen
30
inc OUTER // erhöhe äußere(outer) Zähler
31
cpi OUTER,wait
32
breq NEXT_PHASE // wenn es überläuft, gehe zur nächsten LED
33
34
GO_ON:
35
cp INNER, OUTER // inner > outer?
36
brsh THIS_LED // if yes, the current LED needs to be on
37
38
mov TEMP, STORE2 // <-----
39
com TEMP // <-----
40
out _SFR_IO_ADDR(PORTB), TEMP // else the next one // <-----
41
rjmp LOOP // and start over
42
43
THIS_LED:
44
mov TEMP,STORE // <----
45
com TEMP // <----
46
out _SFR_IO_ADDR(PORTB), TEMP // switch on current LED // <----
47
rjmp LOOP // and start over
48
49
NEXT_PHASE:
50
clr OUTER // Zähler reset
51
mov STORE, STORE2 // nächste LED
52
lsl STORE2 // aktuelle wert verschieben
53
ori STORE2, 1 // die lsl macht die lsb 0, brauchen wir eine 1
54
sbrs STORE2, 5 // Rotieren
55
ldi STORE2, 30 // Wenn Ja, Lade interne Wert
56
andi STORE2, 31 // Maske Bit 5 bis 7
57
58
rjmp LOOP // gehe zu anfang
Du hast uns immer noch nicht erklärt, weshalb Du den Code aus C aufrufen
willst (außer, dass er Dir gefällt und Du nur C kannst). Obigen Code
habe ich einfach an die im dritten Link oben angegebenen Vorgaben
angepassst, so dass er aus C aufgerufen werden kann.
Warnung: Ungetestet!
Du hast auch nicht beschrieben, wie bzw. ob es einen Rücksprung zu C
geben soll.
Dies dient nur der Illustration und Ermutigung, Assembler und(!) C zu
lernen.
Für Deinen Fall gilt: Mach es so, wie peda empfiehlt!
In dem Fall ist es ja einfach - in realistischeren Szenarien musst du
dich auf jedem Fall mit den Aufruf Konventionen vertraut machen. Es ist
sehr unwahrscheinlich, daß jemand in seinem reinen Assemblercode die
Register so benutzt wie es dem c Compiler schmeckt.
Kann auch nur unterstützen so was nicht aus Spaß zu machen. Speziell
wenn man doch c kann ist nicht mal der Zeitaufwand geringer wenn man
fertigen Assembler Code benutzt.
Wie lange probierst du rum? Eben. Hättest du lieber ein C Projekt
gestartet und wärst schon efrtig damit.
Hi,
bin seit etwa 10 stunden dabei und verstehe immer noch BAHNHOF.
Ein Lauflicht ist in C gar kein Problem aber so ein Schönes wie im ASM
Programm....
ich versuche in C so schön hin zu kriegen. Leider klappt es nicht. Ich
verstehe die Logik bei ASM nicht.
Wie soll ich das Programm schreiben damit ich mindestens so schöne
überlappende Lauflicht habe???
Gruss
Dimi
Dimitris ahoib im Beitrag #3358829:
> Ich verstehe die Logik bei ASM nicht.
Die Logik eines Programms (der Algorithmus) ist ja nicht "in Assembler"
oder "in C". Die Logik kann man auch in einer "Pseudosprache"
ausdrücken:
z.B:
Wiederhole so oft bis (Abbruchbedingung erreicht)
mache dieses
mache jenes
Beginn Sonderfunktion
lese bestimmte Eingangs-Signale ein
Falls eigangssignale = "ein bestimmter Wert"
dann mache iregendwas
Falls Eingangssignal "ein anderer bestimmter Wert"
dann mache irgendwas anderes
ansonsten mache ganz was anderes
Ende Sonderfunktion
Ende der Wiederhol-Schleife
--> Da ist kein bischen "klassische" Progammiersprache (weder assember
noch C) enthalten.
==> versuche, die innere Logik deiner PWM.Steuerung zu verstehen. Wenn
du das verstanden hast, dann fäll es dir auch leicht(er), da in einer
technischen Programmiersprache auszudrücken
Hangel Dich doch mal bis zur Hilfe zu den C-Bibliotheken durch.
Da gibt es auch Beispiele zur Mischung von C und Assembler.
Des Weiteren gibt es bei den FaQ's, Hilfe zur internen Belegung der
Register unter C.
Ob Dir das weiter hilft weis ich aber nicht.
Dimitris ahoi schrieb:> Hi,>> bin seit etwa 10 stunden dabei und verstehe immer noch BAHNHOF.
Macht nichts.
10 Stunden sind nicht viel.
Lad es in den Simulator und steppe es durch.
Zentraler Punkt ist das Label GO_ON
dort wird anhand der Werte in INNER bzw. OUTER entschieden, welche der
beiden LED Konfigurationen brennen soll. Und diese beiden Werte, INNER
und OUTER, protokollierst du einfach mal und verfolgst im Code, welche
Aktionen davon abgeleitet werden.
Das ganze ist im Grunde einfach nur ein Wechselblinker, der abwechselnd
2 LED-Konfigurationen anzeigt, wobei das zeitliche Verhältnis sich
zwischen den beiden verschiebt. Und da diese Wechsel sehr schnell geht,
sehen wir das nicht als Blinken, sondern als auf- bzw. abdimmende LED.
Am Anfang werden STORE und STORE2 mit den Werten 30 bzw. 29 geladen.
Schreibt man sich die Werte mal binär an, dann sieht man
1
Dezimal Binär
2
STORE 30 0001110
3
STORE 29 0001101
hier stecken die beiden LED drinnen, die leuchten sollen. Interessant
sind nur die Bits 0 bis 5. Die 1-en da drinnen sind die 4 Stück LED die
nicht leuchten sollen, die eine 0 ist die LED die leuchten soll.
Diese beiden Muster werden abwechselnd ausgegeben, wobei der zeitliche
Anteil variiert. Ungefähr so
1
while(1)
2
{
3
inner++;
4
if(inner==wait)
5
{
6
outer++;
7
if(outer==wait)
8
{
9
diebeidenLEDum1Stellenachlinksweiterschieben
10
wobeider'Überlauf'linksberücksichtigtwerden
11
muss.WenneineLEDlinks'rausfällt'musssierechts
12
wiederreinkommen.
13
}
14
}
15
16
if(inner>outer)
17
STOREausgeben
18
else
19
STORE2ausgeben
20
}
inner steuert die PWM der beíden LED (die eine dimmt ab, die andere
auf), wobei outer der PWM-Tastgrad ist, der sich nach jedem PWM
Durchgang verändert. Ist der Tastgrad einmal durchgelaufen, wird auf die
nächste LED weiterrotiert.
Dimitris ahoi schrieb:> Ein Lauflicht ist in C gar kein Problem aber so ein Schönes wie im ASM> Programm....
Ich finde ASM Programme garnicht schön, aber das ist wohl jedem sein
Ding.
Meine Frage ist eher: willst du ein schönes Programm oder soll ein
Programm etwas schönes machen?
Wenn du ein schönes Programm willst, wie muß ein Programm aussehen,
damit es schön ist?
Wenn du ein Programm willst, daß etwas schönes macht, was soll es denn
machen, was findest du schön?
MfG Klaus
Hi,
Danke für euer antworten aber es klappt enfach nicht.
Mein leucht bild einfach zerhackt sich und leuft nicht so wie im video
zusehen scheint. Schaut bitte an: rotary.avi
Beitrag "AVR-Lauflicht"
Danke
Gruß
Dimi
Wenn da wirklich nur zwei LED's abwechselnd ein und aus geblendet
werden, könnte man das recht simpel mit einem einzigen PWM Ausgang
machen:
1
PWM o---+---|>|---[===]---| GND
2
|
3
+---|<|---[===]---o VCC
Das programmierbare Tastverhältnis des PWM Signals bestimmt die
Helligkeiten der beiden LED's, wobei die untere zwangsläufig immer genau
anders herum leuchtet, als die obere.
255: oben hell, unten dunkel
128: beide leuchten halb
0: oben dunkel, unten hell
Du musst also nur noch den PWM Wert immer abwechselnd von 0 bis 255
höher setzen und dann wieder von 255 bis 0 runter setzen. Zum Beispiel
alle 2mS eine Stufe.
Jetzt schaust Du nur noch in irgendein Tutorial, wie man Timer im PWM
Modus nutzt, und fertig bist du.
Stefan schrieb:> Wenn da wirklich nur zwei LED's abwechselnd ein und aus geblendet> werden,
Es ist ein bischen trickreicher.
es sind 5 LED, die reihum aufleuchten und deren Übergänge mittels PWM
geglättet werden.
Ich denke, es war ursprünglich mal als Simulation der Beleuchtung in
einem Leuchtturm gedacht (Modelleisenbahn oder so).
Das Programm ist so schwer auch wieder nicht zu vestehen. Ich habe
bewusst ein paar Dinge in der C Übersetzung nicht ausgeführt (die sind
aber auch nicht sehr schwer zu realisieren), denn er soll ja auch was
lernen. Lernen beginnt aber damit, dass man sich auf seinen Hosenboden
setzt und analysiert. Davon, dass ihm jemand anderer ein Programm bis
ins Detail vorkaut, davon hat er nichts.
Nur Mut, so schwer ist das nicht. Und nein, deine Anfrage kam am 10.,
heute ist der 17. Das ist immer noch keine Zeit.