Forum: Mikrocontroller und Digitale Elektronik Programm mehr in Assembler umschreiben?


von J. R. (cia_man)


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! ;)

von Guru (Gast)


Lesenswert?

>Könnt ihr mir da vlt helfen?

Gern, wenn Du uns nur erst schreibst worin das Problem besteht, bei dem 
Du Hilfe brauchst.

von J. R. (cia_man)


Lesenswert?

DDRH |= 0x80;

PORTH ^=0x80;


als Assembler Befehle direkt und nicht über c! ;)

Das das Problem!

von Miguel (Gast)


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?

von Guru (Gast)


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?

von Erich (Gast)


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.

von J. R. (cia_man)


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!!

von J. R. (cia_man)


Lesenswert?

Compiler meldet zwar jetzt keinen Fehler, wenn ich es so mache wie 
gesagt, aber Licht blinkt nicht??

THX!

von J. R. (cia_man)


Angehängte Dateien:

Lesenswert?

Anders ausgedrückt:

Was ich bräuchte wäre, wie ich bei einer Adresse die einzelnen Bits 
ändere! Bzw. ob man wie in C dieser Adresse eine Binärzahl übergeben 
kann...

Und das ganze halt in Assembler!

Hier ein Screenshot, von der Adresse die ich meine!


THX!!!

von J. R. (cia_man)


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!!

von Amüsierter (Gast)


Lesenswert?

Hallo,

hatte schon Angst das Du mal was alleine löst.

Du bist echt der brüller schlechthin.

von APW (Gast)


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.

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.