Programm mehr in Assembler umschreiben?

OP #2095402
Lesenswert?

Hallo!

Ich habe folgendes Programm für meinen HC12 das geht!
1
#include <stdio.h>
2

3
#include <mc912d128.h>
4

5

6
void delay1ms(void) {
7
  asm("ldy #2666"); //2666 in Y-Register laden
8
  asm("dbne y,.");  // Decrement, bis Y=0 ist / 
9
            //3cyc x 125ns x 2666 = 0,99975ms
10
}
11

12

13
void wait(int duration)
14
{
15
  while(duration--)
16
  delay1ms();
17
}
18

19

20

21
void main(void) {
22

23

24
  DDRH |= 0x80;
25
 
26
 
27
 
28
   
29
  while(1){
30
  
31
  PORTH ^=0x80;
32
  wait(1000);
33
  
34
  }
35
}

Mein Plan: Ich möchte auch das mit dem Lampe aus, Lampe ein, in 
Assembler einfügen.

Könnt ihr mir da vlt helfen?

THX!!!

Falls ich das Ergebnis eher habe, werde ich es hier posten! ;)
Gast #2095421
Lesenswert?

Jochen R. schrieb:
> void delay1ms(void) {
>   asm("ldy #2666"); //2666 in Y-Register laden
>   asm("dbne y,.");  // Decrement, bis Y=0 ist /
>             //3cyc x 125ns x 2666 = 0,99975ms
> }
>
>
> void wait(int duration)
> {
>   while(duration--)
>   delay1ms();

Ganz ganz schlechter Programmierstil. Von Timern und Interrupts noch nie 
was gehört?
Gast #2095423
Lesenswert?

Weisst Du, ich möchte Dich nicht hereinlegen oder demütigen, aber ich 
möchte Dir auch nicht einfach die Befehle hinschreiben, sondern Dir 
helfen Dir selbst zu helfen. Sei es, weil es langfristig viel 
ökonomischer ist.

Normalerweise wählt man die passenden Assemblerbefehle, die passenden 
Assemblerausdrücke für die Ports und schreibt das hin.

Unter "Problem" verstehe ich hier: Was hindert Dich daran, es wie oben 
beschrieben zu machen?
Gast #2095425
Lesenswert?

>als Assembler Befehle direkt und nicht über c!

???
Üblicherweise macht man das umgekehrt, alles in C.

Aber du kannst vom durch den Compiler generierten Code einen 
Disassembler-List-File erzeugen und dort nachsehen, wie das übersetzt 
wurde.
Oder im Debugger...

Generell rate ich jedoch, wenn irgendmöglich, in C zu programmieren.
OP #2095427
Lesenswert?

Erich schrieb:
>>als Assembler Befehle direkt und nicht über c!
>
> ???
> Üblicherweise macht man das umgekehrt, alles in C.
>
> Aber du kannst vom durch den Compiler generierten Code einen
> Disassembler-List-File erzeugen und dort nachsehen, wie das übersetzt
> wurde.
> Oder im Debugger...
>
> Generell rate ich jedoch, wenn irgendmöglich, in C zu programmieren.

asm("$002B = 0x80");

Kann ich es nicht auch so machen?

THX!!
OP #2095830
Lesenswert?

So hier die versprochene Lsg:
1
#include <stdio.h>
2

3
#include <mc912d128.h>
4

5

6
void delay1ms(void) {
7
  asm("ldy #2666"); //2666 in Y-Register laden
8
  asm("dbne y,.");  // Decrement, bis Y=0 ist / 
9
            //3cyc x 125ns x 2666 = 0,99975ms
10
}
11

12

13
void wait(int duration)
14
{
15
  while(duration--)
16
  delay1ms();
17
}
18

19
void main(void) {
20

21
 asm("LDAA #$80");
22
 asm("STAA $002B");
23

24

25
while(1){
26
  asm("LDAA #$80");
27
  asm("ADDA $0029");
28
  asm("STAA $0029");
29
  wait(1000);
30
  
31
  }
32

33
}

Hab mir wo anders etwas helfen lassen... weil auf die 2. Passage wäre 
ich mit meinem momentanen Wissen nicht gekommen.... aber langsam lichtet 
sich der Wald ^^ ;)

THX!!
Gast #2095971
Lesenswert?

> void main(void) {
>
>  asm("LDAA #$80");
>  asm("STAA $002B");
>
>
> while(1){
>   asm("LDAA #$80");
>   asm("ADDA $0029");
>   asm("STAA $0029");
>   wait(1000);
>   }

Mit sowas stehst du aber auch kurz vorm Abgrund.

Der Compiler kümmert sich nicht darum, welche Register du in
deinen Inline-Assembler Ausdrücken verwendest (hier Register A).
Das geht nur im Ausnahmefall gut.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren