Forum: Mikrocontroller und Digitale Elektronik Programmieren einer UART-Befehlseingabe


von Externer (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:
Ich arbeite zum ersten mal mit einem ARM Cortex-M3 Controller und möchte 
eine Compilervalidierung vollziehen. Dafür muss ich auf die 
UART-Schnittstelle zugreifen und möchte über ein Eingabeterminal (PuTTy) 
eine Funktion aufrufen. Was ich schon geschafft habe ist, dass ich den 
UART so konfiguriert habe und mir diverse Zeichenketten ausgegeben 
wurden. Was ich aber nicht schaffe ist, dass ich sozusagen dazu komme 
irgendwas einzugeben. Habe es schon mit der 
scanf/printf-Funktionskombination probiert, aber da hängt sich das 
Programm nur dabei auf. Zeichen sende und empfange ich ja über COMTX 
bzw. COMRX. Wie schaffe ich es jetzt Zeichen zu senden über COMRX? Der 
Controller ist ein ADuCM301 von Analog Devices.
Ich habe schon im Internet recherchiert, aber nix brauchbares gefunden.
Wäre dankbar wenn mir jemand helfen könnte.

von Alex (Gast)


Lesenswert?

Hallo,

ich kenne mich mit deinem Controller nicht aus,
aber es gibt folgendes Problem:
Wenn du mit deiner Tastatur Worte etc. eingeben willst, woher soll die 
Empfangsroutine wissen, wann die Eingabe beendet ist??
besser du verwendest ein Zeichen zur Funktionsauswahl. Und du verwendest 
GetChr(), also jedes einzelne Zeichen auslesen.

von Dr. Datensalat (Gast)


Lesenswert?

Hallo Externer,

mit Deinen Angaben ist es etwas schwierig Dir zu helfen.
Ist das Dein erster Mikrocontroller mit dem Du programmierst?

Wenn Du an Deinen Controller Werte schickst müssen die ja auch irgendwo 
herkommen, da hast Du keine Aussage dazu gemacht.

Etwas Programmcode wäre auch hilfreich. Printf und scanf sind in einer 
Interruptroutine wohl auch nicht das optimale.

Grüße

von Externer (Gast)


Lesenswert?

Dr. Datensalat schrieb:
> Hallo Externer,mit Deinen Angaben ist es etwas schwierig Dir zu helfen.Ist das 
Dein erster Mikrocontroller mit dem Du programmierst?Wenn Du an Deinen Controller 
Werte schickst müssen die ja auch irgendwoherkommen, da hast Du keine Aussage dazu 
gemacht.Etwas Programmcode wäre auch hilfreich. Printf und scanf sind in 
einerInterruptroutine wohl auch nicht das optimale.Grüße

Nein, das ist nicht mein erster Controller, aber meine erste 
UART-Schnittstelle die ich programmiere um darüber Daten senden und 
empfangen zu können.
Ich habe bisher ohne Interrupts gearbeitet, da ich diese für den ersten 
Test nicht als allzu notwendig empfinde. Ich habe dazu größtenteils 
versucht 
[[http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART|dieses 
AVR-GCC-Tutorial]] für den ARM nachzuvollziehen was bis zum Empfangsweg 
auch geklappt hat. Senden kann ich über die Eingabe noch nichts.
Ich poste mal hier kurz den Code:
1
#include "ioadcm301.h"
2
#include <stdio.h>
3
#include <stdlib.h>
4
5
//Prototypes
6
void Initialize(void);
7
void config_Clk(void);
8
void config_UART(void);
9
void UART_test(void);
10
void uart_puts(const char *s);
11
static inline int uart_putc(const char c);
12
13
//Global
14
char eingabe[] = "start";   //RX String
15
16
int main(void)
17
{
18
    unsigned char c;           //Sending Sign
19
    
20
    T3CON = 0;        // Stop Watch Dog
21
    
22
    Initialize();     //Initialize all
23
24
    COMTX = 0x0A;     // LF
25
    while((COMLSR & (1 << 6))==0);  // Wait till TX shift is empty
26
    COMTX = 0x0D;     // CR
27
    
28
    while(1){
29
30
      for(int i = 0; i <= 9; ++i)
31
      {
32
        c = i + '0';
33
        while((COMLSR & (1 << 6))==0);  // Wait till TX shift is empty
34
        COMTX = c;
35
      }
36
37
      while((COMLSR & (1 << 6))==0);  // Wait till TX shift is empty
38
      COMTX = 0x0D;   // CR
39
      printf("\n\n");
40
      
41
      uart_puts(eingabe);
42
      uart_puts("start");
43
      
44
      if(eingabe=="start")
45
        UART_test();
46
          
47
      for(int i = 0; i < 100000; ++i);
48
      GP4TGL = (1 << 2);  // Toggle LED
49
      
50
    }
51
    
52
    
53
//    return 0;
54
}
55
56
void uart_puts(const char *s){
57
  do{
58
    uart_putc(*s);
59
  }
60
  while(*s++);
61
}
62
63
static inline int uart_putc(const char c){
64
   while((COMLSR & (1 << 6))==0);  // Wait till TX shift is empty
65
   COMRX = c;                      // Send sign
66
   return 1;
67
}
68
69
void UART_test(void){
70
   printf("Die Testfunktion konnte erfolgreich aufgerufen werden!\n");
71
}
72
73
void Initialize(void){
74
    config_Clk();     // Clock configuration
75
76
    // General Purpose I/O configuration
77
    GP1CON = (2 << (2 * 1))   // Set P1.1 to UART TXD and P1.0 to UART RXD Mode
78
            |(1 << (2 * 0));
79
    
80
    GP4CON = (1 << (2 * 2));    // P4.2 GPIO LED
81
    GP4OEN = (1 << 2);         
82
    GP4PUL = (1 << 2);
83
    GP4OUT = (1 << 2);
84
    
85
    config_UART();    // UART configuration
86
}
87
88
void config_Clk(void){
89
    CLKCON = 0x0000;  // Choose Internal Oscillator with 16MHz in active mode
90
}
91
92
void config_UART(void){
93
   // Baud rate = UCLK (16MHz) / (2x16xCOMDIV) / (M + N/2048)
94
   // Where COMDIV = 1 to 65536, M = 1 to 3 and N = 0 to 2047
95
   
96
   COMCON = 0x0000;   // Enable UART
97
   
98
   // Set Baud rate to 9600
99
   COMDIV = 17;           //UART Clock Divider set to 17
100
   COMFBR = (1   << 15)   //At 16MHz set M to 3 and N to 131 to obtain fractional Baud rate of 9600
101
           |(3   << 11)
102
           |(131 <<  0);
103
   
104
   //Interrupt enable
105
//   COMIEN = 0x0F;     //Modem Status interrupt, RX status Interrupt, Transmit buffer empty interrupt, Receive buffer full interrupt
106
   //Control registers
107
   COMLCR = (0 << 6)     //Word length of 8 Bits, 1 Start bit and 1 Stop bit = 10 Bits
108
           |(0 << 5)
109
           |(0 << 4)
110
           |(0 << 3)    // no Parity
111
           |(0 << 2)
112
           |(3 << 0);
113
             
114
   COMMCR = 0x00;     //Normal mode, Force RTS and DTR to 1
115
}

von Karl H. (kbuchegg)


Lesenswert?

Externer schrieb:

> Ich habe bisher ohne Interrupts gearbeitet, da ich diese für den ersten
> Test nicht als allzu notwendig empfinde.

Passt doch.
Machs halt erst mal ohne Interrupts.
Erster SChritt: ein einzelnes Zeichen zu empfangen und gleich wieder 
zurückzusenden.


> AVR-GCC-Tutorial]] für den ARM nachzuvollziehen was bis zum Empfangsweg
> auch geklappt hat. Senden kann ich über die Eingabe noch nichts.

Bitte gewöhn dich daran, dass die Begriffe Senden/Empfangen aus Sicht 
des µC gesehen werden.

Wenn der µC sendet, dann gehen die Zeichen von ihm aus und werden vom 
Terminal empfangen und dargestellt

Wenn das Terminal sendet, dann gehen die Zeichen vom Terminal zum µC und 
werden vom µC empfangen.

Da es hier um die Programmierung des µC geht, sind die Begriffe Senden 
und Empfangen aus seiner Sicht zu sehen. Das bedeutet: nicht du 'kannst 
noch nichts über die Eingabe senden', sondern du weißt noch nicht wie du 
die UART im µC abfragst, ob sie etwas empfangen hat.

Diese Verwirrung hattest du schon mal in einem vorhergehenden Post. Ich 
habs damals einem Postingfehler zugeschrieben. Da derselbe 
Begriffsdreher hier nochmal auftaucht, bin ich mir sicher, dass das kein 
Zufall war.

Warum ist das interessant. Weil es keinen Menschen interessiert (und 
schon gar nicht den µC), wer oder was am anderen Ende des Kabels hängt. 
Die UART empfängt etwas und dein Programm muss damit was machen.

von Karl H. (kbuchegg)


Lesenswert?

PS:
Deine Schreibweise mit den vielen direkt im Code geschriebenen Zahlen 
ist natürlich nicht besonders angetan, das man nachvollziehen kann, was 
du da eigentlich konfigurierst.

Zb. wirst du ja wohl irgendwo den Transmitter der UART eingeschaltet 
haben (wenn das so funktioniert, dass man Transmitter und Receiver 
getrennt einschalten kann). In deinem Code mit den vielen Zahlen ist das 
aber absolut nicht erkennbar, wo das sein könnte.

Sei es wies sei: Auch diese UART wird irgendwo ein Statusregister haben, 
in dem es ein Bit gibt, welches aussagt, das die UART ein Byte empfangen 
hat.

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.