mikrocontroller.net

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


Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe folgendes Programm für meinen HC12 das geht!

#include <stdio.h>

#include <mc912d128.h>


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();
}



void main(void) {


  DDRH |= 0x80;
 
 
 
   
  while(1){
  
  PORTH ^=0x80;
  wait(1000);
  
  }
}


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

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Könnt ihr mir da vlt helfen?

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

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRH |= 0x80;

PORTH ^=0x80;


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

Das das Problem!

Autor: Miguel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: J. R. (cia_man)
Datum:

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

THX!

Autor: J. R. (cia_man)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!!!

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hier die versprochene Lsg:

#include <stdio.h>

#include <mc912d128.h>


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();
}

void main(void) {

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


while(1){
  asm("LDAA #$80");
  asm("ADDA $0029");
  asm("STAA $0029");
  wait(1000);
  
  }

}


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

Autor: Amüsierter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Du bist echt der brüller schlechthin.

Autor: APW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.