C51 - printf,scanf

Gast #3062728
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?
#3062852
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.
Gast #3062902
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.
Gast #3062927
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?
#3064449
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 ;)
Gast #3065229
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!
Angehängte Dateien:
#3065333
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.
Gast #3065360
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.
Gast #3065690
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?
Angehängte Dateien:
#3065869
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).
#3066028
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.
Gast #3066172
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
#3066592
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.
Gast #3066641
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!
Angehängte Dateien:
#3066670
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).
#3066685
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.
Gast #3066705
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
#3066714
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.
#3066734
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.
Gast #3066737
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..
Gast #3066758
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..
Gast #3066793
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?
Gast #3066896
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.
Gast #3066961
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren