Forum: Mikrocontroller und Digitale Elektronik Probleme mit RB7 und RB6 am PIC16F877A


von Yves E. (Gast)


Lesenswert?

Hi,
ich habe derzeit ein merkwürdiges Problem mit dem 16F877A.
Und zwar habe ich ein Programm für die Ansteuerung von vier 8x8 
Dot-Matrix LED Displays geschrieben. Das Programm funktioniert soweit 
tadellos, allerdings gibt es Probleme mit den beiden Zeilen, die von RB6 
und RB7 angesteuert werden. Ich habe es auch mit einem einfachen 
Programm getestet, bei dem einfach nur zwei LEDs leuchten sollen, nunja, 
sie leuchteten nicht. Das Problem fällt mir erst jetzt auf, da ich die 
Pins bei anderen Programmen immer nur als Eingänge genutzt habe und sie 
da problemlos ihren Dienst verrichteten.
Ich hatte den Verdacht dass es möglicherweise mit dem Debug Modus 
zusammenhängen könnte, aber das habe ich in der Konfiguration schon 
explizit deaktiviert, das sollte das Problem also nicht hervorrufen.
Einen anderen PIC habe ich auch schon getestet, das brachte keine 
Änderung.
Was habe ich also übersehen? Ich habe das Datenblatt schon ewig lang 
gewälzt und nichts brauchbares finden können, das Internet bot auch 
keinen Rat. Als Brenner verwende ich den Brenner8p von Sprut. 
Selbstverständlich ist im USBurner die hex Datei als Quelle des 
Konfigurationswortes markiert.
Hat jemand einen Rat für mich parat, der des Rätsels Lösung sein könnte?

Unten ist die Initialisierung zu sehen, alle Ports werden als ausgänge 
konfiguriert.


1
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF & _DEBUG_OFF
1
Init
2
3
  clrf  INTCON
4
  BCF   STATUS, RP0    
5
  BCF   STATUS, RP1       ; Bank0
6
  CLRF   PORTA         
7
  CLRF   PORTB
8
  clrf   PORTC
9
  clrf  PORTD
10
  clrf  PORTE        
11
                
12
  BSF   STATUS, RP0       ; Bank1
13
  MOVLW   0x06         
14
  MOVWF   ADCON1         
15
  movlw  B'00000000'      ; RA output
16
  movwf  TRISA  
17
  movlw  B'00000000'      ;RB output
18
  movwf  TRISB
19
  movlw  B'00000000'      ; RC output
20
  movwf  TRISC
21
  movlw  B'00000000'      ; RD output
22
  movwf  TRISD
23
  movlw  B'00000000'      ; RE output
24
  movwf  TRISE
25
  movlw  B'10000000'
26
  movwf  OPTION_REG
27
  bcf    STATUS, RP0      ; Bank0
28
  clrf  PORTA
29
  clrf  PORTB
30
  clrf  PORTC
31
  clrf  PORTD
32
  clrf  PORTE

von Yves E. (Gast)


Lesenswert?

Fällt niemandem dazu was ein?

von Ottmar K. (wil1)


Lesenswert?

Hallo,
Es könnte doch an der Konfigurationseinstellung liegen...

Ich arbeite geraden an einem Programm mit dem PIC 16F876A. Dort verwende 
ich diese Configuration:
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & 
_WRT_OFF & _LVP_OFF & _CPD_OFF
und alle Ausgänge an PORTB (auch RB6, RB7) arbeiten wie sie sollen.

Evtl. sollte auch bei Dir der Powerup-Timer mit " _PWRTE_ON"  (72ms 
Verzögerung des PIC-Start nach Einschalten der Versogrungsspannung) 
aktiviert sein. Schaden kann dies nicht, nur nützen. Es könnte ja sein, 
dass der PIC schneller hpchfährt als Vdd ansteigt!

Probier es einfach mal

mfG Ottmar

von Ottmar K. (wil1)


Lesenswert?

Sorry,
meine Antwort war nicht hilfreich (Krampf) - bitte streichen-
mfG Ottmar

von Elolehrling (Gast)


Lesenswert?

Hallo

Direkt dazu fällt mir nichts ein, allerdings hatte ich ein ähnliches 
Problem. Wie ich es genau gelösst habe weiss ich leider nichtmehr, 
allerdings bin ich mir ziemlich sicher das es etwas mit dem ICSP zutun 
hatte. Data & CLK sind ja auf RB6 & RB7...

Auch wenn dir meine Antwort möglicherweise keine grosse hilfe ist, hier 
mal meine Initialisierung für meinen PIC16F887... auf meinem Board 
funktioniert's perfekt:
1
list    p=16F887    ; Definiere den Prozessor PIC16F887
2
include    <p16f887.inc>  ; Include File
3
4
__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTOSCIO & _DEBUG_OFF
5
__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
1
InitPic
2
3
4
  banksel OSCCON
5
;--- System Clock
6
  movlw  b'01110101'    ; Bei Internem Oscillator
7
;          ||||||||
8
;          |||||||+---   Interner Oscillator als Quelle
9
;          ||||||+----   LF OSC Stabil?
10
;          |||||+-----   HF OSC Stabil? 
11
;          ||||+------   0=Intern oder 1=Externer Oszilator?
12
;          |+++-------   Frequenz: 8MHz
13
;          +----------   Wird nicht benutzt
14
  movwf  OSCCON      ; interner Clock auf 8MHz
15
16
17
    ; Startwerte Definieren
18
    ; ------------------------------------
19
20
  movlw  b'00000000'    ; Setze Port A auf 0
21
  movwf  PORTA
22
  movlw  b'00000000'    ; Setze Port B auf 0
23
  movwf  PORTB
24
  movlw  b'00000000'    ; Setze Port C auf 0
25
  movwf  PORTC
26
  movlw  b'00000000'    ; Setze Port D auf 0
27
  movwf  PORTD
28
29
  
30
      ; Einstellung Eingang / Ausgang
31
    ; ---------------------------
32
33
     bsf  STATUS,RP0      ; Selektion Bank1
34
    
35
  movlw  b'00001111'      ; 0: Ausgang, 1: Eingang
36
  movwf  TRISA            ; Port A Konfiguration (RA0 bis RA7)
37
  movlw  b'00000000'      ; 0: Ausgang, 1: Eingang
38
  movwf  TRISB            ; Port B Konfiguration (RB0 bis RB7)
39
  movlw  b'00000000'      ; 0: Ausgang, 1: Eingang
40
  movwf  TRISC            ; Port C Konfiguration (RC0 bis RC7)
41
  movlw  b'00000000'      ; 0: sortie, 1: entrée
42
  movwf  TRISD            ; Port D Konfiguration (RD0 bis RD7)
43
44
  bcf  STATUS,RP0  
45
46
  banksel  ANSEL          ; Wechsle bank zu Ansel Register
47
  clrf     ANSEL          ; Setze Ansel Register auf 0
48
  banksel  ANSELH         ; Wechsle Bank zu AnselH Register
49
  clrf     ANSELH         ; Setze AnselH Register auf 0
50
51
  banksel 0x00
52
53
  return                ; Zurück zum Hauptprogramm

Mit dieser Initialisation, habe ich für dich eben folgendes Code 
geschrieben um ihn zu testen: (PORTA,0 = Schalter auf meinem Board!)
1
Loop
2
3
  btfsc  PORTA,0    ; Teste PORTA Schalter 0 (Low Aktiv)
4
  goto  Nicht_gedrückt
5
  goto  Gedrückt
6
7
Nicht_gedrückt  
8
  bcf  PORTB,6            ; Reset RB6 & RB7
9
  bcf  PORTB,7
10
  goto   Loop     ; Zurück zum Anfang
11
12
Gedrückt
13
  bsf  PORTB,6     ; Set RB6 & RB7
14
  bsf  PORTB,7  
15
  goto  Loop     ; Zurück zum Anfang

Hab den Code dann direkt mal Kompiliert und mit einem Multimeter die 
Spannung an RB6 & RB7 gemessen. Bei mir schalten die Ausgänge problemlos 
von 0V auf 4,75V! Vielleicht kannst du versuchen, deinen Code auf meinem 
zu basieren... wo das dein Fehler genau liegt, weiss ich nicht. Evtl. 
reicht es auch schon, wenn du nur meine CONFIG Einstellungen übernimmst.

Hoffe ich konnte dir helfen.

von Yves E. (Gast)


Lesenswert?

Danke für die Tipps, leider haben die mir nicht weitergeholfen :(
Ich verwende übrigens die aktuellste Version von MPLAB. Ich wollte mal 
Testweise das Programm mit MPLAB-X Assemblieren, allerdings muss man da 
ja den Assembler manuell installieren und ich finde mich auf der 
Microchip Seite etwas schlecht zurecht. Prinzipiell könnte ich ja auch 
MPASM verwenden, der im alten MPLAB enthalten ist, oder?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.