Hallo,

Ik ben begonnen met uC te programmeren, alleen nou wil ik een robot maken met een PIC16F84A of 628, en dan moet 1 of meerdere uitgangen een bepaalde tijd hoog zijn en dan heb ik het of 1 of 2 sec of langer.
Mijn vraag is hoe doe ik dat, ik heb gezien hoe het moet met knipperled in het artikel maar dat is 200mS.

Is dat de enigste manier of zit er een speciaal instructie/timer ingebouwt in de PIC16F serie ?
Of moet ik dan een andere uC hebben, zo ja welke ?

Ik ben pas net begonnen dus hoef geen PIC met 100en instructies.

Groeten,

Jeroen

nou in welke taal programeer je :)

Door dat lusje een beetje uit te breiden (er nog een lus omheen te zetten bijvoorbeeld) Kun je inderdaad zorgen dat de microcontroller een vaste tijd wacht.

Er zitten ook een aantal timers in, die kun je ook gebruiken, dan kan je pic namelijk iets doen terwijl hij wacht. Maar bij knipperende leds ed is dat meestal niet nodig.

Als je pas begint zou ik niet meteen een robot gaan bouwen maar eerst wat simpelere dingen programmeren. Een knipperled is goed omdat je daarbij de simpele basics leert zoals nesting en dergelijke. Dan de knipperled uitbreiden en bijv. een looplicht maken.
Simpel beginnen dus en misschien moeilijk eindigen!

In een familie pic's bezitten alle varianten dezelfde instructieset. Alleen de periferie verschilt.

Gtz,

Rik.

Nou heb op school al verschillende opdrachten gedaan knightrider looplicht en nog wat dingen.

Maar hoe kun je de timer dan gebruiken in PIC16F serie ?

Op 6 april 2005 17:38:49 schreef DJJeroen:
Nou heb op school al verschillende opdrachten gedaan knightrider looplicht en nog wat dingen.

Maar hoe kun je de timer dan gebruiken in PIC16F serie ?

datasheet lezen en google raadplegen...

Da's raar, je weet niet hoe je een timing lus kunt verlengen maar je hebt al wel een knightrider licht gemaakt? Of heb je dat alleen maar overgetypt....

Ik zou toch maar weer eens de boeken in duiken of zoals mijn voorganger zegt het datasheet en google!

Gtz,

Rik

Op 6 april 2005 18:28:54 schreef Rik_J:
Da's raar, je weet niet hoe je een timing lus kunt verlengen maar je hebt al wel een knightrider licht gemaakt? Of heb je dat alleen maar overgetypt....

Ik zou toch maar weer eens de boeken in duiken of zoals mijn voorganger zegt het datasheet en google!

Gtz,

Rik

Ik kan de tijd lus wel verlengen, maar het leek mij beter om een timer te gebruiken mits die erin zit.

En in de Datasheets kon ik niks kwa instructies vinden misschien heb ik er wel langs gekeken, en google ook niks.

BTW in assembler

[Bericht gewijzigd door Jeroen13 op ]

Hier een voorbeeld van een 1 seconde wachtlus

aanroepen met:
call seconde

;*********************
;* Wachtlus Routines *
;*********************
; Zijn alleen van toepassing bij 4Mhz

seconde	call	msec250
	call	msec250
	call	msec250
	call	msec250
	return

msec250	movlw	D'250'
nmsec	movwf	cntmsec		; delay for N (in W) millisec
mseclp	movlw	D'248'		; 1 usec for load
	call	usec		; this instruction is 995 usec
	nop			; 1 usec 
	decfsz	cntmsec,f	; 1 usec, (2 if skip taken)
	goto	mseclp		; 2 usec, loop = 995+5 = 1 msec
	return 

usec	addlw	D'255'		; subtract 1 from 'W'
	btfss	STATUS,Z	; skip when you reach zero
	goto	usec		; more loops
	return                     

Op 6 april 2005 19:46:31 schreef DJJeroen:
En in de Datasheets kon ik niks kwa instructies vinden misschien heb ik er wel langs gekeken, en google ook niks.

Dacht je dan dat ze bij Microchip bij alle beschrijvingen van elke perifere functie voorbeelden gaan zitten opsommen? Voor een timer (de 628 heeft er 3) zijn honderden toepassingen denkbaar, en 1 ervan is een tijdvertraging maken.

De datasheet geeft ruim voldoende informatie om alle functies te kunnen gebruiken. Jij zult de basiskennis moeten hebben om met die informatie een routine te schrijven.

Preciess en daarbij denk ik dat je een typefout in google moet maken om niet heeeel veeeeel links te krijgen!

Gtz,

Rik

Ik heb het gevonden van timer in datasheet.

Nou heb ik nog en vraag,

Ik heb dit bordje van velleman http://www.velleman.be/common/product.aspx?lan=2&id=350903
en nou wil ik op TRISB bit 1 een 1 hebben.


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

         ORG      00h
         BSF    03,5		
         CLRF	TRISB		
         BCF 	03,5	

         MOVLW	00000001b
         MOVWF	PORTB

         END

Klopt dit of niet,zo niet wat doe ik fout want hij werkt niet ?

EDIT

[Bericht gewijzigd door Jeroen13 op ]

Je wilt wat doen met TRISA en PORTA neem ik aan, maar je adresseert de B poorten ??

Op 7 april 2005 21:01:40 schreef JoWi:
Je wilt wat doen met TRISA en PORTA neem ik aan, maar je adresseert de B poorten ??

A moet de ingang zijn en B moet uitgang zijn

Ok, voor allemaal aan doe je het volgende:


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

Werkt niet als ik de schakelaar op het bordje op run zet staat er percies 5V op de MCRL pin4 maar de uitgangen RB0 t/m RB7 zijn 0.5v dus laag.

en zodra ik mijn vingers op de Jumpers houd doet hij het wel


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

Dat heb ik gedaan na een tip van iemand anders. Zie: http://www.circuitsonline.net/forum/view/16644

Op 18 april 2005 19:42:37 schreef Wiebo:
[...]

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?

[...]

Groetjes

Vette opmerking Wiebo.

Dit is zo waar!!!!
Echt doen als je in ASM progt.

Bij mij duizeld het ook als ik andermans code doorneem en er staat:
BSF 03,5
terwijl
BSF STATUS, RP0
zoveel duidelijker is.

In dat geval, ik heb eens iets opgesteld om overzichtelijk in ASM te programmeren. Misschien enkele tips die handig kunnen zijn? Dit heb ik enige tijd geleden "gepost". Misschien zijn er nog enkele dingen bij die je nog niet wist ;)

http://www.circuitsonline.net/forum/view/13171/1/

Succes!