9V batterij, maar het geheel werkt gewoon met een 16F648A

@henry
Je hebt m;n antwoord niet begrepen.. ik wist niet of ik wel maar alleen die pin moest doen omdat die niet werkte

[Bericht gewijzigd door Jasper91 op (52%)]

9V aan de Wisp veronderstel ik dan? Ik ken het zo niet vanbuiten maar dat lijkt mij wel goed.

Als het met een andere pic wel werkt raad ik jou aan alles eens te herbeginnen en voortgaan op de datasheet, niet de manual. Eigenlijk wel op de manual, maar in de manual staat niet voor elk type uitgewerk, dus de datasheet. Ik bedoel dat er niets mis is met de manual zolang je niet als een robotje gaat (verkeerd) lezen en overnemen. Een beetje nadenken is wel nodig bij het aansluiten.

Ik weet niet hoe maar hij werkt nu xD.. zal wel per ongelijk iets goeds hebben gedaan..

In ieder geval super bedankt voor jullie hulp en tijd!

Op 16 juni 2008 21:40:29 schreef Jasper91:
Je hebt m;n antwoord niet begrepen.. ik wist niet of ik wel maar alleen die pin moest doen omdat die niet werkte

Ik had je wel begrepen, het is niet logisch!

Het werkt 'zo maar', dat wijst richting breadboard.

Op 16 juni 2008 20:48:27 schreef Jasper91:
Ik heb de datasheet al de eerste keer nagekeken en daar stond pin 38.. dus ik die aangesloten en toen werkte die niet. Dus toen heb ik allebei maar geprobeerd maar toen bleek hij nog steeds niet te werken.. dus dat over 'niet in datasheet kijken' is onzin

Als in de datasheet pgm op 38 staat, dan heeft het echt geen nut om het op een andere pin te proberen. Het probleem lag waarschijnlijk gewoon aan het ontbreken van de 100nF (en 47uF)

En probeer zo snel mogelijk een echte voeding te krijgen i.p.v. een 9V batterij.
Als je een Wisp648 programmer hebt, is een goedkope netadapter al voldoende.

Iig werkt het programmeren nu wel maar de code werkt nog niet :S. Ik heb nu dit:


;*****Configuration****
list      p=18F452
#INCLUDE  <P18F452.INC>

;18F series Development Configuration Information

    CONFIG BOR=ON   ; Brown out reset ON
    CONFIG BORV=45  ; Brown out detect voltage=4.5 Volt
    CONFIG CCP2MUX=OFF ; CCP2 input/output is to RB3
    CONFIG DEBUG=ON ; Background debugger ON
    CONFIG LVP=OFF  ; Low Voltage programming OFF
    CONFIG OSCS=OFF ; Oscillator switch OFF
    CONFIG OSC=HS   ; Use HS oscillator (20MHZ here)
    CONFIG PWRT=ON  ; Power-up timer ON
    CONFIG STVR=OFF ; Stack over/underflow OFF
    CONFIG WDT=OFF  ; Watch dog timer OFF

;UnProtect entire device program space for DEBUG
    CONFIG CP0=OFF  ; Code Protection Block 0 Disabled
    CONFIG CP1=OFF  ; Code Protection Block 1 Disabled
    CONFIG CP2=OFF  ; Code Protection Block 2 Disabled
    CONFIG CP3=OFF  ; Code Protection Block 3 Disabled
    CONFIG CPB=OFF  ; Boot Block Code Protection Disabled
    CONFIG CPD=OFF  ; Data EEPROM Code Protection Disabled
    CONFIG WRT0=OFF ; Write Protection Block 0 Disabled
    CONFIG WRT1=OFF ; Write Protection Block 1 Disabled
    CONFIG WRT2=OFF ; Write Protection Block 2 Disabled
    CONFIG WRT3=OFF ; Write Protection Block 3 Disabled
    CONFIG WRTB=OFF ; Boot Block Write Protection Disabled
    CONFIG WRTC=OFF ; Configuration Register Write Protection Disabled
    CONFIG WRTD=OFF ; Data EEPROM Write Protection Disabled

;*****Variables****
adcon1			EQU   	0FC1h

trisa			EQU		92h
trisb			EQU		93h
trisc			EQU		94h
trisd			EQU		95h
trise			EQU		96h

porta			EQU		80h
portb			EQU		81h
portc			EQU		82h
portd			EQU		83h
porte			EQU		84h

t1con			EQU		0FCDh
ccpr1l			EQU		0FBEh
ccp1con			EQU		0FBDh

t2con			EQU		0FCAh
ccpr2l			EQU		0FBBh
ccp2con			EQU		0FBAh

pr2			EQU		0FCBh



;*****Settings****
				ORG		00h	
				
				MOVLW	00h
				MOVWF	trisa			;***** Allemaal uitgangen ****
				MOVLW	00h
				MOVWF	porta			;***** Allemaal uit ****

				MOVLW	00h
				MOVWF	trisb			;***** Allemaal uitgangen ****
				MOVLW	00h
				MOVWF	portb			;***** Allemaal uit ****
				
				MOVLW	00h
				MOVWF	trisc			;***** Allemaal uitgangen ****
				MOVLW	00h
				MOVWF	portc			;***** Allemaal uit ****
				
				MOVLW	00h
				MOVWF	trisd			;***** Allemaal uitgangen ****
				MOVLW	00h
				MOVWF	portd			;***** Allemaal uit ****
				
				MOVLW	00h
				MOVWF	trise			;***** Allemaal uitgangen ****
				MOVLW	00h
				MOVWF	porte			;***** Allemaal uit ****
				
				MOVLW	7h
				MOVWF	adcon1,0		;***** Allemaal digitaal ****
				

;*****Main****
main			MOVLW	0FFh
				MOVWF	porta
				
				MOVLW	0FFh
				MOVWF	portb
				
				MOVLW	0FFh
				MOVWF	portc
				
				MOVLW	0FFh
				MOVWF	portd
				
				MOVLW	0FFh
				MOVWF	porte
				
				GOTO	main


;*****Subroutines****

				END

Ik heb de MCLR aan de +5V hangen met een 10k ertussen. Verder is het kristal van 20mhz aangelosten op OSC1 en OSC2 waarbij aan beide kanten van het kristal een 20pF naar de grond loopt. En verder natuurlijk de voeding etc. aangesloten.
Maar als ik nu stroom op het circuit zet en ik de uitgangen van de PIC meet gevn ze allemaal zo'n 0-0.2V!

Het lukt me maar niet om dit op te lossen!

Kan iemand aub helpen?

Alvast bedankt,
Jasper

Het wil nog wel eens werken om de brown-out voltage of de PWRT uit te zetten. Verder gebruik ik voor hexadecimale waardes 0x.. ipv de door jouw gebruikte 0..h. Succes dr mee.

Ik heb nu gewoon al mijn eigen config's weggehaald en die uit de .inc gebruikt EN HIJ WERKT!

Toch bedankt voor jullie hulp!

Euuhm, jouw manier van probleem oplossen vind ik wel geweldig. Werkt iets niet? Gooi het eruit. Ik denk dat je veel meer leert als je tevens ook de oorzaak van het probleem probeert te achterhalen, mischien niet met succes maar dan weet je op zen minst aan wat het niet ligt.

Als je nu binnen 2 weken, een maand, een jaar, 20 jaar,... hetzelfde weer tegen komt ga je het nog niet weten :).
En het is altijd leuk en handig om van te leren wanneer de TS zijn probleem heeft opgelost dat hij meedeelt wat het probleem nu juist was.

Iig heb ik nu nog een probleem (ja, ik blijf bezig). Als ik de volgende code werkt niet. Ik heb namelijk gemeten en de poorten worden totaal niet aangestuurd (gemeten na ergens een delay van 20sec tussenzetten):


	;*****Includes****
list    		p=18F452
#INCLUDE		<P18F452.INC>

	;*****Variables***

count_memory			EQU		40h
count				EQU		41h
count_inner  			EQU		42h

lcd_temp			EQU		43h
lcd				EQU		44h
bit_nr				EQU		45h

#define lcd_e			PORTD,2
#define lcd_rs			PORTD,3

	;*****Settings****
				ORG		00h	
				
				MOVLW	00h
				MOVWF	TRISA			;***** Allemaal uitgangen ****

				MOVLW	00h
				MOVWF	TRISB			;***** Allemaal uitgangen ****
				
				MOVLW	00h
				MOVWF	TRISC			;***** Allemaal uitgangen ****
				
				MOVLW	00h
				MOVWF	TRISD			;***** Allemaal uitgangen ****
				
				MOVLW	00h
				MOVWF	TRISE			;***** Allemaal uitgangen ****
				
				MOVLW	7h
				MOVWF	ADCON1,0		;***** Allemaal digitaal **


	;*****Main****
main				CALL	lcd_initialize
				
				MOVLW	"H"
				CALL	lcd_write_char

				GOTO	main

	;*****General subroutines***

;*****Delay****
delay				MOVWF	count_memory
				MOVLW   0C8h
				MOVWF   count
				MOVLW   064h
				MOVWF   count_inner

delay_loop			DECFSZ	count_inner,1				
				GOTO	delay_loop

				MOVLW   064h
				MOVWF   count_inner
				DECFSZ	count,1			
				GOTO	delay_loop

				MOVLW   99h
				MOVWF   count
				DECFSZ	count_memory,1			
				GOTO	delay_loop
				RETURN

				;*****LCD subroutines***

;*****Initialize****
lcd_initialize			MOVLW   28h					;40ms wachten
				CALL	delay
				
				BCF		lcd_rs
				BCF		lcd_e				
				
				MOVLW	20h					;Interface: 4 bits
				CALL	lcd_write
				MOVLW   5h					;5ms wachten
				CALL	delay
				
				MOVLW	28h					;Interface: 4 bits, 2/4 regels, 5x7 matrix
				CALL	lcd_write
				MOVLW   5h					;5ms wachten
				CALL	delay

				MOVLW	0Ch					;Display aan en cursor uit
				CALL	lcd_write

				MOVLW	6h					;Cursor automatisch
				CALL	lcd_write

				CALL	lcd_clear			;Scherm legen
				RETURN

;*****Write char****
lcd_write_char	BSF		lcd_rs
				CALL	lcd_write
				RETURN


;*****Write byte****
lcd_write			MOVWF	lcd_temp			;2e helft bewaren
				CALL	lcd_write_part		;wegschrijven
				SWAPF	lcd_temp,1			;2e helft terughalen	
				CALL	lcd_write_part		;wegschrijven
				RETURN


;*****Write part of byte****
lcd_write_part			ANDLW	0Fh
				ANDWF	PORTC,1				
				MOVF	lcd_temp,0
				ANDLW	0F0h
				IORWF	PORTC,1

				BSF		lcd_e
				BCF		lcd_e

				MOVLW	1h
				CALL	delay
				RETURN

;*****Clear screen****
lcd_clear			BCF		lcd_rs
				MOVLW	1h
				CALL	lcd_write
				MOVLW	2h
				CALL	delay
				RETURN
				
				END

Als ik nu bijvoorbeeld bij 'mijn' de 'lcd_initialize' etc. weghaal en zeg dat '0Fh' in PORTC geven de poorten geen signaal. Dit werkt alleen als ik alleen de inc. van de PIC include en daarna zeg dat '0Fh' in PORTC.
Volgens mij loopt de PIC dus vast of zoiets dergelijks maar dat weet ik niet zeker..

Ligt het er misschien aan dat ik de volgende variables niet kan gebruiken omdat die plekken in het register niet vrij zijn?


count_memory			EQU		40h
count				EQU		41h
count_inner  			EQU		42h

lcd_temp			EQU		43h
lcd				EQU		44h
bit_nr				EQU		45h

Ik ben al 2 dagen bezig met dit probleem dus als iemand zou kunnen helpen dit op te lossen zou dat erg welkom zijn!

Alvast bedankt,
Jasper

Op 20 juni 2008 13:22:25 schreef Jasper91:
niemand?

ooit gehoord van het read-modify-write probleem?

Je bedoelt dus dat ik niet direct via de poorten moet werken maar vie een vrije byte en die aan het eind van de rit op de pins zetten?

Op 20 juni 2008 16:02:09 schreef Jasper91:
Je bedoelt dus dat ik niet direct via de poorten moet werken maar vie een vrije byte en die aan het eind van de rit op de pins zetten?

dat is inderdaad een standaard oplossing, afhakelijk van wat je bedeold mket "aan het eind van de rit".

overigens zeg ik niet dat dat de fout is, alleen dat het een potentieel probleem is.

Het heeft gewerkt Wouter! Thx! Het scherm is nu leeg ipv de witte balken alleen krijg ik er nog geen char's op.
Iig heb ik dus die port_temp's erin gezet en nog wat veranderd in de 'lcd_write_part' omdat daar nog een foutje zat.
Dit is m'n code nu:


	;*****Includes****
list    		p=18F452
#INCLUDE		<P18F452.INC>

	;*****Variables***

count_memory	EQU		40h
count			EQU		41h
count_inner  	EQU		42h

lcd_temp		EQU		43h
lcd				EQU		44h
bit_nr			EQU		45h

porta_temp		EQU		50h
portb_temp		EQU		51h
portc_temp		EQU		52h
portd_temp		EQU		53h
porte_temp		EQU		54h

#define			lcd_rs	portd_temp,3
#define			lcd_e	portd_temp,2

	;*****Settings****
				ORG		00h	
				
				MOVLW	00h
				MOVWF	TRISA			;***** Allemaal uitgangen ****

				MOVLW	00h
				MOVWF	TRISB			;***** Allemaal uitgangen ****
				
				MOVLW	00h
				MOVWF	TRISC			;***** Allemaal uitgangen ****
				
				MOVLW	00h
				MOVWF	TRISD			;***** Allemaal uitgangen ****
				
				MOVLW	00h
				MOVWF	TRISE			;***** Allemaal uitgangen ****
				
				MOVLW	7h
				MOVWF	ADCON1,0		;***** Allemaal digitaal **


	;*****Main****
				CALL	lcd_initialize
				

main			MOVWF	0FFh
				CALL	delay

				GOTO	main

	;*****General subroutines***

;*****Delay****
delay			MOVWF	count_memory
				MOVLW   0C8h
				MOVWF   count
				MOVLW   064h
				MOVWF   count_inner

delay_loop		DECFSZ	count_inner,1				
				GOTO	delay_loop

				MOVLW   064h
				MOVWF   count_inner
				DECFSZ	count,1			
				GOTO	delay_loop

				MOVLW   99h
				MOVWF   count
				DECFSZ	count_memory,1			
				GOTO	delay_loop
				RETURN


				;*****LCD subroutines***

;*****Initialize****
lcd_initialize	MOVLW   28h					;40ms wachten
				CALL	delay
				
				BCF		lcd_rs
				BCF		lcd_e
				
				MOVF	portd_temp,0
				MOVWF	PORTD
				
				MOVLW	1h
				CALL	delay
				
				MOVLW	B'00100000'			;Interface: 4 bits
				CALL	lcd_write
				MOVLW   5h					;5ms wachten
				CALL	delay
				
				MOVLW	B'00101000'			;Interface: 4 bits, 2/4 regels, 5x7 matrix
				CALL	lcd_write
				MOVLW   5h					;5ms wachten
				CALL	delay

				MOVLW	B'00001111'			;Display aan en cursor uit
				CALL	lcd_write
				MOVLW   5h					;5ms wachten
				CALL	delay

				MOVLW	B'00000110'			;Cursor automatisch
				CALL	lcd_write
				MOVLW   5h					;5ms wachten
				CALL	delay

				CALL	lcd_clear			;Scherm legen

;*****Write char****
lcd_write_char	BSF		lcd_rs
				
				MOVF	portd_temp,0
				MOVWF	PORTD
				
				CALL	lcd_write
				RETURN


;*****Write byte****
lcd_write		MOVWF	lcd_temp			;2e helft bewaren
				CALL	lcd_write_part		;wegschrijven

				SWAPF	lcd_temp,1			;2e helft terughalen	
				CALL	lcd_write_part		;wegschrijven

				RETURN


;*****Write part of byte****
lcd_write_part	MOVLW	B'00001111'
				ANDWF	PORTC,1
				MOVF	lcd_temp,0

				ANDLW	B'11110000'
				IORWF	PORTC,1

				BSF		lcd_e
				
				MOVF	portd_temp,0
				MOVWF	PORTD

				MOVLW	1h
				CALL	delay

				BCF		lcd_e
				
				MOVF	portd_temp,0
				MOVWF	PORTD

				MOVLW	1h
				CALL	delay
				RETURN

;*****Clear screen****
lcd_clear		BCF		lcd_rs
				
				MOVF	portd_temp,0
				MOVWF	PORTD

				MOVLW	1h
				CALL	lcd_write

				MOVLW	2h
				CALL	delay
				RETURN
				
				END

Als ik nu 1 van de PORTC-poorten meet blijft die telkens wisselen tussen 3,5 en 5V dus iets blijft hem constant veranderen terwijl er volgens mij geen loop zit die iets met de LCD doet...

Ik heb al een uur lopen zoeken maar ik kom er niet uit...

Op 20 juni 2008 23:44:12 schreef Jasper91:


				ANDWF	PORTC,1
				MOVF	lcd_temp,0

				ANDLW	B'11110000'
				IORWF	PORTC,1

dit lijkt mr nog niet goed

gebruik ook liever F en W ipv 1 en 0

Bedankt wouter! Maar hoe moet ik het dan precies veranderen?? Ik heb deze code uit het boek 'domotica' en heb hem dus niet zelf geschreven ;)

Op 21 juni 2008 11:23:27 schreef Jasper91:
Bedankt wouter! Maar hoe moet ik het dan precies veranderen??

Dat weet ik ook niet zo even, maar die code lijkt me niet bestand tegen het RMW probleem. Heelaas is er veel code op het web waar dat veoor geld, en dat komt omdat het soms gewoon wel werkt (bij de auteur bv) en soms niet.

Ik heb alles 100% gemeten. Tussen alle 'config''s een RETURN gezet en gemeten of het klopte wat er in de LCD ging en alles klopte.. inc. de Enable en de RS.. MAAR TOCH DOET DAT STOMME DING HET NIET. Ik ben ondertussen al een week verder sinds ik begonnen ben met die LCD en ik begin ondertussen ligt krankzinnig te worden.. Ik heb nu deze code:


	;*****Includes****
list    		p=18F452
#INCLUDE		<P18F452.INC>

	;*****Variables***

count_memory	EQU		40h
count			EQU		41h
count_inner  	EQU		42h

lcd_temp		EQU		43h
lcd				EQU		44h
bit_nr			EQU		45h

porta_temp		EQU		50h
portb_temp		EQU		51h
portc_temp		EQU		52h
portd_temp		EQU		53h
porte_temp		EQU		54h

#define			lcd_rs	portd_temp,3
#define			lcd_e	portd_temp,2
#define			W		0
#define			F		1

	;*****Settings****
				ORG		00h	
				
				MOVLW	00h
				MOVWF	TRISA			;***** Allemaal uitgangen ****

				MOVLW	00h
				MOVWF	TRISB			;***** Allemaal uitgangen ****
				
				MOVLW	00h
				MOVWF	TRISC			;***** Allemaal uitgangen ****
				
				MOVLW	00h
				MOVWF	TRISD			;***** Allemaal uitgangen ****
				
				MOVLW	00h
				MOVWF	TRISE			;***** Allemaal uitgangen ****
				
				MOVLW	7h
				MOVWF	ADCON1,0		;***** Allemaal digitaal **


	;*****Main****
				CALL	lcd_initialize
				
main			MOVWF	0FFh
				CALL	delay

				GOTO	main

	;*****General subroutines***

;*****Delay****
delay			MOVWF	count_memory
				MOVLW   0C8h
				MOVWF   count
				MOVLW   064h
				MOVWF   count_inner

delay_loop		DECFSZ	count_inner,F				
				GOTO	delay_loop

				MOVLW   064h
				MOVWF   count_inner
				DECFSZ	count,F			
				GOTO	delay_loop

				MOVLW   99h
				MOVWF   count
				DECFSZ	count_memory,F			
				GOTO	delay_loop
				RETURN


				;*****LCD subroutines***

;*****Initialize****
lcd_initialize	MOVLW   28h					;40ms wachten
				CALL	delay
				
				CLRF	portd_temp
				MOVF	portd_temp,W
				MOVWF	PORTD
				
				MOVLW	1h
				CALL	delay
				
				MOVLW	B'00110000'			;Interface: 8 bits
				CALL	lcd_write
				MOVLW   5h					;5ms wachten
				CALL	delay
				
				MOVLW	B'00111000'			;Interface: 8 bits, 2/4 regels, 5x7 matrix
				CALL	lcd_write
				MOVLW   5h					;5ms wachten
				CALL	delay

				MOVLW	B'00001111'			;Display aan en cursor aan
				CALL	lcd_write
				MOVLW   5h					;5ms wachten
				CALL	delay
				RETURN
				MOVLW	B'00000110'			;Cursor automatisch
				CALL	lcd_write
				MOVLW   5h					;5ms wachten
				CALL	delay

				CALL	lcd_clear			;Scherm legen
				RETURN

;*****Write char****
lcd_write_char	MOVWF	lcd_temp
				
				BSF		lcd_rs
				
				MOVF	portd_temp,W
				MOVWF	PORTD
				
				MOVF	lcd_temp,W
				
				CALL	lcd_write
				RETURN


;*****Write byte****
lcd_write		MOVWF	PORTC

				MOVLW	1h
				CALL	delay
				
				CALL	lcd_switch_e

				RETURN

;*****Switch lcd_e****
lcd_switch_e	BSF		lcd_e
			
				MOVF	portd_temp,W
				MOVWF	PORTD

				MOVLW	1h
				CALL	delay
				
				BCF		lcd_e
				MOVF	portd_temp,W
				MOVWF	PORTD

				MOVLW	1h
				CALL	delay
				RETURN

;*****Clear screen****
lcd_clear		BCF		lcd_rs
				
				MOVF	portd_temp,W
				MOVWF	PORTD

				MOVLW	B'00000001'
				CALL	lcd_write

				MOVLW	2h
				CALL	delay
				RETURN
				
				END

DB0-DB7 zitten op RC0-RC7. Enable op RD2 en RS op RD3.. Verder zit de VSS op de GND en de VDD op de +5V. De V0 zit op de middelste pin van een 2,5k potmeter die in aangesloten tussen de +5V en de GND (potmeter half open).

Ik hoop echt dat jullie nog wat kunnen vinden 'because this whole thing is driving me crazy'...

Alvast bedankt,
Jasper

Echt HEEL merkwaardig.. na een pauze van een uur had ik weer ff de stroom aangezet om het resultaat van een week lang tijd verspillen te bekijken EN TOEN WERKTE HIJ OPEENS!
Ik heb nu de tekst 'HELLO WORLD' erop staan :D/
Het probleem is alleen nog wel dat dit alleen vanaf een de zijkant te lezen is want al ga je recht voor het LCD zitten zijn alle velden helemaal wit??
Is dit normaal of ben ik iets vergeten?

[Bericht gewijzigd door Jasper91 op (89%)]

Dat zou heel goed kunnen.
Heb je alles goed aangesloten?

Heb je contrast?

Check, check

Het probleem is alleen nog wel dat dit alleen vanaf een de zijkant te lezen is want al ga je recht voor het LCD zitten zijn alle velden helemaal wit??
Is dit normaal of ben ik iets vergeten?

En er zit nog een tekentje voor de tekst 'HELLO WORLD'.. een heel raar tekentje om precies te zijn :S

Opgelost! Gewoon even aan de potmeter draaien om een goed contrast krijgen en een extra lcd_clear hebben het opgelost!

Iig super bedankt voor tijd en hulp!

[Bericht gewijzigd door Jasper91 op (20%)]

Sorry voor dubbelpost maar nog 1 laatste vraagje..
Hoe kan ik de cursor op de volgende regel zetten?? Zoals een 'enter'?

PRINT AT 2, 1 ?

[Bericht gewijzigd door Technojunk op (65%)]