Hallo PIC-Experten,
ich habe hier ein echtes Problem: es geht um einen PIC16F877.
Der soll auf PORTA,0 eingehende Signale erfassen und dann in ADRESL bzw ADRESH ablegen. Klappt aber nicht.
Wenn ich das Programm ohne diesen A/D-Wandler laufen lasse, kann ich im Programm Daten eingeben, die werden dann auch korrekt auf den beiden 7-Segmenter angezeigt. Sobald aber das A/D-Teil dazu kommt, leuchten bei der rechten Anzeige alle Teile, sogar der Dezimalpunkt, der nirgends im Programm angespochen wird, auf.
Ich bin kurz vorm Haareausreißen, wenn nicht sogar Suizid.
Ich habe alles durch: den geliebten Sprut, das Buch von Günter Schmitt und das halbe Netz. Aber nichts funktioniert.
Wer was weiß, darf mich auch gerne anrufen. Daten stehen in meiner Vika.
Schon im Voraus Danke für jeden Tip! cu, jo-enn
Moin,
lade doch mal den Quellcode irgend wo hoch und poste den Link.
Alles andere ist rumraten ohne Glaskugel.
Grüße,
hallo.
haben dir Peter(TOO) und Ph33 denn nicht weiterhelfen können?
AD-eingang einlesen und 7segment-anzeige ansteuern sind eigentlich popel-aufgaben ausm mikrocontrollerpraktikum.
Ich bin kurz vorm Haareausreißen, wenn nicht sogar Suizid.
dann hilft es vielleicht - zumal du keine ahnung hast - den mist in einer hochsprache zu programmieren, anstatt sich mit assembler rumzuplagen?
eine hochsprache bzw. der zugehörige compiler bewahrt einen recht zuverlässig vor maschinennahen flüchtigkeitsfehlern. und beispiele im netz gibt’s genug.
ansonsten schick mal den kompletten code.
gruß
michael
Auch Hallo,
haben dir Peter(TOO) und Ph33 denn nicht weiterhelfen können?
Nein! Peter(TOO) hat nur den Text formatiert,war ja auch nicht schlecht, aber geholfen hats nichts. Und von Ph33 warte ich heute noch auf eine Antwort.
AD-eingang einlesen und 7segment-anzeige ansteuern sind
eigentlich popel-aufgaben ausm mikrocontrollerpraktikum.
Theoretisch ja.
dann hilft es vielleicht - zumal du keine ahnung hast - den
mist in einer hochsprache zu programmieren, anstatt sich mit
assembler rumzuplagen?
Als ich vor etwa 15 Jahren in die PIC-Geschichte eingestiegen bin, wurde mir Assenbler empfohlen.
Habs dann auch ausprobiert: wir waren drei Leute: ich und zwei Studenden. Einer kannte C, der andere c++.
Nach Zwei Tagen war mein Programm fertig und im PIC noch so viel Platz. Die beiden anderen waren kurz vorm Kollaps: der PIC war voll und die Hälfte vom Quelltext lag noch vor ihnen.
Ich darfs heute, nach 10 Jahren verraten: meine PIC-Programme laufen
heute noch bei VW in Wolfsburg.
Die Hochsprachen C bzw. C++ hatte ich jeweils nur in einem Kurzlehrgang.
Assembler habe ich mir bei DIYS beigebracht und bin bis heute gut zurecht gekommen. Nur ausgerechnet jetzt klemmts =8o(
Ich schicke Dir jetzt mal, abseits vom Forum, den kompletten Quelltext zu.
Darfst mich auch anrufen, meine Daten sind auf meiner VIKA.
Also bis dann, jo-enn
Hallo jo-enn,
Auch Hallo,
haben dir Peter(TOO) und Ph33 denn nicht weiterhelfen können?
Nein! Peter(TOO) hat nur den Text formatiert,war ja auch nicht
schlecht, aber geholfen hats nichts. Und von Ph33 warte ich
heute noch auf eine Antwort.
jetzt bin ich aber doch einigermaßen erstaunt: Ich hatte Dir geantwortet, aber Dein Quellcode war ja alles andere als vollständig!
Es hat für mich doch keinen Sinn, einen Code durchzuarbeiten, der dann doch nicht das Original ist, das Du in Deiner Schaltung verwendest und das diese beschriebenen Sperenzien macht. Michael meint ja wohl das Gleiche.
Viele Grüße von Ph33
Hallo jo-enn,
bist Du sicher, dass es nicht an der Platine liegt? Unterbrechungen oder Feinschlüsse?
Grüße von Ph33
Hi Ph33,
Auch Hallo,
haben dir Peter(TOO) und Ph33 denn nicht weiterhelfen können?
Nein! Peter(TOO) hat nur den Text formatiert,war ja auch nicht
schlecht, aber geholfen hats nichts. Und von Ph33 warte ich
heute noch auf eine Antwort.jetzt bin ich aber doch einigermaßen erstaunt: Ich hatte Dir
geantwortet, aber Dein Quellcode war ja alles andere als
vollständig!
Er war bis zu dem Punkt, da hätte man schon auf der rechten Anzeige Ziffern sehen müssen, komplett, wenn auch noch nicht perfekt.
Es hat für mich doch keinen Sinn, einen Code durchzuarbeiten,
der dann doch nicht das Original ist, das Du in Deiner
Schaltung verwendest und das diese beschriebenen Sperenzien
macht. Michael meint ja wohl das Gleiche.
Würde wohl schon reichen, wenn nur die eine, also die niedere, rechte Seite funktionniert. Aber bis heute ist mir nicht klar, warum auch der Dezimalpunkt angesteuert wird. Der ist ja z.B. für die rechte Anzeige stes auf „L“ gestzet, also aus. Und dennoch wird er plötzlich angesprochen.
Der Fehler liegt irgendwo im A/D-Teil. Egal ob Sprut, Schmitt oder sonstwer.
Ich weiß jedenfalls nicht weiter.
Grüße, jo-enn
Hi Ph33,
bist Du sicher, dass es nicht an der Platine liegt?
100% ja!
Unterbrechungen oder Feinschlüsse?
Nein, denn wenn ich die Sache ohne den A/D-Teil betreibe und ihm irgendwelche Werte gebe, dann klappt das.
Nur wenn die Werte vom A/D kommen, dann funzt nichts mehr!
cu, jo-enn
Hallo jo-enn,
Würde wohl schon reichen, wenn nur die eine, also die niedere,
rechte Seite funktionniert. Aber bis heute ist mir nicht klar,
warum auch der Dezimalpunkt angesteuert wird. Der ist ja z.B.
für die rechte Anzeige stes auf „L“ gestzet, also aus. Und
dennoch wird er plötzlich angesprochen.
Der Fehler liegt irgendwo im A/D-Teil. Egal ob Sprut, Schmitt
oder sonstwer.
Ich weiß jedenfalls nicht weiter.
Da Problem liegt vermutlich darin, dass da irgendetwas in ein falsches Register schreibt, also in eines der Portregister, welches etwas mit deinem Display zu tun haben.
-
Sehr beliebt sind fehlerhafte Interupt-Routine, welche ein Register zerstören (weil man vergessen hat es zu retten, bzw. zu restoren).
-
Grundsätzlich ist das vergessene retten von Registern immer eine Fehlerquelle.
-
Auch beliebt ist die doppelte Verwendung von globalen Variablen.
-
Stackoverflows haben auch immer lustig Effekte.
-
Wichtig beim suchen ist, dass der Fehler nicht unbedingt dort zu finden ist, wo er auftritt.
-Möglich wäre noch, ein Konfigurationsfehler in der Peripherie, sodass z.B. eine Leitung versehentlich einen unbelegten Interrupt auslöst.
- In Assembler kann man alles falsch machen!
- Hochsprachen haben den Vorteil, dass sich der Compiler um das Retten der Register kümmert und diese Fehlerquelle schon vom Compiler umgangen wird.
Ohne deinen ganzen Quelltext, können wir dir aber nicht konkret weiterhelfen.
MfG Peter(TOO)
Hi Peter(TOO),
Da Problem liegt vermutlich darin, dass da irgendetwas in ein
falsches Register schreibt, also in eines der Portregister,
welches etwas mit deinem Display zu tun haben.
Hm und kopfkratz, Du hast ja den Quelltext schon vor Dir. Im Interrupt steht nicht viel drin.
- Sehr beliebt sind fehlerhafte Interupt-Routine, welche ein
Register zerstören (weil man vergessen hat es zu retten, bzw.
zu restoren).- Grundsätzlich ist das vergessene retten von Registern immer
eine Fehlerquelle.- Auch beliebt ist die doppelte Verwendung von globalen
Variablen.
Die schmeisst mein MPLAB sofort automatisch raus.
- Stackoverflows haben auch immer lustig Effekte.
So weit geht mein Programm noch nicht.
- Wichtig beim suchen ist, dass der Fehler nicht unbedingt
dort zu finden ist, wo er auftritt.-Möglich wäre noch, ein Konfigurationsfehler in der
Peripherie, sodass z.B. eine Leitung versehentlich einen
unbelegten Interrupt auslöst.
Ich habe nur einen Interupt, aber dass siehst Du ja im Quelltext. (Ich hoffe mal, Du bist kein Assembler-Hasser).
- In Assembler kann man alles falsch machen!
Naja, nicht alles, manches.
- Hochsprachen haben den Vorteil, dass sich der Compiler um
das Retten der Register kümmert und diese Fehlerquelle schon
vom Compiler umgangen wird.
Hatte ich schon mal erwähnt: C und C++ hatte ich nur jeweils einen zweiwöchigen Lehrgang, der am Ende mit dem berühmten „Hello World“ links oben auf dem Monitor erschien. Aber genau den brauche ich nicht!
Ich muss für Maschinen bauen, die brauchen keinen Monitor!
Ohne deinen ganzen Quelltext, können wir dir aber nicht
konkret weiterhelfen.
Den hast Du doch aber schon, falls nicht angekommen, gib mal ein kurzes SOS! Dann kriegst Du es nochmal.
Ich habe den Fehler weitestgehend eingegrenzt: Ohne das A/D-Teil läuft alles. Ich kann alles darstellen. Hab sogar ein Programm, da läuft im Sekundentakt die rechte Anzeige von L0 bis L9 hoch, danach wird Hx inkrementiert. Klappt Supi. Und der Dezimalpunkt ist immer aus.
Nur wenn der A/D dazu kommt, funzt nichts mehr.
Darfst mich auch anrufen, ich rufe dann sofort zurück (wegen der Kosten). Heute bis etwa 22:00 und morgen ab 9:00.
Danke erst mal, jo-enn
btw.: ich habe DSL und ISDN, also alles sofort verfügbar!
Hallo jo-enn,
Da Problem liegt vermutlich darin, dass da irgendetwas in ein
falsches Register schreibt, also in eines der Portregister,
welches etwas mit deinem Display zu tun haben.Hm und kopfkratz, Du hast ja den Quelltext schon vor Dir. Im
Interrupt steht nicht viel drin.
Ich habe nur das was hier steht:
/t/pic-probleme–5/7242748/3
- Stackoverflows haben auch immer lustig Effekte.
So weit geht mein Programm noch nicht.
Und wie funktionieren wohl Interrupts?
- In Assembler kann man alles falsch machen!
Naja, nicht alles, manches.
Glaube mir, man kann alles
Hatte ich schon mal erwähnt: C und C++ hatte ich nur jeweils
einen zweiwöchigen Lehrgang, der am Ende mit dem berühmten
„Hello World“ links oben auf dem Monitor erschien. Aber genau
den brauche ich nicht!
Ich muss für Maschinen bauen, die brauchen keinen Monitor!
Ich habe die letzten 35 Jahre nicht anderes gemacht.
(Abgesehen von den Benutzeroberflächen auf dem PC).
Die letzten 20-25 Jahre aber hauptsächlich in C. Heutige Compiler machen fast so kompakten Code wie direkt Assemblerprogramme, wenn man damit umgehen kann.
Was sich aber nicht in C machen lässt, ist das cstartup und der Taskwechsler im Multitasksystemen.
Bei er Compilerentwicklung kommt man auch nicht um Maschinencode rum, das ist ja die Aufgabe des Backends.
Den hast Du doch aber schon, falls nicht angekommen, gib mal ein
kurzes SOS! Dann kriegst Du es nochmal.
SOS
MfG Peter(TOO)
Hallo Peter(TOO),
Hallo jo-enn,
Da Problem liegt vermutlich darin, dass da irgendetwas in ein
falsches Register schreibt, also in eines der Portregister,
welches etwas mit deinem Display zu tun haben.
Sehr beliebt sind fehlerhafte Interupt-Routine, welche ein
Register zerstören (weil man vergessen hat es zu retten, bzw.
zu restoren).Grundsätzlich ist das vergessene retten von Registern immer
eine Fehlerquelle.Auch beliebt ist die doppelte Verwendung von globalen
Variablen.Stackoverflows haben auch immer lustig Effekte.
Wichtig beim suchen ist, dass der Fehler nicht unbedingt
dort zu finden ist, wo er auftritt.-Möglich wäre noch, ein Konfigurationsfehler in der
Peripherie, sodass z.B. eine Leitung versehentlich einen
unbelegten Interrupt auslöst.Ohne deinen ganzen Quelltext, können wir dir aber nicht
konkret weiterhelfen.
das habe ich jo-enn auch schon gesagt. Ohne den kompletten Quelltext kann man diese „beliebten Fehlerchen“ nicht finden. Jede Suche in Bruchteilen des Quelltextes ist wie stochern im Kaffeesatz.
Jo-enn hatte mir auch schon einen Assembler-Text geschickt, der schon von Dir, Peter(TOO) bearbeitet worden sei; unvollständig ist der Text trotzdem. Ich kann daraus nicht erschließen, wie das Programm arbeiten soll. Eine Schaltung des PICs mit seiner Peripherie wäre für die Fehlersuche nützlich.
MfG Peter(TOO)
Grüße von Ph33
Hi Ph33,
schick mir bitte mal Deine private e-mail-Adresse (an mich auch privat).
Ich sende dann noch ein paar Erlärungen dazu.
Also bis gleich!
jo-enn (oder im wahren Leben: Jens)