Ik moet voor mijn GIP een apparaat maken dat via een PIC een code naar IR-leds gaat sturen en die via IR-ontvanger ook zo een codes kan ontvangen. deze code moet uitgezonden worden op een frequentie van 36kHz

Na wat zoekwerk (het is immers de eerste keer ooit dat ik een PIC programmeer) heb ik al gevonden hoe ik in assembler een uitgang kan programmeren en een blokgolfje creëren. Ik kan echter niet vinden hoe ik deze blokgolf een vaste frequentie kan geven.

Dit is de code die ik nu al heb:


include "P18F24J50.INC"
	org	00h
teller	EQU	40h
teller2	EQU 41h

		BSF 03,5
		CLRF	TRISC   
		BCF 03,5

begin	MOVLW 	b'00000100'
		MOVWF 	PORTC

		MOVLW	h'FF'
		MOVWF	teller2

opnieuw2	MOVLW	h'FF'
		MOVWF	teller	
opnieuw1	DECFSZ	teller, 1
		GOTO opnieuw1
		DECFSZ teller2, 1
		GOTO opnieuw1	

		MOVLW h'00'
		MOVWF PORTC


opnieuw4	MOVLW	h'FF'
		MOVWF	teller	
opnieuw3	DECFSZ	teller, 1
		GOTO opnieuw3
		DECFSZ teller2, 1
		GOTO opnieuw4
		GOTO begin
		end

PS: ik werk met een PIC18F24J50

De waardes waarmee je de tellers laadt wijzigen?
(Kwestie van cycles tellen, of even laten lopen in MpSim...)

Ik heb nog nooit gewerkt met ASM voor PIC (wel AVR), maar volgensmij zitten er fouten in je programma. Volgensmij moet je het zo doen:


include "P18F24J50.INC"
	org	00h
teller	EQU	40h
teller2	EQU 41h
 
		BSF 03,5
		CLRF	TRISC   
		BCF 03,5
 
begin	MOVLW 	b'00000100'
		MOVWF 	PORTC
 
		MOVLW	h'FF'     ;Grove afstelling voor tijd afstelling dat PORTC.2 hoog moet zijn
		MOVWF	teller2
 
opnieuw2	MOVLW	h'FF'     ;Fijn afstelling voor tijd afstelling dat PORTC.2 hoog moet zijn
		MOVWF	teller	
opnieuw1	DECFSZ	teller, 1
		GOTO opnieuw1
		DECFSZ teller2, 1
		GOTO opnieuw2	
 
		MOVLW h'00'
		MOVWF PORTC

                MOVLW	h'FF'     ;Grove afstelling voor tijd afstelling dat PORTC.2 laag moet zijn
		MOVWF	teller2
 
opnieuw4	MOVLW	h'FF'     ;Fijne afstelling voor tijd afstelling dat PORTC.2 laag moet zijn
		MOVWF	teller	
opnieuw3	DECFSZ	teller, 1
		GOTO opnieuw3
		DECFSZ teller2, 1
		GOTO opnieuw4
		GOTO begin
		end

Op 17 mei 2011 21:51:21 schreef Thierry400:
op een frequentie van 36kHz

Reken eerst eens uit hoeveel instructies dat duurt, een halve periode van 36kHz.

Op 17 mei 2011 21:58:45 schreef Arco:
De waardes waarmee je de tellers laadt wijzigen?

En hoe weet ik dan hoe lang je singaal hoog / laag is?
dat de tellers de 'tijd' bepaalden wist ik maar ik weet niet hoelang ze dit doen of hoe ik ze moet wijzigen om een bepaalde frequentie te bekomen

Op 17 mei 2011 22:01:33 schreef klein is fijn:
[...]Reken eerst eens uit hoeveel instructies dat duurt, een halve periode van 36kHz.

Hoe weet ik hoe lang 1 instructie duurt?

[Bericht gewijzigd door Henry S. op (25%)]

Zoals gezegd cycles tellen. Je weet hoe lang een cycle duurt, en hoeveel cycles een instructie duurt.
Of in MpSim laden voor simulatie...
Aantal cycles per instructie staat in de datasheet...

[Bericht gewijzigd door Arco op (17%)]

Aantal cycles per instructie heb ik in een tabel gevonden in mijn datasheet ja maar daarmee weet ik nog steeds niet hoelang zo 1 cycle duurt? dat vind ik niet terug in mijn datasheet

[Bericht gewijzigd door Henry S. op (44%)]

Staat toch echt in de datasheet. Clockfrequentie / 4 (FOsc)
Dus 1 cycle is 1/ Fosc.

[Bericht gewijzigd door Arco op (17%)]

Ik vind in de datasheet nog steeds niet hoe lang 1 cycle is of hoe groot Fosc is, maar ik heb nu ook nog wat ander schoolwerk dus ik zal er morgen nog eens verder naar zoeken.

alvast bedankt voor het advies.

[Bericht gewijzigd door Henry S. op (30%)]

De clockfrequentie staat ook niet in de datasheet, maar op je kristal... ;)

Op 17 mei 2011 22:27:58 schreef Arco:
De clockfrequentie staat ook niet in de datasheet, maar op je kristal... ;)

hmmz ik heb geen extern kristal aangeslote ... hij moet dus een interne klok gebruiken. maar waar ik informatie over deze vind weet ik niet.

Ik zou wel een 4Mhz kristal erop kunnen aansluiten (heb in datasheet gevonden hoe dat moet + welke condensatoren ik moet gebruiken enz.) wat dan als ik het goed begrijp zorgt voor fosc=1Mhz en 1 cycle duurt dan dus 1µs?

Op 17 mei 2011 22:00:12 schreef Nieko:
Ik heb nog nooit gewerkt met ASM voor PIC (wel AVR), maar volgensmij zitten er fouten in je programma. Volgensmij moet je het zo doen:


include "P18F24J50.INC"
	org	00h
teller	EQU	40h
teller2	EQU 41h
 
		BSF 03,5
		CLRF	TRISC   
		BCF 03,5
 
begin	MOVLW 	b'00000100'
		MOVWF 	PORTC
 
		MOVLW	h'FF'     ;Grove afstelling voor tijd afstelling dat PORTC.2 hoog moet zijn
		MOVWF	teller2
 
opnieuw2	MOVLW	h'FF'     ;Fijn afstelling voor tijd afstelling dat PORTC.2 hoog moet zijn
		MOVWF	teller	
opnieuw1	DECFSZ	teller, 1
		GOTO opnieuw1
		DECFSZ teller2, 1
		GOTO opnieuw2	
 
		MOVLW h'00'
		MOVWF PORTC

                MOVLW	h'FF'     ;Grove afstelling voor tijd afstelling dat PORTC.2 laag moet zijn
		MOVWF	teller2
 
opnieuw4	MOVLW	h'FF'     ;Fijne afstelling voor tijd afstelling dat PORTC.2 laag moet zijn
		MOVWF	teller	
opnieuw3	DECFSZ	teller, 1
		GOTO opnieuw3
		DECFSZ teller2, 1
		GOTO opnieuw4
		GOTO begin
		end

Heb eens codes vergeleken en er zat inderdaad foutje in, ik merkte het niet omdat mijn uitgang ook gewoon een blokgolf gaf maar het kon later wel problemen geven. bedankt om me hierop te wijzen

[Bericht gewijzigd door Henry S. op (54%)]

hij moet dus een interne klok gebruiken. maar waar ik informatie over deze vind weet ik niet.

Hoofdstuk 3 van de datasheet gaat geheel over de oscillator. (ook de interne oscillator)

Dit project vraagt om hardware timers en interrupts.

Je bedoelt een afzonderlijke IC die als timer dient?

[Bericht gewijzigd door Henry S. op (60%)]

Nee, bijna alle microcontrollers hebben wel 1 of twee hardware timers aan boord in het chipje zelf. Die van jou ook.

Waarschuwing voor de TS, het postgedrag laat te wensen over: de FAQ.

Ik ben vandaag eens experimenteel opzoek gegaan naar de cyclus tijd van mijn PIC.
na wat zoekwerk heb ik gevonden dat 1 cyclus = 1µs, heb hiermee dus mijn programma aangepast naar dit:


include "P18F24J50.INC"
	org	00h

		BSF 03,5
		CLRF	TRISC   
		BCF 03,5
 
begin	MOVLW 	b'00000100'
		MOVWF 	PORTC
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop


	MOVLW h'00'
	MOVWF PORTC
 
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop

goto begin
end

Met dit programma krijg ik een blokgolf van 35.7Khz uit RC2 wat dicht genoeg de 36Khz benaderd voor mijn IR-ontanger om te detecteren en mijn probleem dus oplost

Tog bedankt voor iedereen die gereageerd heeft.

Het kan misschien wel werken, maar dit is nu eens geen programma.

Je zou 35.7 moeten kunnen halen....

Om een symmetrische blokgolf te krijgen moet er beneden een NOPje af, en boven een NOPje erbij...
(Nu is de onderste wait 2µS langer als de bovenste...)