Forum: Mikrocontroller und Digitale Elektronik Wie gebe ich über mein Terminal per HC12 etwas aus?


von J. R. (cia_man)


Lesenswert?

Hallo!

Ich möchte wie in c etwas auf meinem Monitor printen! printf also! Geht 
das auch per Seriell also per Terminal? Also dass ich ein Programm 
schreibe, dass mir auf dem Monitor über das Terminal etwas ausgibt?? :)




#include <stdio.h>

// CHANGE the header file reference below for the CPU12 target
#include <hcs12dp256.h>

extern int _textmode;

int putchar(char c)
  {
  if (_textmode && c == '\n')
    putchar('\r');
  while ((SC0SR1 & TDRE) == 0)
    ;
  SC0DRL = c;
  return c;
  }


Habe obigen Code gefunden! Nur weiß ich jetzt nicht, ob man den nimmt 
und wie???

THX!!!

Benutze wie immer ICC12.

von Timmo H. (masterfx)


Lesenswert?

Naja erstmal musst du die serielle Schnittstelle initialisieren.
Und da Printf etc. das ganze sehr aufblähen, programmiert man sich am 
besten selbst sowas wie putc, puts
Für den HC12 müsste das etwa so aussehen:
1
void sci0_init(void){
2
    SC0BDH=0;  // 38400 BR=13 (MCLK=8MHz)
3
    SC0BDL=13; // MCLK/(16*BaudRate)
4
    SC0CR1=0;
5
    SC0CR2=0x0C; //TE+RE enable
6
}
7
8
void sci0_putc(char data){
9
   while ((SC0SR1 & TDRE) == 0){};
10
   SC0DRL = data;
11
}
12
13
void sci0_puts(char* data){
14
   while (*data)
15
       sci0_putc(*data++);
16
}
Und dann kannst du halt sowas machen:
1
int main(){
2
  sci0_init();
3
  sci0_puts("Hallo ich bin ein String");
4
  sci0_putc('1'); sci0_putc('2'); sci0_putc('3');
5
6
  while(1);
7
}

von J. R. (cia_man)


Lesenswert?

Timmo H. schrieb:
> Naja erstmal musst du die serielle Schnittstelle initialisieren.
> Und da Printf etc. das ganze sehr aufblähen, programmiert man sich am
> besten selbst sowas wie putc, puts
> Für den HC12 müsste das etwa so aussehen:
>
1
> void sci0_init(void){
2
>     SC0BDH=0;  // 38400 BR=13 (MCLK=8MHz)
3
>     SC0BDL=13; // MCLK/(16*BaudRate)
4
>     SC0CR1=0;
5
>     SC0CR2=0x0C; //TE+RE enable
6
> }
7
> 
8
> void sci0_putc(char data){
9
>    while ((SC0SR1 & TDRE) == 0){};
10
>    SC0DRL = data;
11
> }
12
> 
13
> void sci0_puts(char* data){
14
>    while (*data)
15
>        sci0_putc(*data++);
16
> }
17
>
> Und dann kannst du halt sowas machen:
>
1
> int main(){
2
>   sci0_init();
3
>   sci0_puts("Hallo ich bin ein String");
4
>   sci0_putc('1'); sci0_putc('2'); sci0_putc('3');
5
> 
6
>   while(1);
7
> }
8
>

Okay! Kannst du das obige Programm mir dann noch insoweit erklären, als 
dass man dann wo den Text oder des Zeichen eingibt, dass man ausgeben 
will?

Zudem bekomme ich auch bei deinem Programm, die gleiche Fehlermeldung, 
wie bei meinem obigen und zwar:

!E C:\Programme\iccv712\EIGENE~1\selberblink.c(21): undeclared 
identifier `TDRE'


??? Keine Ahnung warum ???

Thx!

>Frage 1 hat sich geklärt ^^ Thx ;) Aber der Fehler???

von Timmo H. (masterfx)


Lesenswert?

Jochen R. schrieb:
> Okay! Kannst du das obige Programm mir dann noch insoweit erklären, als
> dass man dann wo den Text oder des Zeichen eingibt, dass man ausgeben
> will?
>
Du meinst, dass man ein Zeichen einliest über Terminal?
Naja da brauchst du dann ein gets
1
char sci0_getc(void){
2
   while ((SC0SR1 & RDRF) == 0);
3
   return(SC0DRL);
4
}
5
6
// Achtung keine Überprüfung der Buffer-Länge!
7
char sci0_gets(char *buffer){
8
  char len=0;
9
  do{
10
    *buffer = sci0_getc();
11
    len++;
12
  }while(*buffer++ != '\n');
13
  *buffer = '\0'; //Terminierung
14
  return len;
15
}
16
17
main(){
18
  char *str_buffer[64];
19
20
  sci0_puts("Bitte String eingeben:");
21
  sci0_gets(str_buffer);
22
  sci0_puts("Die Eingabe lautet:\n");
23
  sci0_puts(str_buffer);
24
}

Irgendwie so, keine Ahnung ob das so jetzt geht habs halt so aus dem 
Kopf gemacht.


> Zudem bekomme ich auch bei deinem Programm, die gleiche Fehlermeldung,
> wie bei meinem obigen und zwar:
>
> !E C:\Programme\iccv712\EIGENE~1\selberblink.c(21): undeclared
> identifier `TDRE'
Ja stimmt ganz oben noch über die Funktionen:
#define RDRF 0x20   // Receive Data Register Full Bit
#define TDRE 0x80   // Transmit Data Register Empty Bit


Du solltest echt mal anfangen das Datenblatt zu lesen!

von J. R. (cia_man)


Lesenswert?

Jetzt geht das Programm! THX!

ABER:

Die Ausgabe auf dem Terminal sieht so aus:

Executing 4000.)œ­LŠˆ1Wê


????

Scheint was noch nicht mit dem Zeichensatz zu passen???


Du solltest echt mal anfangen das Datenblatt zu lesen!

-> Mach ich schon die ganze Zeit! Doch trotzdem ist es für mich eine 
große Herausforderung! Bin erst seit einer Woche damit in Kontakt ;)

von APW (Gast)


Lesenswert?

Falsche Baudrate !?

von J. R. (cia_man)


Lesenswert?

APW schrieb:
> Falsche Baudrate !?

Ne die passt! ;)

Hab 19200.... stimmt das???
Also das terminal geht so normal...

von Timmo H. (masterfx)


Lesenswert?

Jochen R. schrieb:
> Jetzt geht das Programm! THX!
>
> ABER:
>
> Die Ausgabe auf dem Terminal sieht so aus:
>
> Executing 4000.)œ­LŠˆ1Wê
Wann genau kommt das? Ist das Executing von dir? Was ist mit der 4000? 
Sendet dein Terminalprogramm vielleicht nur '\r' anstatt '\n'? Tausch 
das ansonsten mal..


Jochen R. schrieb:
> Hab 19200.... stimmt das???
> Also das terminal geht so normal...
Das was ich dir als sci0_init gegeben habe ist für MCLK 8MHz und 38400 
Baud

von APW (Gast)


Lesenswert?

Na dann Low Level debuggen und nachsehen was er so ins Senderegister
reinschreibt.

von J. R. (cia_man)


Lesenswert?

G 4000 ist von mir um das Programm zu starten!

00>g 4000



dann kommt immer Executing 4000....

wenn das Programm dann läuft...

Und die komischen Zeichen sind dann mal die Ausgabe von dem Programm 
denke ich oder?

von J. R. (cia_man)


Lesenswert?

Timmo H. schrieb:
> Jochen R. schrieb:
>> Hab 19200.... stimmt das???
>> Also das terminal geht so normal...
> Das was ich dir als sci0_init gegeben habe ist für MCLK 8MHz und 38400
> Baud

Brauch aber 19200! Sonst geht mein Terminal net... jedenfalls steht es 
so in der Anleitung!

Wenn ich auf 38400 gehe kommt nur Murks! :(

von APW (Gast)


Lesenswert?

na dann: SC0BDL = 26
Welche Busfrequenz + Prozessor ist das überhaupt ?

von J. R. (cia_man)


Lesenswert?

APW schrieb:
> na dann: SC0BDL = 26
> Welche Busfrequenz + Prozessor ist das überhaupt ?

Jep geht... hab des auch im Handbuch zum Controller gefunden thx!

8 MHz System Clock + MC912DG128A hab die Card12! :)

SC0BDH=0;  // 19200 BR=26 (MCLK=8MHz)
    SC0BDL=26; // MCLK/(16*BaudRate)
    SC0CR1=0;
    SC0CR2=0x0C; //TE+RE enable

stimmt das nun so auch vom Kommentar her?

THX!

von Timmo H. (masterfx)


Lesenswert?

Jochen R. schrieb:

> Brauch aber 19200! Sonst geht mein Terminal net... jedenfalls steht es
> so in der Anleitung!
>
> Wenn ich auf 38400 gehe kommt nur Murks! :(

Und was meinst du warum ich die Formel zur Berechnung mit im Kommentar 
habe. Und auch das Datenblatt hätte dir geholfen. Also 26!

von APW (Gast)


Lesenswert?

Wenn du den MC912DG128A hast, wieso nimmst du dann #include 
<hcs12dp256.h> ?

von J. R. (cia_man)


Lesenswert?

Timmo H. schrieb:
> Jochen R. schrieb:
>
>> Brauch aber 19200! Sonst geht mein Terminal net... jedenfalls steht es
>> so in der Anleitung!
>>
>> Wenn ich auf 38400 gehe kommt nur Murks! :(
>
> Und was meinst du warum ich die Formel zur Berechnung mit im Kommentar
> habe. Und auch das Datenblatt hätte dir geholfen. Also 26!

Ja sorry! Aber ihr habt mir wirklich echt geholfen damit... weil jetzt 
habe ich wieder etwas gelernt... ist halt alles noch weng schwer für 
mich zusammen zu suchen... Handbuch plus Programm plus .... alles noch 
weng neu... ist weng wie ein Sprung ins kalte Wasser ;)

Aber THX!!!

von J. R. (cia_man)


Lesenswert?

APW schrieb:
> Wenn du den MC912DG128A hast, wieso nimmst du dann #include
> <hcs12dp256.h> ?

ich nehm natürlich den hier: #include <mc912d128.h> :)

War nur ein Bsp vom Programm! ;)

von J. R. (cia_man)


Lesenswert?

Hallo!

Könnte mir bitte nochmal jmd folgende Zeilen erklären, was diese machen:

void sci0_putc(char data){
   while ((SC0SR1 & TDRE) == 0){};   //v.a.diese hier verstehe ich nicht 
ganz
   SC0DRL = data;
}

void sci0_puts(char* data){
   while (*data)
       sci0_putc(*data++);
}


THX! Das würde mir sehr helfen, auch andere Bsp zu verstehen!

von Karl M. (movex)


Lesenswert?

APW schrieb:
> Wenn du den MC912DG128A hast, wieso nimmst du dann #include
> <hcs12dp256.h> ?

Das hatten wir schonmal : 
Beitrag "Einfaches Programm für Card12 mit HC12"


Jochen R. schrieb:
> while ((SC0SR1 & TDRE) == 0){};   //v.a.diese hier verstehe ich nicht

Transmit Data Register Empty - das Daten Register sollte erst wieder 
beschrieben werden, nachdem das letzte gesendet wurde. Das ist eine 
Bitmaske, die auf das Statusregister gelegt wird.

Wir hatten hier erst kürzlich nen Thread zum HC12 SCI Modul -> 
Suchfunktion.

von J. R. (cia_man)


Lesenswert?

Karl L. schrieb:
> APW schrieb:
>> Wenn du den MC912DG128A hast, wieso nimmst du dann #include
>> <hcs12dp256.h> ?
>
> Das hatten wir schonmal :
> Beitrag "Einfaches Programm für Card12 mit HC12"
>
>
> Jochen R. schrieb:
>> while ((SC0SR1 & TDRE) == 0){};   //v.a.diese hier verstehe ich nicht
>
> Transmit Data Register Empty - das Daten Register sollte erst wieder
> beschrieben werden, nachdem das letzte gesendet wurde. Das ist eine
> Bitmaske, die auf das Statusregister gelegt wird.
>
> Wir hatten hier erst kürzlich nen Thread zum HC12 SCI Modul ->
> Suchfunktion.

Könntest du mir bitte mal hierzu nen Link geben... da kommt voll viel 
bei der Suche...

Und die while-Schleife funktioniert doch wie normal oder? Also während 
die Bedingung in der Schleife gilt, wird sie durchlaufen immer und immer 
wieder...

Zu dem das hatten wir schon siehe meine Antwort weiter oben ^^ ;)

THX!

von Karl M. (movex)


Lesenswert?


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.