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:

Code:
	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