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.
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 | }
|
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???
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!
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 ;)
APW schrieb: > Falsche Baudrate !? Ne die passt! ;) Hab 19200.... stimmt das??? Also das terminal geht so normal...
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
Na dann Low Level debuggen und nachsehen was er so ins Senderegister reinschreibt.
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?
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! :(
na dann: SC0BDL = 26 Welche Busfrequenz + Prozessor ist das überhaupt ?
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!
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!
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!!!
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! ;)
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!
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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.