http://www.circuitsonline.net/download/view/58
he!, een pic simulator. kom nou niet gelijk met vragen over dit programma. ga ff het hele programma uitpluizen en leren en dat gaat wel ff duren (zowieso dat pic programmeren)

Op 8 mei 2005 11:58:19 schreef Hoihoi:
http://www.circuitsonline.net/download/view/58
he!, een pic simulator. kom nou niet gelijk met vragen over dit programma. ga ff het hele programma uitpluizen en leren en dat gaat wel ff duren (zowieso dat pic programmeren)

ja mees/juf :)

Op 8 mei 2005 11:58:19 schreef Hoihoi:
http://www.circuitsonline.net/download/view/58
he!, een pic simulator. kom nou niet gelijk met vragen over dit programma. ga ff het hele programma uitpluizen en leren en dat gaat wel ff duren (zowieso dat pic programmeren)

Of gebruik de simulator in MPLAB. Wel even uitvogelen hoe het met de externe inputs (stimuli files) zit, maar daar heb je manuals en help files voor.

zijn allebij lastig, gebruik die van mplab maar denk ik...

probleem gevonden: ik moet return aan het eind van het stuk code zetten waar call naar verwijst (toch?)
dus:


#define	input	06,0
#define	output	06,5
#define	trisb	86h
#define teller	40h
#define	teller2	41h
	org 00h
	bsf	03,5	
	bsf	input
	bcf	output
vier	btfss	input
	goto vier
	call delay
	call delay
	bsf	output
	call delay
	bcf	output
	call delay
	bsf	output
	call delay
	bcf	output
	call delay
	goto vier
delay	movlw	0FFh
	movwf teller2
verder	movlw	0ffh
	movwf	teller
opnieuw	decfsz	teller,1
	goto opnieuw
	decfsz	teller2,1
        return
	goto verder

klopt dat?

Mag ik je allereerst even wijzen op dit stukje

Gepost maandag 18 april 2005 19:42:37


TRISA EQU 85h
TRISB EQU 86h
PORTA EQU 05h
PORTB EQU 06h

      ORG    00h
      BSF    03,5	   ;naar bank 1	
      CLRF   TRISB 
      BCF    03,5          ;naar bank 0

      movlw  b'11111111'   ;alles aan
      movwf  PORTB         ;waarde van W naar de poort

      end

Waarom gebruik je niet de Include-files? (Zie onderstaand voorbeeld) Zo word je programma veel overzichtelijker en kan je de registers en bits in je programma met de naam noemen die in de datasheet staat aangegeven. Als je een groot programma maakt, wie weet nu direkt dat 0x03 het adres van het statusregister is? en 0x05 de RP0-bit?


      #include "P16F628.inc"

      ORG    00h
      BSF    STATUS, RP0        ;naar bank 1	
      CLRF   TRISB 
      BCF    STATUS, RP0        ;naar bank 0

      movlw  b'11111111'        ;alles aan
      movwf  PORTB              ;waarde van W naar de poort

      end

Ok, dit is niet de oplossing voor je vraag, maar het programmeerd al veel overzichtelijker.

Btw, heb je al eens geprobeerd PORTB als input te gebruiken en PORTA als output? Bij PORTB kan je de pull-ups inschakelen, want ik denk dat dat het probleem kan zijn bij je projekt...

Groetjes

Dit komt uit deze discussie
http://www.circuitsonline.net/forum/view/20528

En nog een discussie http://www.circuitsonline.net/forum/view/13171

Ontopic:
Dit klopt idd: Na een call keer je terug met een return functie:
* return
* retlw 0x00 (of welke waarde dan ook)
* retfie (return met interupt enabled)

Opmerkingen:
org 0x000
Je gaat wel naar BANK1 maar keert niet meer terug naar BANK0
2 x delay achter elkaar

volgens mij moet de delay er zo uitzien


delay	movlw	0xff (is denk ik duidelijker)
	movwf	teller2
verder	movlw	0xff
	movwf	teller
opnieuw	decfsz	teller, f (kan alleen als je de include file gebruikt)
	goto	opnieuw
	decfsz	teller2, f
        goto	verder
	return

Programma eindigen met END

Op 9 mei 2005 12:43:43 schreef Willie Worteltje:
Mag ik je allereerst even wijzen op dit stukje
[...]

ja hoor

Dit komt uit deze discussie
http://www.circuitsonline.net/forum/view/20528

En nog een discussie http://www.circuitsonline.net/forum/view/13171

ik ga niet gelijk hele grote programma's maken, dus het overzicht houd ik nog wel, maar toch handig, bedankt.

Ontopic:
Dit klopt idd: Na een call keer je terug met een return functie:
* return
* retlw 0x00 (of welke waarde dan ook)
* retfie (return met interupt enabled)

dus de return komt aan het einde van dat stuk code dat met de call geroepen word, en niet op het punt dat je terug wilt komen na de call? bedoel je dat ik dat goed had?

Opmerkingen:
org 0x000

moet alles dan met 0xwaarde? dus b.v. 45h word 0x045?

Je gaat wel naar BANK1 maar keert niet meer terug naar BANK0

gromerdegrom, vergeten, stom van me!

2 x delay achter elkaar

iets langere pauze, of mag dat niet op die manier?

volgens mij moet de delay er zo uitzien


delay	movlw	0xff (is denk ik duidelijker)
	movwf	teller2
verder	movlw	0xff
	movwf	teller
opnieuw	decfsz	teller, f (kan alleen als je de include file gebruikt)
	goto	opnieuw
	decfsz	teller2, f
        goto	verder
	return

de delay heb ik letterlij uit de micrcontroller toturital...

en zoals ie daar staat snap ik m, hier niet geheel...

Programma eindigen met END

dat heb ik gedaan, zal bij het coppypasten zijn foutgegaan.
tenzij...

* Lucky Luke gaat je bericht ff los op zn pc zetten, dan kan ie t erbij houden als ie gaat ontfouten (nieuw werkwoord?)

Opmerkingen:
org 0x000

moet alles dan met 0xwaarde? dus b.v. 45h word 0x045?

Nee alleen bij org.
Dit is omdat de PIC uit meerdere pages bestaat.
Een page = 255 oftewel ff.

Een pic16F84 heeft 1k code en dus 4 pages 4x255 = 1024 -> 000 - 3FF
Een pic16F628 heeft 2k code en dus 8 pages 8x255 = 2048 -> 000 - 7FF

iets langere pauze, of mag dat niet op die manier?

zekers mag dat, maar het lampje moet toch 2 x knipperen als je op het knopje drukt? Nu moet je eerst wachten tot je resultaat ziet. Is niet praktisch.

en wat snap je niet aan de delay routine?

Edit:


;voeg dit toe aan het begin
w	equ	0 ; nu kan je w als 0 destination gebruiken, dus je werkregister
f	equ	1 ; nu kan je f als 1 destination gebruiken, dus je fileregister

delay	movlw	0xff
	movwf	teller2
verder	movlw	0xff
	movwf	teller
opnieuw	decfsz	teller, f 
	goto	opnieuw
	decfsz	teller2, f
        goto	verder
	return

Dit is een code die 196100 instructies gebruikt. Op 4Mhz = dat 0,196100 seconde.

Als je deze delay in basic zou schrijven ziet ie er zo uit:


For teller2 = 255 to 1 step -1
	For teller = 255 to 1 step -1
	Next teller
Next teller2

Misschien is dit duidelijker?

Als je een of beide init waarden (0xff) kleiner maakt wordt de wachtlus korter. Bijvoorbeeld als je


delay	movlw	0x82
	movwf	teller2
verder	movlw	0xff
	movwf	teller
opnieuw	decfsz	teller, f 
	goto	opnieuw
	decfsz	teller2, f
        goto	verder
	return

Dit is een code die 99975 instructies gebruikt. Op 4Mhz = dat 0,099975 seconde.

Je kan nog een derde lus meenemen om zo nog langere tijden te wachten.


delay	movlw	0x0A
	movwf	teller3
delay1	movlw	0x82
	movwf	teller2
delay2	movlw	0xff
	movwf	teller
delay3	decfsz	teller, f 
	goto	delay3
	decfsz	teller2, f
        goto	delay2
	decfsz	teller3, f
        goto	delay1
	return

Dit is een code die ongeveer 10 x 99975 instructies gebruikt. Op 4Mhz = dat ongeveer 1 seconde.

Je mag ook diverse formaten door elkaar gebruiken


delay	movlw	0x0A
	movwf	teller3

is hetzelfde als


delay	movlw	D'10'
	movwf	teller3

en hetzelfde als


delay	movlw	b'00001010'
	movwf	teller3

[Bericht gewijzigd door Willie Worteltje op ]


#define	input	06,0
#define	output	06,5
#define	trisb	86h
#define teller	40h
#define	teller2	41h
	org 0x000
	bsf	03,5	
	bsf	input
	bcf	output
	bcf	83,5
vier	btfss	input
	goto vier
	call delay
	call delay
	bsf	output
	call delay
	bcf	output
	call delay
	bsf	output
	call delay
	bcf	output
	call delay
	goto vier
delay	movlw	0FFh
	movwf teller2
verder	movlw	0FFh
	movwf	teller
opnieuw	decfsz	teller,1
	goto opnieuw
	decfsz	teller2,1
	goto verder
	return
	end

klopt dit?

en over dat wachten op resultaat: zo lang duurt dat toch niet?

en over het niet snappen van de delay: ik snap ook "mijn"delay niet, hij komt letterlijk uit de micrcontroller toturital. (die was voor een PIC16F84A, zijn die ook hetzelfde qua tellers ed.? ofwel: gaat dát ook goed?)

[Bericht gewijzigd door Lucky Luke op ]

heb effe mijn vorige verhaal geedit. je hebt ondertussen al gepost. vandaar deze post.

dank je, maar begrijp ik het goed dat je met een d ervoor je je getallen ook gewoon decimaal kan opgeven?
* Lucky Luke gaat stoppen met de pc, hij denkt niet meer helder.

* Lucky Luke moet nog maar eens gaan graven naar tellers in de datasheet.

ja met een d kan je decimaal. Wel tussen '' zetten. Cool he.

Ik heb je progje voor je geoptimaliseerd.
Zal ik hem posten of wil je zelf stoeien?

Op 9 mei 2005 19:21:23 schreef Willie Worteltje:
ja met een d kan je decimaal. Wel tussen '' zetten. Cool he.

Of een puntje ervoor, minder typewerk :-)
Je kan trouwens instellen wat hij doet als er niks voorstaat. Standaard is dat hexadecimaal, maar je kan het veranderen naar bijvoorbeeld decimaal of octaal (8-tallig) stelsel. Dit gaat met het radix directive

Op 9 mei 2005 19:21:23 schreef Willie Worteltje:
ja met een d kan je decimaal. Wel tussen '' zetten. Cool he.

handig eerder, wel geinig, ook.

Ik heb je progje voor je geoptimaliseerd.
Zal ik hem posten of wil je zelf stoeien?

ga eerst zelf knoeien, want ik wil vooral wat leren, ik heb ook maar 1 uC gesampled (stomme fout merk ik nu, maar toen dacht ik dat ik er maar 1 nodig had, maar nu wil ik er mee door) en die is er nog niet eens :(

dus dit gaat gewoon eerst in die ene om proggen ed te testen, en dan ga ik aan die rgbled. dus dan gaat die erin.

dan zie ik als ik dat rgbled project af heb wel weer verder. dan sample ik er nog wat (zolang micrchip blijft sturen als ik gewoon eerlijk op hun vragen antwoord, per slot van rekening, 1 ding maken is een oplage minder dan 1000)ofzo...

eerst maar eens vissen hoe die tellerfunctie werkt. dat snap ik ook niet helemaal, gedetaileerde vraag later, ga me eerst grondig oriënteren.

* Lucky Luke heeft het druk, maar je hebt het nooit te druk om wat leuks te leren:), en over 5 weeksjes heeft lucky luke weer bijna een maand de tijd voor electro.:D:D:D (ja, en dan wil de tijd wel sneller gaan :( )

Oke dan.

Nog een Tip:
Gebruik de MPLAB simulator.
Kan je stap voor stap door de code heen stappen.
Dan 'zie' je gelijk hoe de teller werkt.

Op 10 mei 2005 18:27:47 schreef Willie Worteltje:
Oke dan.

Nog een Tip:
Gebruik de MPLAB simulator.
Kan je stap voor stap door de code heen stappen.
Dan 'zie' je gelijk hoe de teller werkt.

heb ik gedaan maar dat duurt gigalang met 2 tellers van 255 naar 0. vandaar dat ik dat waarde opgeven zo handig vind, dan zet ik ze op D'3' ofzo.

Op 10 mei 2005 18:30:08 schreef Lucky luke:
[...]
heb ik gedaan maar dat duurt gigalang met 2 tellers van 255 naar 0. vandaar dat ik dat waarde opgeven zo handig vind, dan zet ik ze op D'3' ofzo.

je kunt ook een breakpoint zetten na de teller, ben je bij de teller aangekomen dan doe je "step out" en dan doorloopt hij de teller en dan stopt hij weer bij het breakpoint na de teller. En dat scheelt idd een hoop tijd

'k snap toch zo nog niet het een en ander over die tellers, ik zou iets meer info willen als in de microicontroller toturital, maar minder dan in de datasheet, die komt weer aanzetten met watchdogtimers e.d. en prescaler (wat is dat nu weer?)??

edit: mischien handig, ik heb deze datasheet:
http://ww1.microchip.com/downloads/en/DeviceDoc/40300c.pdf

[Bericht gewijzigd door Lucky Luke op ]

Dat is DE datasheet die je moet hebben.

Ik neem dit voorbeeld even:


delay	movlw	0x0A
	movwf	teller3
delay3	movlw	0x82
	movwf	teller2
delay2	movlw	0xff
	movwf	teller
delay1	decfsz	teller, f 
	goto	delay1
	decfsz	teller2, f
        goto	delay2
	decfsz	teller3, f
        goto	delay3
	return

In deze delay routine zijn 3 loops in elkaar gebouwd.

We beginnen met de binnenste loop


delay2	movlw	0xff		; laad init waarde 255
	movwf	teller		; in register teller 1
delay1	decfsz	teller, f 	; trek 1 van register af en spring over de 
				; volgende instructie als registerwaarde 0 is
	goto	delay1		; ga naar delay1
	decfsz	teller2, f	; hier springt de uC naartoe als teller = 0

Dit zijn dus 255 loops voordat de uC uit de loop springt.

We kijken nu naar delay2. Deze omvat delay1.


delay3	movlw	0x82
	movwf	teller2
delay2	movlw	0xff
	movwf	teller
delay1	decfsz	teller, f 
	goto	delay1
	decfsz	teller2, f
        goto	delay2
	decfsz	teller3, f

delay2 wordt 130x uitgevoerd en in delay2 wordt delay1 255x uitgevoerd. In totaal wordt delay1 130x255=33150x uitgevoerd.

Voor delay3 geldt net zo iets.
delay3 wordt 10x uitgevoerd en en elke delay wordt dus 130x delay2 uitgevoerd en 33150x delay1. In totaal wordt delay3 10x uitgevoerd, delay2 1300x en delay1 331500x.

hoe een delay met tellers werkt snap ik, dat staat ook duidelijk in de toturital (maar bedankt voor de extra uitleg) ik snap niet hoe het zit met gedeelde prescalers, wdt's e.d die óók iets met die tellers van doen lijken te hebben.

??

Op 14 mei 2005 19:34:23 schreef Lucky luke:
hoe een delay met tellers werkt snap ik, dat staat ook duidelijk in de toturital (maar bedankt voor de extra uitleg) ik snap niet hoe het zit met gedeelde prescalers, wdt's e.d die óók iets met die tellers van doen lijken te hebben.

Er zitten twee prescalers in de 16F628:
1) Timer 2 heeft een eigen prescaler.
2) Bij de andere prescaler kan je kiezen of je hem voor de WDT wil gebruiken OF voor Timer 0. Dus voor slechts een van de twee, de keuze maak je met het PSA bitje.
De prescalers delen trouwens het klok signaal door een in te stellen waarde. Op die manier kan je langere tijden instellen voor de timers.

dat is 1 van de twee dingen die ik wou weten, dan nog 1 (vele zullen volgen vrees ik, maar ook op ander gebieden natuurlijk:))

waar moet ik voor kiezen: de WDT, of timer0?

wat heeft elke keuze voor consequenties?

Op 14 mei 2005 22:23:24 schreef Lucky luke:
waar moet ik voor kiezen: de WDT, of timer0?

Timer0 als je hem nodig hebt.
De WDT zul je nooit gebruiken. (Zoek maar eens uit waar een watchdog timer voor bedoeld is).
Normaal zet je de fuses zo dat deze disabled is (WDT_OFF of zo iets)

[Bericht gewijzigd door JoWi op ]

Waarom nou meteen zo moelijk beginnen? Laat die WDT, TIMER0 A/D ingangen ed gewoon met rust, en begin er pas mee als je wat verder bent. Begin gewoon met een programma dat een ledje aan kan zetten, voeg dan eens een schakelaar toe die het ledje bestuurd, dan een delay loop (zonder timer0, maar gewoon met een variabele) enz. Bouw het rustig op

Kan het niet laten ;-). Ook voor andere beginners die dit lezen de code.

       LIST P=16F628	; welke processor ?

        include <P16F628.INC>	; standaard definities

	__CONFIG _CP_ALL & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _BODEN_OFF & _DATA_CP_ON

	ERRORLEVEL -302 ; ignore: Register in operand not in bank 0

	CBLOCK 0x20	; begin met variabelen
		teller1
		teller2
		teller3
        ENDC		; einde variabelen

	#define input	PORTB,0	; input zit op pin 6
	#define output	PORTB,5 ; output zit op pin 10

	#define	BANK0	bcf	STATUS,RP0	; RAM PAGE 0
	#define	BANK1	bsf	STATUS,RP0	; RAM PAGE 1

	org	0x000		; begin van de chip

; ---------------- 
; INITIALIZE PORTS
; ---------------- 

r_init	movlw	D'7' 
        movwf	CMCON		; Comparators off, all pins digital I/O 
        clrf	PORTA		; reset PORTA	
        clrf	PORTB		; reset PORTB	
	BANK1
        movlw	b'11111111'
        movwf	TRISA		; PORTA alles input
        movlw	b'00000001'
        movwf	TRISB		; RB0 input rest is output
	BANK0

; ----------------
; Reset registers
; ----------------

r_clear	clrf	teller1
	clrf	teller2
	clrf	teller3

; ----
; Main
; ----

main	btfss	input	;wacht op input hoog
	goto	main	;spring terug naar main als input er niet is 
	bsf	output	;led aan
	movlw	D'5'	;5  
	call	delay	;x 0,1 = 0,5 sec wachten
	bcf	output	;led aan
	movlw	D'5'	;5  
	call	delay	;x 0,1 = 0,5 sec wachten
	bsf	output	;led aan
	movlw	D'5'	;5  
	call	delay	;x 0,1 = 0,5 sec wachten
	bcf	output	;led aan
	movlw	D'5'	;5  
	call	delay	;x 0,1 = 0,5 sec wachten
	btfsc	input	;wacht op input laag
	goto	$-1	;spring een stap terug als input nog hoog is
	goto	main	;oneindige herhaling van het stukje main

; -------------
; Delay routine
; -------------

delay	movwf	teller3
delay1	movlw	0x82
	movwf	teller2
delay2	movlw	0xff
	movwf	teller1
delay3	decfsz	teller1, f 
	goto	delay3
	decfsz	teller2, f
        goto	delay2
	decfsz	teller3, f
        goto	delay1
	return

; let op als je deze routine gebruikt.
; zet een waarde in w
; 1 x 0,1 = 0,1 seconde wachten
; 0 x 0,1 = 256 x 0,1 = 25,6 seconde wachten.
 
        END