mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Embedded C - mit UART senden


Autor: Richard (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!!

Habs gerade ausprobiert...dürfte funktionieren!

mein Fehler war, dass ich im Hauptprogramm

Test (C9); geschrieben habe....anstatt 0xC9!

Autor: Richard (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
void putchar (char c)  {
  while (!TI0);            // Transmitter ready/busy ?
  TI0 = 0;                 // TI0 Flag löschen
  SBUF0 = c;               // Ausgabe an UART
}

Die Register sind Tabu, aber wie wäre es mit:

#define meinWert 0xC9

putchar (meinWert);

Autor: Richard (Gast)
Datum:

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

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beschäftige dich mal mit den Begriffen DATA, IDATA, XDATA sowie Array.
data at 0x3F long c;       // long(4 Byte) im direkt adress. RAM ab 0x3F
data char direkt;           // direkt adressierbares RAM (lower IRAM)
idata char indirekt;        // indirekt adressierbares RAM (upper IRAM)

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.
c = getchar ();             // Wert vom Terminal holen
s[i] = c;                   // und Ziffer für Ziffer im Array ablegen

Ne for Schleife drumherum und fertig. Alles klar ?

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!!!

soweit wars verständlich...werds gleich mal ausprobieren!

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.