Problem mit Variablen und UART

Gast #1317449
Hallo!
Folgendes Problem:

Ich will nichts weiter als ein einziges Zeichen über den UART senden.

Erstmal der Code (Minimalbeispiel, hab inzwischen alles was ich sonst 
noch wollte rausgelöscht um das Problem zu begrenzen...)
Das ganze ist mit Keil auf einem ADuC841 programmiert.
1
#include <stdio.h>
2
#include <aduc841.h>
3

4
int i=0;
5

6
unsigned int uiTemp;
7
unsigned char usTemp;
8

9
unsigned char ucUartH, ucUartL;
10

11

12
//********************************************************************************************************
13
// Konfiguration zur Ausgabe über serielle Schnittstelle (für Testzwecke)
14
//********************************************************************************************************
15
void InitUart(void)
16
{
17
  SCON  = 0x52;                                        // 8bit, noparity, 1stopbit  UART konfigurieren
18
  T3CON = 0x87;                                       // configure Timer3..          
19
  T3FD  = 0x01;                                         // ..for 9600baud @ 20MHz..
20

21
}
22

23

24
void UART_senden(unsigned char A)
25
{
26
  // A=0x76;
27
   TI = 0;
28
     //SBUF = A;
29
   SBUF = 0x76;
30
   while(TI == 0);                            // warten bis Byte gesendet ist
31
   TI = 0;                                // Sendeflag TI zurücksetzen
32
}
33

34
void main ()
35
{   
36

37
  InitUart();
38

39

40
   while(1)            //Endlosschleife!
41
  {
42
     UART_senden('w');
43
   }                
44
}

SO funktionierts. Wenn ich aber die Zeile
1
SBUF = A;
statt
1
 SBUF = 0x76;

mache, läuft es nicht mehr. Es kommt eine ganz andere Bitfolge als 
gewünscht an (01000000 statt 01110110).
Woran könnte das liegen? Der Variablen Typ (unsigned char) müsste doch 
passen? Konfiguration sollte auch stimmen.
01000000 oder 01000001 ?

01000001 ist hex 41 und das ist der ASCII Code von 'A'. Das ist schon 
verdächtig.
Gibt es zufällig auf dem Keil Compiler ein vordefiniertes Register, 
welche zufällig A heißt?

Nenn doch mal den Parameter um (A ist sowieso ein beschissener Name für 
den Parameter. Irgendwie so nichtssagend)
1
void UART_senden(unsigned char data)
2
{
3
   TI = 0;
4
   SBUF = data;
5
   while(TI == 0)                     // warten bis Byte gesendet ist
6
     ;
7
   TI = 0;                            // Sendeflag TI zurücksetzen
8
}
Gast
des Rätsels-Lösung: In der Projekt Optionen war auf "large data model" 
gestellt. Wollte die Daten also auf xdata speichern, das hat wohl nicht 
funktioniert...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.