PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC16F876A Probleme mit PORTA



impact
02.02.2007, 22:56
Hallo, ich probiere nun schon seit tagen rum am meinem PIC16F876A die RA-Ports (alles Outputs) zum laufen zu bringen.

(RA1,RA2,RA3,RA4,RA5) trotz aller bemühungen klappt es nicht ich bekomm immer nur einen ausgang zum "Durchschalten" (RA5). Woran kann das liegen? die ADCs sind aus... bin mit meinem latein am ende...





init

;
; --------------------------------
; Ports Initalisieren
; --------------------------------
; 0 = Output, 1 = Input

clrf PORTA
clrf PORTB
clrf PORTC

bsf STATUS,RP0 ; RAM Bank 1

; 16F876: alle ADC-Eingänge auf digital I/O umschalten
MOVLW 0x06 ; PCFG3..0 = '0110'
MOVWF ADCON1


movlw b'00000000'
movwf TRISA

movlw b'11111111'
movwf TRISB

movlw b'11111000'
movwf TRISC

bcf STATUS, RP0 ; Bank 0

goto StartPIC
....
[/code]

kalledom
03.02.2007, 00:18
Für Port A mußt Du neben der Richtung (Eingang oder Ausgang) auch noch initialisieren, welcher Pin analog bleibt und welcher Pin digital werden soll:

; -----------------------------------------------
; ADCON1 (Bank 1) AD Control-Register 1 :
; 7 Result Format 8 Bits in ADRESH / 2 Bits in ADRESL(7..6 000000)
; 6-4 -
; 3-0 Port Config
; an7 an6 an5 AN4 AN3 AN2 AN1 AN0 Ref+ Ref-
; Bits RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0
; 0000 A A A A A A A A Vdd Vss
; 0001 A A A A Ref+ A A A RA3 Vss
; 0010 D D D A A A A A Vdd Vss
; 0011 D D D A Ref+ A A A RA3 Vss
; 0100 D D D D A D A A Vdd Vss
; 0101 D D D D Ref+ D A A RA3 Vss
; 011x D D D D D D D D Vdd Vss
; 1000 A A A A Ref+ Ref- A A RA3 RA2
; 1001 D D A A A A A A Vdd Vss
; 1010 D D A A Ref+ A A A RA3 Vss
; 1011 D D A A Ref+ Ref- A A RA3 RA2
; 1100 D D D A Ref+ Ref- A A RA3 RA2
; 1101 D D D D Ref+ Ref- A A RA3 RA2
; 1110 D D D D D D D A Vdd Vss
; 1111 D D D D Ref+ Ref- D A RA3 RA2
; -----------------------------------------------
movlw 00000010b
; 0 = Result format = Left
; 0010 = Analog RA0-RA3 & RA5
; = Digital RA4,RE0-RE2
movwf ADCON1

PortA Bit 4 (RA4) ist nur digital, deshalb funktioniert der auch immer :-)

Edit: Mit Brille wär das nicht passiert: Du hast ja ADCCON1 gesetzt und auch vorher auf Bank 1 umgeschaltet.

Hast Du ganz am Anfang:
include "p16f877a.inc" ; Registerdefinitionen einbinden
und
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC & _LVP_OFF & _DEBUG_OFF

impact
03.02.2007, 17:23
Mein ganzer anfang sieht wie folgt aus:



LIST P=16F876A, R=DEC ; Benutze Pic16F676A

#include "P16F876A.INC" ; Fileheader includen

__config _HS_OSC & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_ON

waitloopA equ 0x20 ; warteschleife A
waitloopB equ 0x21 ; warteschleife B
waitloopC equ 0x22 ; warteschleife C

#define StatusLED1 PORTC,2 ; Status LED 1
#define StatusLED2 PORTC,1 ; Status LED 1
#define StatusLED3 PORTC,0 ; Status LED 1

#define ServoD0 PORTA,3 ; ServoData 0
#define ServoD1 PORTA,4 ; ServoData 1
#define ServoD2 PORTA,5 ; ServoData 2

#define MotorD0 PORTA,0 ; MotorData 0
#define MotorD1 PORTA,1 ; MotorData 1
#define MotorD2 PORTA,2 ; MotorData 2

init

;
; --------------------------------
; Ports Initalisieren
; --------------------------------
; 0 = Output, 1 = Input

clrf PORTA
clrf PORTB
clrf PORTC

bsf STATUS,RP0 ; RAM Bank 1

; 16F876: alle ADC-Eingänge auf digital I/O umschalten
MOVLW 0x06 ; PCFG3..0 = '0110'
MOVWF ADCON1


movlw b'00000000'
movwf TRISA

movlw b'11111111'
movwf TRISB

movlw b'11111000'
movwf TRISC

bcf STATUS, RP0 ; Bank 0

goto StartPIC

kalledom
03.02.2007, 17:41
Tja, das ist soweit ok; und weil ein Ausgang funktioniert, würde ich jetzt mal einfach behaupten, Du steuerst die anderen Ausgänge nicht an :-(
Was ich auch vermisse, wo ist das ORG ?
Schau Dir mal diese (http://www.domnick-elektronik.de/picasm.htm) oder diese (http://www.domnick-elektronik.de/picpwm.htm) Assemblerbeispiele an, evtl. noch die PIC-Checkliste (http://www.domnick-elektronik.de/piccheck.htm), vielleicht findest Du dann den Fehler.

impact
03.02.2007, 17:55
jo das org 0x00 hab ich vergessen, jedoch änderts nix an der funktion, hab extra gestern ein Tesprogramm geschrieben was nur die Sinn hatte PORTA 0-5 zu Setzten.. nur RA5 ging auf +5V (direkt am µC-Pin gemessen). schon merkwürdig

PICture
04.02.2007, 03:31
Hallo impact!

Es wäre gut, wenn Du Dein ganzes Testprogramm posten würdest, dann kann man erst ein Fehler suchen... :)

Was macht das R=DEC (kenne ich nicht) in der ersten Zeile Deines Listings ?

MfG

kalledom
04.02.2007, 13:32
R = Radix, R=DEC = Zahlenangaben ohne Zusatz sind dezimal.
Andere Schreibweisen bleiben erhalten: 0xF8 ... 00011b .... 16 = dezimal

impact
04.02.2007, 14:25
Hallo, ich hab dienacht ggn 3 die tolle idee gehabt, meine platine einfach umzubaun. Hab nun die RA ports einfach nach RC verschoben und es klappt. ;) *Problem gekonnt übergangen*

PICture
04.02.2007, 14:39
Hallo kalledom!

Vielen Dank für Deine Erklärung ! Ich habe es noch nie benutzt, weil ich an hex gewohnt bin.

Schöne Grüsse ! :)

kalledom
04.02.2007, 17:17
@impact
Es wäre aber sicherlich für Alle interesanter gewesen, wenn Du uns hättest sagen können, wo der Fehler lag. Dann müssen wir nicht in die gleiche 'Falle' tappen (obwohl ich bisher kein Problem mit Port A als Digital-Port gehabt habe).

@PICture
Das radix kenne ich schon aus Z80-Zeiten, ist somit uuuuuuralt :-)

impact
04.02.2007, 20:35
den Fehler hab ich wie gesagt nicht gefunden und auchnicht beheben können, hab die Outputs halt nun auf den RC-Pins.

Andy62
05.02.2007, 00:45
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

kalledom
05.02.2007, 01:18
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.

Andy62
05.02.2007, 01:31
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

PICture
05.02.2007, 02:40
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 :)

kalledom
05.02.2007, 03:57
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.

PICture
05.02.2007, 05:51
@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 !!!

kalledom
05.02.2007, 11:56
... bevor die Portpins nicht in TRISX als Ausgänge definiert sind, (POR macht fast alle als Eingänge), können sie nichts ausgeben. 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.
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.

PICture
05.02.2007, 19:46
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! :)