Forum: Mikrocontroller und Digitale Elektronik C51 - printf,scanf


von Lens (Gast)


Lesenswert?

Moin,

Hab hier ein c515c von Infineon vor mir liegen. Ich begreif einfach 
nicht, was mit der IDE los ist, aber wenn ich folgendes mache:
1
printf("Irgendetwas\n");
2
scanf("%i", &i);
Wenn ich mich seriell mit dem Board verbinde, so gibt es überhaupt keine 
Ausgabe, einfach nichts.

Kann mir jemand bitte einen Rat geben?

von Peter D. (peda)


Lesenswert?

Vermutlich mußt Du die UART initialisieren (Baudrate setzen, enablen).

von Lens (Gast)


Lesenswert?

Das erledigt schon die mitgelieferte Bibliothek. Die serielle 
Schnittstelle wird initialisiert.

von Lens (Gast)


Lesenswert?

Aber wenn ich das "scanf" weglassen, so kommt schon eine Ausgabe über 
die serielle Schnittstelle

von Wurg Jönsch (Gast)


Lesenswert?

>Wenn ich mich seriell mit dem Board verbinde, so gibt es überhaupt keine
>Ausgabe, einfach nichts.

Woher weisst du denn überhaupt, dass dein Programm läuft?

von Peter D. (peda)


Lesenswert?

Lens schrieb:
> Das erledigt schon die mitgelieferte Bibliothek.

Dann zeig gefälligst das komplette compilierbare, linkbare Programm.

Wozu meinst Du gibt es den Dateianhang?
Damit man nur kleine Schnipselchen sieht und den Großteil erraten muß?

von Lens (Gast)


Angehängte Dateien:

Lesenswert?

Sry. Irgendwie ist ein  neues Thema enstanden. Hab die Datei angehangen.

von Lens (Gast)


Lesenswert?

Kann mir jemand helfen? Bin grad radlos?

von Andreas D. (rackandboneman)


Lesenswert?

"Das erledigt schon die mitgelieferte Bibliothek. Die serielle
Schnittstelle wird initialisiert."

Wer sagt das?

von Lens (Gast)


Lesenswert?

Das Manual sagt das. Deswegen bin ich ratlos.

von Karl H. (kbuchegg)


Lesenswert?

1
void main (void)
2
{
3
  SerInit();
4
  printf("Intervall fur die LED: ");
5
  scanf("%i", &interval);

Das ist aber nicht ganz exakt dasselbe, was du in deinem 
Eröffnungsposting gemacht hast. Im Eröffnungsposting ist der String mit 
einem \n abgeschlossen (welcher normalerweise einen Flush eines 
möglichen Output-Buffers auslöst). Das ist hier aber nicht der Fall.

von Lens (Gast)


Lesenswert?

Das ist nicht das Problem. Auch  mit '\n' geht es nicht. Woran liegt 
das?

von Bernhard S. (b_spitzer)


Lesenswert?

Mit welchem Terminalprogramm verbindest Du dich zum Controller? Wie 
beendest Du die Zahleneingabe?
Bekommst Du mit getchar() irgendwas eingelesen (das wäre dann 
Zeichenweise und müsste wieder zusammengebastelt werden).

von Lens (Gast)


Lesenswert?

Das ist komisch. Jetzt geht das, weil ich printf selber mit "putchar()" 
implementiert hab. Dafür geht jetzt aber das andere Projekt nicht, was 
aber vorher mit reinem "printf()" und "scanf()" ging.. Ich bin echt 
verwirrt.

von Bernhard S. (b_spitzer)


Lesenswert?

Compiler? IDE?

von Lens (Gast)


Lesenswert?

Ich hab die uvision / Microvision von Keil.

von Lens (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab die Infos zur Version als bild angehangen. Also was grad abgeht 
ist mir echt gespänstisch.. Kann ja nicht sein. Hoffentlich kann mir 
jemand aus dieser Patsche raushelfen.

von Lens (Gast)


Lesenswert?

Das komische ist, sobald ich scanf() und printf() vermische gibt es das 
Problem. Sobald ich jedoch entweder scanf() weglasse, oder printf selber 
implementiere mit "putchar()", tritt das Problem nicht mehr auf. Kann 
mir das jemand bitte erklären?

von Lens (Gast)


Lesenswert?

Wüsste jemand woran das Problem liegen könnte?

von Bernhard S. (b_spitzer)


Lesenswert?

Zu den Interna, die Keil macht, kann ich mangels passendem Compiler nix 
sagen. Ein Testprogramm mit RIDE könnte ich erst morgen ausprobieren.

Bernhard Spitzer schrieb:
> Mit welchem Terminalprogramm verbindest Du dich zum Controller? Wie
> beendest Du die Zahleneingabe?
Dazu kam noch nix...

von Lens (Gast)


Lesenswert?

Ich verbinde mich mit "Putty" mit dem Mikrokontroller. Die Zahleneingabe 
beende ich mit einem ganz normalen Leerzeichen.

von Andreas D. (rackandboneman)


Lesenswert?

Ich kenn diesen Compiler/diese Umgebung jetzt nicht im Detail - aber ich 
würde Manual mal genauer fragen ob nicht doch einige #defines gesetzt 
werden müssen bevor serinit.h included wird, oder irgendeine Funktion 
danach aufgerufen werden muss...

EDIT: NICHTS ist öfter falsch dokumentiert als default-Werte ;)

von Lens (Gast)


Angehängte Dateien:

Lesenswert?

Das Problem ist, dass es nur an einer Stelle dokumentiert wird, und dort 
heißt es nur "SERINIT.LIB" und "SERINIT.h" mit ins Projekt einbinden. 
Das wars. Im Dissasembly bleibt der Code an der Stelle hängen, die im 
angehangenen Bild zu sehen ist.

Bitte Hilfe!

von Thomas (Gast)


Lesenswert?

diese Bibliotek gehört nicht zum Lieferumfang von Keil.
Wo hast du die her? Wie ist SCON initisialisiert?
Thomas

von Andreas D. (rackandboneman)


Lesenswert?

Bau doch einfach mal selbst ne Initialisierung für die UART, das ist 
zwar frickelig aber auch kein Raketenbau...

PS wenn die Bibliothek nicht GENAU auf dieses Board *und die 
Quarzfrequenz* abgestimmt ist dann ist es sehr unwahrscheinlich dass 
eine Initialisierung ohne weitere Angaben funktionieren wird - die UART 
wird bei einem 8051er aus dem Haupttakt angetrieben (was ist denn da 
eigentlich für n Quarz drauf?) und muss abhängig von diesem 
initialisiert werden.

Es gibt Beispiele für heuristisch selbst konfigurierende 
Initialisierungsroutinen (zB in den klassischen 52er Basics) aber bei 
denen müssen weitere Bedingungen gegeben sein bzw die Kommunikation muss 
terminalseitig eingeleitet werden.

von Lens (Gast)


Lesenswert?

Hi,

Die Bibliothek ist von Phytec mitgeliefert und enthält eine "automatic 
baudrate detection". Die Kommunikation wird durch das Terminal 
eingeleitet, durch drücken der Leertaste. Doch auch darauf reagiert es 
nicht.
Wenn ich jedoch entweder printf selber implementiere oder das serielle 
Interface selber initialisiere, dann tritt das Problem nicht auf.

Das komische ist aber, dass in der Anleitung steht, man könne diese 
Bibliothek für den c515c hernehmen.

von Georg G. (df2au)


Lesenswert?

Lens schrieb:
> Die Bibliothek ist von Phytec mitgeliefert

Und was sagt Phytec, wenn man die auf das Problem anspricht? Nach meiner 
Erfahrung sind sehr kooperativ und kennen sich auch gut aus. Freundliche 
Email schreiben und innerhalb von Stunden hat man eine Lösung.

von Lens (Gast)


Lesenswert?

Danke für den Hinweis! Die sind sehr hilfsbereit!

von Lens (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

Ich bin mit meinem Problem weitergekommen, jedoch noch nicht am Ziel.
Mit eurer Hilfe wird das hoffentlich noch:
Ich hab die Quellcodedatei wieder angehangen. Es passiert folgendes
komisches:
Wenn ich "bit led_is_on = 0;" schreibe, dann bekomm ich keine Ausgabe.
Wenn ich aber "int led_is_on = 0;" schreibe, dann bekomm ich eine
Ausgabe.

Weiß jemand was der Fehler ist?

von Georg G. (df2au)


Lesenswert?

Lens schrieb:
> Wenn ich "bit led_is_on = 0;" schreibe, dann bekomm ich keine Ausgabe.
> Wenn ich aber "int led_is_on = 0;" schreibe, dann bekomm ich eine
> Ausgabe.

Was ist "keine Ausgabe"? Nichts über den UART oder wackelt der Port 
nicht?

P.S. Die Multiplikation innerhalb der ISR solltest du versuchen zu 
vermeiden, kostet viel Zeit. Des weiteren ist ein "using" Zusatz in 
der ISR Deklaration hilfreich für den Compiler. Und als letztes: Nimm 
bei einem schmalbrüstigen 8-Bitter immer den kleinst möglichen Datentyp, 
also char an Stelle von int (wenn du nur 0 und 1 unterscheiden willst).

von Lens (Gast)


Lesenswert?

Es tut sich nur was am Pin "TXD" der Terminalsoftware am PC, da ich ja 
was eingebe am Terminal. An "RXD" der Terminalsoftware tut sich jedoch 
nichts.

von Georg G. (df2au)


Lesenswert?

Da ich die serinit Lib nicht kenne, kann ich dir da nicht weiter helfen.

Mein Ansatz wäre, die Initialisierung der Seriellen Schnittstelle selbst 
"zu Fuß" zu machen. Keil nutzt für IO als default die serielle 
Schnittstelle.

Noch ein Tipp: Die startup.a51 solltest du kritisch ansehen. In den 
meisten Projekten macht sie nur Ärger. Die 5 wichtigen Zeilen daraus 
kann man selbst erledigen.

von Lens (Gast)


Lesenswert?

Hi Georg,

Wie kann ich die ersten 5 Zeilen von Startup.A51 selbst erledigen?

Aber erstmal danke für deine Antwort

von Stefan (Gast)


Lesenswert?

Kopieren

von Lens (Gast)


Lesenswert?

:). Wenn ich nur den oberen Teil kopiere, was bringt mir das dann? Im 
unteren Teil steht der ganze Code, der in Abhängigkeit von dem oberen 
Code irgendetwas macht.

von Lens (Gast)


Lesenswert?

Ja, also wenn ich das Initialisieren der seriellen Schnittstelle in ein 
Paar Zeilen selber mache, dann klappt alles wunderbar. Obwohl die von 
Phytec gelieferte "Serinit.lib"-Datei mehrere KByte groß ist, 
funktioniert mit ihr einiges nicht. Ist das eigentlich normal, dass die 
Bibliothek der Firma einfach nicht geht? Das gibts doch nicht

von Bernhard S. (b_spitzer)


Lesenswert?

Vermutlich steht im Handbuch, dass da erst gewisse Randbedingungen 
(inlcudes, defines) gesetzt sein müssen.

von Georg G. (df2au)


Lesenswert?

Lens schrieb:
> Wenn ich nur den oberen Teil kopiere, was bringt mir das dann?

Ich schrieb "die wichtigen Zeilen" und nicht "die ersten Zeilen". Die 
startup.a51 ist heftig kommentiert. Mit etwas Lesen sollte man da 
innerhalb von 15 Minuten alles verstehen können.

Wenn du den Quelltext der serinit.lib nicht hast, wirst du lange rätseln 
müssen, was da schief gelaufen ist. Falls es Doku gibt: RTFM ist immer 
ein guter Ansatz.

von Lens (Gast)


Angehängte Dateien:

Lesenswert?

Ich habs durchgelesen. Phytec selbst sagt: "Binden Sie Startup.A51" mit 
ins Projekt ein. Die Datei ist auf der CD mitgeliefert. Wenn da nur 
steht "Binden Sie ein", dann geh ich davon aus, dass ich in der Datei 
nichts ändern muss. Ich habe zwei Dateien angehangen. Die eine ist das 
Original, die andere hab ich aus Verzweiflung abgeändert, entsprechend 
der Konfiguration meines miniModuls-515c.

Dieses Problem bleibt aber: "SERINIT.LIB" funktioniert leider nicht. Ich 
bekomm keine Ausgabe am PC-Terminal und ich weiß nicht worans liegt.
Help please!

von Peter D. (peda)


Lesenswert?

Georg G. schrieb:
> Noch ein Tipp: Die startup.a51 solltest du kritisch ansehen. In den
> meisten Projekten macht sie nur Ärger.

Huch, seit wann das denn?

Die initialisiert doch nur den Stack und nullt allen Speicher.
Daher ist sie unbedingt nötig!

In älteren Keil Versionen muß man sie aber editieren, wenn z.B. XRAM 
erst eingeschaltet werden muß (z.B. beim AT89C51xxx).

von Peter D. (peda)


Lesenswert?

Georg G. schrieb:
> Des weiteren ist ein "using" Zusatz in
> der ISR Deklaration hilfreich für den Compiler.

Ist es nicht!
Es ist ein Expertenschalter, der dem Compiler sagt: Ich als 
Programmierer weiß, was ich tue und bin selber verantwortlich, wenn ich 
Mist baue.

Ohne "using" kümmert sich der Compiler automatisch um die 
Registersicherung im Interrupt. Und man darf sogar Unterfunktionen 
aufrufen.

Das "using" ist auch nur dann sinnvoll, wenn der Interrupt wirklich alle 
8 Register benötigt. Benötigt er z.B. nur 2, verschwendet das "using" 
die restlichen 6 Bytes. "using" sagt nämlich, die ganze Bank ist tabu.

Ich krieg immer die Krise, wenn Anfänger meinen, sie seien schlauer als 
der Compiler.
Wenn der Compiler als default "Small" empfiehlt, muß der Anfänger 
natürlich auf "Large" umschalten, damit die Programme richtig schön groß 
und schnarch langsam werden.

von Lens (Gast)


Lesenswert?

Hi Peter,

Erstmal danke für die Antworten. "Large" war nicht meine Idee, sondern 
die Idee des Herstellers und explizit auch in der Doku angegeben. Der 
Grund ist, dass eben noch ein externer XRAM mit dabei ist.
Aber zum Kern des Problems zurück:
1. Wieso funktioniert die mitgelieferte "SERINIT.LIB" nicht?
2. Muss ich die STARTUP.A51 nun selbst manuell ändern, oder werden die 
Einstellungen im Configuration Wizard des mvision4 von Keil automatisch 
darauf angewandt?

liebe Grüße

von Andreas D. (rackandboneman)


Lesenswert?

"Large" sorgt doch eher dafür dass der (rattenlangsame!) XRAM für alles 
verwendet wird statt nur dann wenn man als Programmierer explizit etwas 
dahin befördert, oder bin ich gerade im falschen Film?

von Peter D. (peda)


Lesenswert?

Lens schrieb:
> Im Dissasembly bleibt der Code an der Stelle hängen, die im
> angehangenen Bild zu sehen ist.

Das scheint Teil einer Autobaud Funktion zu sein.

Autobaud sollte man wirklich nur da benutzen, wo es wirklich unzumutbar 
ist, die Baudrate zur Compilezeit festzulegen.
Autobaud erwartet ein ganz bestimmtes Zeichen, damit es funktioniert.

Z.B. enthalten die Atmel-Bootloader eine solche Funktion, da sie nicht 
wissen können, welchen Quarz Du später mal anschließt.
Und da funktioniert die Erkennung mehr schlecht als recht. Man ist es 
gewohnt, Flip mehrmals zu starten und die Schaltung mehrmals zu 
resetten, ehe es sich verbinden kann.
Der Bootloader will ein "U" sehen. Tippt man was anderes ein, hängt er 
fest.

von Peter D. (peda)


Lesenswert?

Lens schrieb:
> Der
> Grund ist, dass eben noch ein externer XRAM mit dabei ist.

Nö.
XRAM kann man natürlich auch in Small benutzen. Man muß solche Variablen 
dann nur als xdata definieren.

Vermutlich wird die "SERINIT.LIB" aber nur als Large compiliert worden 
sein und dann muß das gesamte Projekt Large sein.

Lens schrieb:
> 1. Wieso funktioniert die mitgelieferte "SERINIT.LIB" nicht?

Wenn es zu der Lib keine ausführliche Doku gibt, schmeiß sie weg.
Eine Lib ohne Doku ist vollkommen nutzlos.

von Lens (Gast)


Lesenswert?

Ja, "SERINIT.LIB" hingegen will ein "Leerzeichen" als Startsignal haben. 
Doch auch wenn ich tausend Mal ein Leerzeichen eingebe, hängt es immer 
noch an der Stelle "JB RXD(0xB0),C:401A" (ganz oben im gelben Bild zu 
sehen).
Ich wär wirklich sowas von erleichtert, wenn ich wenigstens den Grund 
für das Problem wissen würde. So beunrihigt mich das..

von Peter D. (peda)


Lesenswert?

Andy D. schrieb:
> "Large" sorgt doch eher dafür dass der (rattenlangsame!) XRAM für alles
> verwendet wird statt nur dann wenn man als Programmierer explizit etwas
> dahin befördert, oder bin ich gerade im falschen Film?

Genau so isses.
Im Small kann man XDATA mit Sinn und Verstand zuweisen, im Large hat man 
diese Option nicht mehr.

von Lens (Gast)


Lesenswert?

Ja, "SERINIT.LIB" hingegen will ein "Leerzeichen" als Startsignal haben.
Doch auch wenn ich tausend Mal ein Leerzeichen eingebe, hängt es immer
noch an der Stelle "JB RXD(0xB0),C:401A" (ganz oben im gelben Bild zu
sehen).
Ich wär wirklich sowas von erleichtert, wenn ich wenigstens den Grund
für das Problem wissen würde. So beunrihigt mich das..

von Lens (Gast)


Lesenswert?

Diese Frage hat noch keiner beantwortet:
Muss ich in Keil mvision4 manuell die Einstellungen in "STARTUP.A51" 
umändern, oder werden automatisch die Einstellungen des Configuration 
Wizard in die Datei übernommen?

von Peter D. (peda)


Lesenswert?

Lens schrieb:
> Muss ich in Keil mvision4 manuell die Einstellungen in "STARTUP.A51"
> umändern

Nein.

von Lens (Gast)


Lesenswert?

Ok. Danke :). Naja, wieso "SERINIT.LIB" nicht geht wird ein Mysterium 
bleiben, das keiner wissen wird.

von B_Spitzer (Gast)


Lesenswert?

Andere Idee... mit welchem Quarz betreibst Du den Controller? Welche 
Baudrate ist im Terminal eingestellt? bei Hyperterm gibt es z.B. auch 
die Option Autobaudrate. Wenn also sowohl der PC als auch der Controller 
im Trüben fischen könnte das schiefgehen. Eventuell nimmt das Terminal 
wenn man zuerst sendet die Default-Einstellung aus dem Gerätemanager. 
Wenn da jetzt eine Baudrate eingestellt ist, die mit dem Quarz nicht 
geht - Pech gehabt.

von Lens (Gast)


Lesenswert?

Hey Leute,

Ich glaub jetzt werden wir alle lachen:
Meine Vermutung ist nun: Die SERINIT.LIB wurde zusammen mit der mvision2 
(einer älteren Version) geliefert. Das wiederum heißt, dass SERINIT.LIB 
mit einem älteren C-Compiler kompiliert wurde. Verwendet hab ich für 
mein Projekt allerdings mvision4 (neuere Version) und damit auch einen 
neueren C-Compiler.
--> Das dürfte doch der Grund sein, wieso es irgendwann nicht mehr geht 
oder?

liebe Grüße

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.