Hi! Ich hab mein komplettes Programm in Assembler geschrieben und bin gerade dabei es umzuschreiben. Dabei habe ich zu folgenden Programmzeilen eine Frage: mov SBUF0, #0C9h ; Byte senden jnb TI0, $ ; Transmit Flag abfragen clr TI0 ; Flag löschen jmp Loop Da ich viele unterschiedliche Bytes senden muss, wollte ich wissen ob ich in embedded c nicht ein unterprogramm (function) programmieren kann, das in etwa so aussieht: void Test(int x) { SBUF0 = x; // x soll das zu sendende Byte sein (hexadezimal) while( TI0 == 0 ); // Transmit Flag abfragen TI0 = 0; // Flag löschen } Dabei will ich im Hauptprogramm schreiben Test (0xC9), bin mir aber nicht sicher ob das geht und welcher Datentyp(int, unsigned...) verwendet werden muss. Könnt ihr mir vielleicht weiterhelfen? Danke schonmal im Vorraus!
Ich weiß nicht, was embedded c ist, aber mit einem 8051 Compiler geht das. Und da der 8051 ein 8Bitter ist, nimmt man immer den kleinst möglichen Datentyp und möglichst auch unsigned. Peter
Danke!! Habs gerade ausprobiert...dürfte funktionieren! mein Fehler war, dass ich im Hauptprogramm Test (C9); geschrieben habe....anstatt 0xC9!
Da ich noch nicht so viel in c programmiert habe, vielleicht eine etwas dumme Frage: Bisher konnte ich einfach schreiben mov R0, #FFh. Da ich das Programm jedoch in c schreiben will, dachte ich mir die Programmzeile in c sieht folgendermaßen aus: R0 = 0xFF Der Compiler meldet aber, 'R0' undefined identifier !?!?!??!?!!? Warum kennt er die Register R0-R7 nicht?
Richard wrote:
> Warum kennt er die Register R0-R7 nicht?
Warum sollte er ?
Register und SRAM gehören ihm allein und Du legst einfach Variablen an.
Per Include kannst Du zwar Prozessor-SFRs wie ACC, B, DPTR, SP, PSW
ansprechen, solltest es aber tunlichst sein lassen, wenn Du willst, daß
Dein Programm auch läuft.
Nur die Peripherie-SFRs (Ports, Timer, UART, Interrupt) darfst Du unter
C anfassen.
Peter
Hallo Richard, üblicherweise nennt man die Funktion "putchar". Dieser Funktionsname wird z.B. von "printf" erwartet (Da du C gerade lernst kannst du das ja im Hinterkopf behalten.
1 | void putchar (char c) { |
2 | while (!TI0); // Transmitter ready/busy ? |
3 | TI0 = 0; // TI0 Flag löschen |
4 | SBUF0 = c; // Ausgabe an UART |
5 | }
|
Die Register sind Tabu, aber wie wäre es mit: #define meinWert 0xC9 putchar (meinWert);
Danke! meine nächstes PRoblem...wie kann ich auf einzelne Speicherzellen im internen RAM zugreifen? in Assembler doch ganz einfach mit mov 20h, #XXh wie kann ich in C beispielsweise auf die Speicherzelle mit der Adresse 20h zugreifen? Wozu ich dass will? Ein PLC Modem schickt mir eine Reihe von Bytes, die ich im RAM speichern will . Dazu hab ich folgenden Code in Assembler genutzt: Loop: jnb RI0, $ mov @R0, SBUF0 inc R0 clr RI0 jmp Loop In C, dachte ich mir, muss ich mit Pointern arbeiten, nur weiß ich wie gesagt nicht, wie ich solch einen auf eine Adresse einer Speicerzelle im RAM zeigen lassen kann, um nach einander die Bytes hineinzuschreiben! Richard
Beschäftige dich mal mit den Begriffen DATA, IDATA, XDATA sowie Array.
1 | data at 0x3F long c; // long(4 Byte) im direkt adress. RAM ab 0x3F |
2 | data char direkt; // direkt adressierbares RAM (lower IRAM) |
3 | idata char indirekt; // indirekt adressierbares RAM (upper IRAM) |
4 | |
5 | bit d; // ein Bit im Bitbereich (20H) des 8051 |
Wobei ein Datenfeld ganz einfach so aussieht: char s[6]; Damit hast du ein Array das 6 Byte aufnehmen kann. Jetzt einfach deine empfangenen Zeichen in s[i], i kann deine Zählvariable für 0-6 sein, in das Array ablegen.
1 | c = getchar (); // Wert vom Terminal holen |
2 | s[i] = c; // und Ziffer für Ziffer im Array ablegen |
Ne for Schleife drumherum und fertig. Alles klar ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.