>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?
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ß?
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.
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).
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.
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.
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?
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...
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 ;)
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!
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.
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.
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.
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?
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).
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.
:). 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.
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
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.
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!
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).
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.
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
"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?
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.
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.
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..
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.
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..
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?
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.
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