PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC plötzlich nicht mehr beschreibbar



Rico88
26.04.2010, 18:36
Hallo,

nachdem ich nun erstmals nen Projekt mit einem PIC fertiggestellt hab packt mich plötzlich so richtig das Intresse mehr aufbauen zu können. Also habe ich mal auf nen Steckbrett nen PIC16F876 mit nen 20MHz Quarz aufgebaut. Um ein wenig zu spielen.
Bei der jetzigen Konfiguration habe ich ein 4x20Zeichen Dot-Matrix-Display am PortB hängen, 4Schalter an PortA0..3 und 4LED's an PortC0..3.
Meine letzte Durchführbare Aktion war die Programmierung des PWM1-Moduls. Dort habe ich nen Tastverhältnis von 50% an PortC,2 ausgegeben, was auch noch einwandfrei funktioniert (Auch mit dem Qszilloskope überprüft).

Nun habe ich im Programm nur das Tastverhältnis auf 25% geändert und versucht den PIC neu zu Brennen. Doch nun wird der PIC nicht mehr erkannt. An der Hardware wurde nichts geändert, nichtmal was angefasst.

Als Programmierumgebung verwende ich MPLAB unter Linux Ubuntu 9.10 mit Wine betrieben.
Das Hex wird durch den Brenner8P (www.sprut.de) via ICSP an den Pic übertragen. Hat bislang auch gut geklappt, doch nun bekomme ich nur noch die Fehlermeldung "PIC-Type: unknown". Mit anderen PIC's kann ich noch gut kommunizieren.

Hat jemand von euch eine Idee was das sein könnte? Oder ist der PIC kaputt? Das zuletzt eingespielte Programm funktioniert ja noch.

Wenn benötigt kann ich noch einen Schaltplan meines jetzigen Aufbaus machen.

Das Programm:


list p=16f876
;************************************************* *************
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0 Input switch X_LIMP
;* 1 Input switch X_LIMN
;* 2 Input switch Y_LIMP
;* 3 Input switch Y_LIMN
;* 4 -
;* 5 -
;* 6 -
;* 7 -
;*
;* PORTB: 0 LCD Display E
;* 1 -
;* 2 LCD Display RS
;* 3 LCD Display R/W
;* 4 LCD Display D4
;* 5 LCD Display D5
;* 6 LCD Display D6
;* 7 LCD Display D7
;*
;* PORTC: 0 Enable X
;* 1 Enable Y
;* 2 X_pos
;* 3 X_neg
;* 4 -
;* 5 -
;* 6 Y_pos
;* 7 Y_neg
;*
;************************************************* *************
;
; Name Ricardo Brauer
;
; Prozessor 16F876
;
; Prozessor-Takt 10 MHz
;
; Projekt XY_Driver
;************************************************* *********
; Includedatei für den 16F876 einbinden

#include <P16f876.INC>

ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES


; Configuration festlegen:
; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF


;************************************************* *******
; Variablen festlegen
loops equ 0x22 ; timer für wait
loops2 equ 0x23 ; timer für wait
LcdStatus equ 0x24 ;
LcdDaten equ 0x25 ;


Ini_con Equ B'00000000' ; TMR0 -> Interupt disable
Ini_opt Equ B'00000010' ; pull-up

; für LCD-Pins
#define LcdE PORTB,0 ; enable Lcd
#define LcdRw PORTB,3 ; read Lcd
#define LcdRs PORTB,2 ; Daten Lcd (nicht control)
#define LcdPort PORTB ; Datenbus des LCD (obere 4 Bit)

;************************************************* *******
; Das Programm beginnt mit der Initialisierung
org 0x00

Init
bsf STATUS, RP0 ; Bank 1
MOVLW 0x06 ; PCFG3..0 = '0110'
MOVWF ADCON1
movlw Ini_opt ; pull-up on
movwf OPTION_REG
movlw B'11111111' ; PortA alle inputs
movwf TRISA
movlw B'00000000' ; PortB alle outputs
movwf TRISB
movlw B'00000000' ; PortC alle outputs
movwf TRISC
bcf STATUS, RP0 ; Bank 0
clrf PORTB
movlw Ini_con ; Interupt disable
movwf INTCON

;PWM an RC2 initialisieren
bsf T2CON,T2CKPS1 ; Vorteiler: 16:1
bsf T2CON,TMR2ON ; Timer 2 on
;10kHz Frequens einstellen
bsf STATUS,RP0
movlw D'124'
movwf PR2 ;2,5kHz
bcf STATUS,RP0
;Tastverhältnis 25% einstellen
movlw d'31' ;50% von 124
movwf CCPR1L
;PWM-mode mit CCP1 initialisieren
clrf CCP1CON ;CCP1-mode off
bsf CCP1CON,CCP1M3 ;CCP1-mode PWM-mode
bsf CCP1CON,CCP1M2

;Display initialisieren
call InitLcd

Mainloop
bsf PORTC,3
goto Mainloop



;************************************************* ****
;+++LCD-Routinen**************************************
;************************************************* ****
;LCD initialisieren, Begrüßung ausgeben

InitLcd
movlw D'255' ; 250 ms Pause nach dem Einschalten
movwf loops
call WAIT

movlw B'00110000' ; 1
movwf LcdPort
bsf LcdE
nop
bcf LcdE

movlw D'50' ; 50 ms Pause
movwf loops
call WAIT

movlw B'00110000' ; 2
call Control8Bit
movlw B'00110000' ; 3
call Control8Bit
movlw B'00100000' ; 4
call Control8Bit

movlw B'00000001' ; löschen und cusor home
call OutLcdControl
movlw B'00101000' ; 5 function set, 4-bit 2-zeilig, 5x7
call OutLcdControl
movlw B'00001000' ; 6 display off
call OutLcdControl
movlw B'00000110' ; 7 entry mode, increment, disable display-shift
call OutLcdControl
movlw B'00000011' ; 8 cursor home, cursor home
call OutLcdControl
movlw B'00001100' ; 9 display on, Kursor aus , Blinken aus
call OutLcdControl

movlw b'00000000'
call OutLcdControl
movlw 'H'
call OutLcdDaten
movlw 'a'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'o'
call OutLcdDaten

call writeLcd

return

;************************************************* ****
; ein Steuerbyte 8-bittig übertragen
Control8Bit
movwf LcdPort
bsf LcdE
nop
bcf LcdE
movlw D'10'
movwf loops
call WAIT
return

;************************************************* ****
; darauf warten, daß das Display bereit zur Datenannahme ist
LcdBusy
bsf STATUS, RP0 ; make Port B4..7 input
movlw B'11110000'
iorwf TRISB, f
bcf STATUS, RP0
BusyLoop
bcf LcdRs
bsf LcdRw ; Lesen
bsf LcdE
nop
movf LcdPort, w
movwf LcdStatus
bcf LcdE
nop
bsf LcdE ; Enable
nop
bcf LcdE
btfsc LcdStatus, 7 ; teste bit 7
goto BusyLoop
bcf LcdRw
bsf STATUS, RP0 ; make Port B4..7 output
movlw B'00001111'
andwf TRISB, f
bcf STATUS, RP0
return

;************************************************* ****
; aus W ein Byte mit Steuerdaten zum Display übertragen
OutLcdControl
movwf LcdDaten
call LcdBusy
movf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Hi-teil Daten schreiben
bsf LcdE
nop
bcf LcdE ; Disable LcdBus
swapf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Lo-teil Daten schreiben
bsf LcdE
nop
bcf LcdE ; Disable LcdBus
return

;************************************************* ****
; aus W ein Datenbyte zum Display übertragen
OutLcdDaten
movwf LcdDaten
call LcdBusy
movf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Hi-teil Daten schreiben
bsf LcdRs ; Daten
bsf LcdE ; Enable LcdBus
nop
bcf LcdE ; Disable LcdBus
swapf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Lo-teil Daten schreiben
bsf LcdRs ; Daten
bsf LcdE
nop
bcf LcdE ; Disable LcdBus
bcf LcdRs ;
return

;************************************************* ****
; Das Display löschen
ClearLcd
movlw B'00000001' ; löschen und cusor home
call OutLcdControl
return


;************************************************* ****
;Zeitverzögerung um loops * 1 ms
; 20 MHz externer Takt bedeutet 5 MHz interner Takt
; also dauert 1 ms genau 5000 Befehle
; 250 Schleifen a 20 Befehle sind 5000 Befehle = 1 ms

WAIT
movwf loops
top
movlw .250 ; timing adjustment variable (1ms)
movwf loops2
top2
nop ; sit and wait
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
decfsz loops2, F ; inner loops complete?
goto top2 ; no, go again
;
decfsz loops, F ; outer loops complete?
goto top ; no, go again
retlw 0 ; yes, return from subWAIT


;************************************************* **
;* Lcd mit einem Teststring für jede Zeile beschreiben
writeLcd
call ClearLcd ;LCD leeren
movlw '1'
call OutLcdDaten
movlw '.'
call OutLcdDaten
movlw ' '
call OutLcdDaten
movlw 'Z'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw 'i'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'e'
call OutLcdDaten

movlw b'11000000' ;2. Zeile
call OutLcdControl
movlw '2'
call OutLcdDaten
movlw '.'
call OutLcdDaten
movlw ' '
call OutLcdDaten
movlw 'Z'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw 'i'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'e'
call OutLcdDaten

movlw b'10010100' ;3. Zeile
call OutLcdControl
movlw '3'
call OutLcdDaten
movlw '.'
call OutLcdDaten
movlw ' '
call OutLcdDaten
movlw 'Z'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw 'i'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'e'
call OutLcdDaten

movlw b'11010100' ;4. Zeile
call OutLcdControl
movlw '4'
call OutLcdDaten
movlw '.'
call OutLcdDaten
movlw ' '
call OutLcdDaten
movlw 'Z'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
movlw 'i'
call OutLcdDaten
movlw 'l'
call OutLcdDaten
movlw 'e'
call OutLcdDaten
return



end


Gruß Rico