PIC probleempje

situatieschets:
ik heb op een breadboard een simpele configuratie zijnde->
-een PIC16F627a(4MHz kristal + 10k pull-up weerstand)
-een 7segment LEDdisplay
probleem:
na het programmeren van mijn PIC(met Picprog2009 van velleman, code in assembly, in de software vink ik ook "pin function MCLR" en "XT oscillator" aan) doet hij het welgetelt één maal.
Iemand een idee wat dit kan zijn ondanks deze beperkte informatie?

Klinkt als een fout in je code. Dat er gewoon een eind in zit. Dat je niet eindigt met een while lus of zo. Dit zou in ieder geval een mogelijkheid zijn. Maar ik weet niet goed hoeveel kennis je hebt van dit soort zaken. Is wat lastig in te schatten dus

mijn kennis is eeder beperkt, ik dacht met een pull-up weerstand en als ik deze functie aanvink in mn programmer dat mijn pic toch continu reset?
dank voor repley

moest hij continu in reset staan zou hij helemaal niets uitvoeren ook hè

Post je code anders kan niemand er chocola van bakken.

Just find out what you like and let it kill you

bij voorgaande applicatie heb ik het ook zo gedaan en dit functioneerde naar behoren ;), dus nam ik aan dat de PIC eerst de code doorliep en daarna 'herstartte' dankzij de MCLR pin en bijhorende pull-up?
Ben ik fout?

Ja, je zit fout ;-). Die pull-up zorgt er sowieso voor dat de PIC juist niet reset. Als je de PIC via de /MCLR wil resetten, zul je 'm laag moeten brengen (door 'm aan ground te hangen). Zolang de /MCLR met ground verbonden blijft, zal de PIC in reset status blijven en dus geen code uitvoeren. /MCLR is namelijk geïnverteerde poort: als deze hoog is, 'ziet' de PIC dat als een logische 0. Als hij laag is 'ziet' hij dat als een logische 1 en zal dus resetten.

Druk voor de lol de reset knop van je computer eens in en houd deze ingedrukt: hij zal in reset blijven en dus niet opstarten. Dit is hetzelfde principe.

Als er in je code een einde hebt zitten (en dus geen oneindige loop) dan zal hij na uitvoer van je code dus stoppen.

Maar zoals reeds gevraagd: plaats hier je code eens! Alleen dan is er met (meer) zekerheid iets over te zeggen.

[Bericht gewijzigd door RvL op maandag 1 februari 2010 13:45:52 (11%)

jullie zouden me al helpen met een paar regels code;
hoe kan ik het beste(volgens het gangbare protocol) op een pic16f627a van port B uitgangen maken en van port a ingangen? in assembly!(dit schijnt het beste te zijn)
dank

[Bericht gewijzigd door Sinutab op maandag 1 februari 2010 14:47:15 (11%)

Via TRIS register mss?

Beter is dan ook je poorten verwisselen ivm port pullups

ASPA-tech.be

[code=Pic assembly]
bank1
MOVLW 0xFF ;PORTA = inputs
MOVWF TRISA
MOVLW 0x00 ;PORTB = outputs
MOVWF TRISB
bank0

[Bericht gewijzigd door steve04 op maandag 1 februari 2010 15:12:45 (70%)

ik weet dat ik mijn byte in het working register moet plaatsen en vervolgens naar de respectievelijke poort. maar hoe zit het dan met die 'banks'

ik weet dat wat ik nu ga vragen normaal not done is maar kunnen jullie me die paar regels even schrijven opdat portA uitg en portB ing zijn verder zal me wel lukken, maar ik heb gewoon geen tijd om dit snel op te zoeken en ben een absolute leek met pic's en assembly, en moet ik dan dus niet met een pull-up werken?

bedankt voor de moeite jongens!

TRISA en TRISB zitten in bank1 van het RAM (zie datasheet) dus je moet eerst zorgen dat je in bank1 zit voorlaleer je een byte kan schrijven naar TRISA/TRISB. Dit kan je onderanderezo doen:

[code=pic assembly]
BSF STATUS,RP0 ;select bank1
.....................;I/O settings
BCF STATUS,RP0 ;select bank0
[/code]

Iedereen is ooit als leek begonnen. Echter, door tijd te maken, heel veel te lezen en te oefenen kan men zich iets eigen maken en leek-af worden.

Allereerst, volgens mij haal je het een en ander stevig door elkaar. In je topicstart heb je het over een pull-up weerstand op de /MCLR. Deze heeft dus niets te maken met eventuele pull-up op je uitgangen!

Ook zie ik niet zo in wat dit te maken heeft met het eerste probleem. Het komt op mij over als of je ergens een stuk code vandaan hebt getrokken waarvan je de werking niet kent en wat niet (geheel) naar verwachting werkt. Please correct me if wrong.

Goed, dat gezegd hebbende, hieronder staat de code waarmee je PORTA als uitgang en PORTB als ingang definieert. Overigens staat dit ook allemaal in de datasheet en in de vele tutorials op het internet, zelfs op deze website.

pic asm code:


; Het complete TRISA register 0 = PORTA uitgang
bsf STATUS, RP0 ; Bank 1
movlw 0x00  ; Allereerst waarde 0x00 (=b'00000000') naar werkregister
movwf TRISA ; Daarna werkregister naar TRISA register plaatsen

; Het complete TRISB register 1 = PORTB ingang

movlw 0xFF  ; Allereerst waarde 0xFF (=b'11111111') naar werkregister
movwf TRISB ; Daarna werkregister naar TRISB register plaatsen
bcf STATUS, RP0 ; Bank 0

Mocht je nu de ingebouwde pull-ups op PORTA willen gebruiken, dan moet je daarvoor een ander register correct instellen. En dat, mijn waarde Sinutab, staat keurig uitgelegd in de datasheet

Op 1 februari 2010 15:11:36 schreef Sinutab:
ik weet dat wat ik nu ga vragen normaal not done is maar kunnen jullie me die paar regels even schrijven opdat portA uitg en portB ing zijn verder zal me wel lukken, maar ik heb gewoon geen tijd om dit snel op te zoeken en ben een absolute leek met pic's en assembly, en moet ik dan dus niet met een pull-up werken?

Dus je weet niet hoe je even het tris-register goed zet, maar de rest zal wel lukken?

If you want to succeed, double your failure rate.

@RvL: De PIC16F627 heeft enkel pull-ups op PORTB en niet op PORTA. De PORTB pull-ups kunnen enable gemaakt worden door de RBPU-bit in het option-register op "0" te zetten.

Fijn, ben steeds op zoek naar een reden om te quoten :)
=>

Het komt op mij over als of je ergens een stuk code vandaan hebt getrokken waarvan je de werking niet kent en wat niet (geheel) naar verwachting werkt. Please correct me if wrong.

you're right!:)

Dus je weet niet hoe je even het tris-register goed zet, maar de rest zal wel lukken?

toen ik mijn eerste pull(-up) breidde heeft mijn mams ook de linkermouw voorgedaan en ik de rest, de pull(blouse ;)) was niet geheel mooi maar hij past me wel.

De wondere wereld van metaforen even terzijde, mijn oprechte dank voor de vele en snelle hulp die ik steeds krijg op dit forum!

Arco

Special Member

Beter meteen met banksel:

pic asm code:


; Het complete TRISA register 0 = PORTA uitgang
banksel TRISA ; Bank trisa
movlw   0x00  ; Allereerst waarde 0x00 (=b'00000000') naar werkregister
movwf   TRISA ; Daarna werkregister naar TRISA register plaatsen
 
; Het complete TRISB register 1 = PORTB uitgang
 
movlw   0xFF  ; Allereerst waarde 0xFF (=b'11111111') naar werkregister
movwf   TRISB ; Daarna werkregister naar TRISB register plaatsen
banksel PORTA ; Bank porta
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

@steve04
Je hebt natuurlijk helemaal gelijk! Ik dacht het uit m'n hoofd wel even te weten. Het nut van datasheets is meteen weer bewezen ;-)

@Sinutab
Ik zal niet beweren dat ik dat zelf nooit gedaan heb, ergens een stuk code vandaan halen en zelf gebruiken, maar zorg in ieder geval dat je ten alle tijden weet wat er gebeurd in de code! Mocht er dan iets niet helemaal gaan zoals je het in gedachte hebt, dan heb je in ieder geval de kennis om te achterhalen waar 't fout gaat.

@Arco
Je hebt natuurlijk helemaal gelijk. Banksel is een stuk netter, zeker omwille cross-compatibiliteit tussen PICs

[Bericht gewijzigd door RvL op maandag 1 februari 2010 18:11:05 (11%)

hoi, hier ben ik weer...

pic asm code:


org 	0x00
	bsf	STATUS, RP0
	MOVLW	0X00	
	MOVWF	TRISB
	bcf	STATUS, RP0
	movlw	0xFF
	movwf	006h
	end

deze eenvoudige paar regels zetten bij mijn bescheiden weten alle uitgangen op portb 'hoog'(?). Als jullie dit kunnen bevestigen ligt de fout aan het breadbord want mijn super simpele schakeling werkt dus niet.

Begin dan eens met een bestaande blink-a-led, dan kun je je opstelling uitsluiten.

Gebruik voor de leesbaarheid en voorkomen van fouten BANKSEL en PORTB in plaats van direct te adresseren.

If you want to succeed, double your failure rate.

Ja, dat klopt. Door TRISB compleet 0 te maken, maak je PORTB compleet uitgang. Je zet ze ook aan door 0xFF naar PORTB (0x06) te schrijven. Wat

Misschien is het een idee om een schema van je schakeling te plaatsen. Misschien zit er wel een fout in je schakeling.

Ik neem aan dat je in je ASM ook hebt aangegeven met welke PIC je werkt, je de include file voor de 627a ook daadwerkelijk in je code include en je de fuses ook allemaal instelt?

En wat Jochem ook al aangeeft, voorkom directe adressering waar mogelijk. Over een half jaar (of in mijn geval al over een week ;-)) weet je niet meer welk register er op adres 0x06 zit. Als je dan ook nog eens code gaat schrijven voor andere PIC's gaat 't helemaal leuk worden, want dan kan er op 0x06 zomaar een ander register zitten (of in het geval van b.v. de 16F676 helemaal niets).

Als laatste, zorg dat je code altijd in een eindeloze loop draait. In dit geval niet van heel groot belang, maar het kan je in de toekomst heel veel werk schelen: het kan voorkomen dat je zoekt naar een 'bug' terwijl het probleem veroorzaakt wordt door je code die eindigt.

Jou code wordt dan dus als volgt:

pic asm code:


org 	0x00
	banksel TRISB ; Selecteer de bank waar TRISB in zit, bank 1 in dit geval
	movlw	0x00	
	movwf	TRISB
	banksel PORTB; Selecteer de bank waar PORTB in zit, bank 0 in dit geval
main	
	movlw	0xFF
	movwf	PORTB
	goto	main
	end

Op 4 februari 2010 10:58:20 schreef RvL:
Als laatste, zorg dat je code altijd in een eindeloze loop draait. In dit geval niet van heel groot belang

Waarom in dit geval niet? Wie weet wat er daarna nog naar register 0x06 geschreven wordt..

If you want to succeed, double your failure rate.

Hoewel je het inderdaad niet zeker kan weten, zal er in dit geval waarschijnlijk niet al teveel gebeuren. De processor krijgt immers geen instructies meer.

Want jij weet wat er nog achter de laatste instructie staat? Nee, dat weet je niet, d'r kan vanalles staan.

If you want to succeed, double your failure rate.

Afgaande op wat mijn programmer en bijbehorende software me verteld, staat daar gemiddeld 0x3FFF, ofwel complete 14 bits register '1'. Lijkt me niet dat dat nu echt uitvoerbaar is.

Maar nogmaals, je kan het inderdaad nooit zeker weten. Zeker niet als je geen erase voor programmeren doet.

we dwalen overigens af