mikrocontroller.net

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


Autor: J. R. (cia_man)
Datum:

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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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:
void sci0_init(void){
    SC0BDH=0;  // 38400 BR=13 (MCLK=8MHz)
    SC0BDL=13; // MCLK/(16*BaudRate)
    SC0CR1=0;
    SC0CR2=0x0C; //TE+RE enable
}

void sci0_putc(char data){
   while ((SC0SR1 & TDRE) == 0){};
   SC0DRL = data;
}

void sci0_puts(char* data){
   while (*data)
       sci0_putc(*data++);
}
Und dann kannst du halt sowas machen:
int main(){
  sci0_init();
  sci0_puts("Hallo ich bin ein String");
  sci0_putc('1'); sci0_putc('2'); sci0_putc('3');

  while(1);
}

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
> void sci0_init(void){
>     SC0BDH=0;  // 38400 BR=13 (MCLK=8MHz)
>     SC0BDL=13; // MCLK/(16*BaudRate)
>     SC0CR1=0;
>     SC0CR2=0x0C; //TE+RE enable
> }
> 
> void sci0_putc(char data){
>    while ((SC0SR1 & TDRE) == 0){};
>    SC0DRL = data;
> }
> 
> void sci0_puts(char* data){
>    while (*data)
>        sci0_putc(*data++);
> }
> 
> Und dann kannst du halt sowas machen:
>
> int main(){
>   sci0_init();
>   sci0_puts("Hallo ich bin ein String");
>   sci0_putc('1'); sci0_putc('2'); sci0_putc('3');
> 
>   while(1);
> }
> 

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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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
char sci0_getc(void){
   while ((SC0SR1 & RDRF) == 0);
   return(SC0DRL);
}

// Achtung keine Überprüfung der Buffer-Länge!
char sci0_gets(char *buffer){
  char len=0;
  do{
    *buffer = sci0_getc();
    len++;
  }while(*buffer++ != '\n');
  *buffer = '\0'; //Terminierung
  return len;
}

main(){
  char *str_buffer[64];

  sci0_puts("Bitte String eingeben:");
  sci0_gets(str_buffer);
  sci0_puts("Die Eingabe lautet:\n");
  sci0_puts(str_buffer);
}

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!

Autor: J. R. (cia_man)
Datum:

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

Autor: APW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsche Baudrate !?

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
APW schrieb:
> Falsche Baudrate !?

Ne die passt! ;)

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

Autor: Timmo H. (masterfx)
Datum:

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

Autor: APW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na dann Low Level debuggen und nachsehen was er so ins Senderegister
reinschreibt.

Autor: J. R. (cia_man)
Datum:

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

Autor: J. R. (cia_man)
Datum:

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

Autor: APW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na dann: SC0BDL = 26
Welche Busfrequenz + Prozessor ist das überhaupt ?

Autor: J. R. (cia_man)
Datum:

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

Autor: Timmo H. (masterfx)
Datum:

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

Autor: APW (Gast)
Datum:

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

Autor: J. R. (cia_man)
Datum:

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

Autor: J. R. (cia_man)
Datum:

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

Autor: J. R. (cia_man)
Datum:

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

Autor: Karl M. (movex)
Datum:

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

Autor: J. R. (cia_man)
Datum:

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

Autor: Karl M. (movex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.