Forum: Mikrocontroller und Digitale Elektronik Problem mit Variablen und UART


von kriz (Gast)


Lesenswert?

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.

von kriz (Gast)


Lesenswert?

ja klar, aber A ist die Variable in der Funktion, die aus Main mit 'w' 
übergeben wird

von Karl H. (kbuchegg)


Lesenswert?

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
}

von kriz (Gast)


Lesenswert?

hm nein, das wars nicht

Es kommt jetzt 11010000 an

(data geht übrigens nicht, das wird von Keil blau markiert. habs in uart 
umbenannt)

von kriz (Gast)


Lesenswert?

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

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.