den Fehler hab ich wie gesagt nicht gefunden und auchnicht beheben können, hab die Outputs halt nun auf den RC-Pins.
Druckbare Version
den Fehler hab ich wie gesagt nicht gefunden und auchnicht beheben können, hab die Outputs halt nun auf den RC-Pins.
Bei fast allen PIC's mit Komparatoren und AD-Wandlern, sollte man sich nicht darauf verlassen, dass diese nach einem Reset auch abgeschaltet sind.
Probiere doch mal dieses und mach dann deiner Initialisierung weiter.
MOVLW 6 ; alle digital
BANKSEL ADCON1
MOVWF ADCON1
MOVLW 7 ; Komparator aus
BANKSEL CMCON
MOVWF CMCON
Mfg
Andy
Hallo Andy62,
der PIC16F876A hat meines Wissens nach kein CMCON-Register.
Eine 6 im ADCON1-Register sollte am Port A alle Pins auf digital umschalten.
Wenn im TRISA-Register noch alle Pins auf Ausgang initialisiert wurden und dann am PORTA-Register Werte ausgegeben werden, sollten die Pins entsprechende Pegel annehmen.
Hallo kalledom,
Der PIC16F87xA hat Komparatoren. Siehe auch Datenblatt Seite 136.
Eigentlich sollte der Komparator nach einem Reset aus sein (Wert 7).
Bei den den ersten PICs dieser Serie war dem aber nicht so. (bestätigt von Microchip)
Also vorsichtshalber mit 7 initialisieren.
Ich habe es festgestellt, weil beim PIC16F873A die AD Eingänge nicht funktionierten wollten.
Mfg
Andy
Hallo Andy62!
Das stimmt. Ich initialisiere grundsätzlich immer alle nötige Register, da die ein paar Zeilen keinen grossen Unterschied macht.
Ausserdem initialisiere ich immer die Ports (clrf PORTX) erst nach den allen Register (CMCON, ADCON, TRISX, u.s.w.) und bisher habe ich keine Probleme mit den Ports gehabt.
MfG :)
Was soll ich sagen, ich staune. Ich habe ein Orginal-Handbuch von Microchip: PIC16F87X Data Sheet, Device included: PIC16F873, 874, 876, 877. In diesem Buch ist kein CMCON drin, weder im Index, noch im Inhaltsverzeichnis, noch sonst wo.
Aber ihr habt Recht, in der PDF-Datei habe ich CMCON gefunden, laut, klar und deutlich.
Allerdings habe ich noch nie ein Problem an Port A mit Digital-Pins gehabt, .... weil ich die vielleicht immer nur analog genutzt habe ???
@PICture
PORTx initialisiere ich immer zuerst, vor TRISx, damit die Ausgänge sofort den richtigen Zustand haben. Das wirst Du auch in vielen Listings so finden.
@kalledom
Es ist leider so, das die Hersteller ständig irgenwas an seinen Produkten ändern und man muss ständig die neuste Versionen von Datenblätter haben, um auf laufendem zu bleiben. Leider schaffen das nicht alle, und die haben dann Probleme. Ich kann selber schon nicht mitkommen.
Zum Beispiel habe ich noch alte PIC´s 16F628 und für die kann ich beim Microchip nicht mehr gültige Datenblätter finden, weil die gibts jetzt nur für PIC16F628A. Zum Glück alte CD´s mit Datensicherung lassen sich nicht löschen und da sind sie noch zu finden. So langsam hat die Datensicherung anderen Sinn.
Mit den Portsinitialisierung bin ich nicht überzeugt. Ich weiss nämlich sicher, dass bevor die Portpins nicht in TRISX als Ausgänge definiert sind, (POR macht fast alle als Eingänge), können sie nichts ausgeben. Und solche Initialisierung habe ich wahrscheinlich von Microchip Beispielen gelernt.
Fast jeder (ich auch) hat sich dafür eine eigene Erklärung gefunden und der bleibt er treu, ... bis er deswegen Probleme kriegt. :)
Schöne Grüsse !!!
Das ist richtig; nach POR (Power-On-Reset) sind alle Pins Eingänge, weil es Sinn macht. Da kann es keine 'Kurzen' mit der externen Hardware geben.Zitat:
Zitat von PICture
Allerdings ist nach POR unbestimmt, was in den Ausgangs-Registern steht; wenn Du zuerst die Pin's auf Ausgang setzt, werden diese unbestimmten Informationen sofort ausgegeben. Das kann zu unerwünschten Nebeneffekten führen. Deshalb setze ich zuerst die Ausgangs-Register auf die erforderlichen Ausgangswerte und dann erst die TRISx-Register.
Wenn Du einen Wert an PORTx übergibst, schreibst Du den Wert in ein Register, also in ein 8 Bit D-Latch. Die Ausgänge von diesem D-Latch werden erst dann ausgegeben, wenn das TRISx-Register für den jeweiligen Pin als Ausgang gesetzt wird. Das sind einfach nur logische Verknüpfungen über Gatter.
Du kannst z.B. für einen externen Bus ein Port bidirektional nutzen. Dort kannst Du erst Daten ausgeben, umschalten auf Eingang, Daten einlesen und wieder auf Ausgang zurück schalten, ohne daß das Ausgangs-Register verändert wird.
Du kannst aber auch, bevor Du wieder auf Ausgang zurück schaltest, die Ausgangs-Register erst neu setzen; dann ist gleich die aktuelle Information auf dem Bus und nicht erst noch ganz kurz die alte Information, was unnötige Bus-Veränderungen bedeutet.
Im Datenblatt sind sehr schöne 'Schaltpläne' zu den unterschiedlichen I/O-Pins gezeichnet, an denen man die Zusammenhänge recht gut erkennen kann; ein Bild sagt mehr als tausend Worte.
Hallo kalledom!
Vielen Dank für Deine ausführliche Erklärung !
Diesmal hast Du mich überzeugt und ich werde das in den nächsten Programmen anwenden. Bisher hab ich zwar keine Probleme damit, aber ich muss ja nicht (dank Dir) auf sie warten, sondern schon früher es ändern.
Schönste Grüsse! :)