Berry
A PIC-based MP3 player: www.apic-bmp.nl.tt | Intresse in techniek? www.djoamersfoort.nl
Hoi,
ik ben een beetje in de artikelen aan het rondkijken, en ik vroeg me af of ik nou gek was of iets in het artikel niet klopte
Nu is de poort juist ingesteld en kunnen we hem gaan aansturen. De 1e led die we willen aansturen zit op RA0. Deze led kunnen we laten branden door die uitgang hoog te maken. Hiervoor dienen we het data register van poort A te veranderen. We willen daarvoor op het adres 05h een 1 op het de plek van bit 0. Adres 05h is poort A, en bit 0 is de plek waar de waarde van pin RA0 staat. Hier dient een 1 te komen dus gaan we een 1 daar plaatsen. Dit kan niet direct dus gaan we eerst een getal in W laden, waarna de W zijn waarde op adres 05h laten zetten. Hiervoor gebruiken we de volgens instructies:
porta EQU 05h
MOVLW 01h
MOVWF porta
Hoezo kan het niet direct en moet je eerst het in W laden? Je kan toch dit doen
porta EQU 05h
BSF porta, 01h
waarom zou dat dan niet werken?
Nog een vraagje over dit artikel
In dit project is ons 1e doel om eerst 1 ledje te laten branden. Dit gaan we dus nu als eerste bekijken. We moeten dus eerst poort A aansturen. Zoals we je hebben uitgelegd in het hardware gedeelte moet je eerst de poorten instellen. Je moet namelijk instellen wat elke pin moet gaan doen. Onze poort A moet de leds aansturen dus moet een uitgang worden. In de datasheet (pag. 7) kun je vinden dat het "data direction register" van poort A op geheugenadres 85h zit. Een 0 in dat register betekend een uitgang en een 1 een ingang. Wij gaan daar dus een 0 neerzetten. Het makkelijkste om dit te doen is om het register te clearen met de instructie CLRF 85h. Omdat het lastig is om die 85h te onthouden maken we gebruik van een EQU commando. Er is alleen een "maar". Niet elk register in het geheugen van de PIC is direct toegankelijk. Dit is ook het geval bij het poort A direction register. Om er toch bij te kunnen moeten we de controller in een andere bank zetten, namelijk bank 1. Dit doe je met de instructie: BSF 03,5. Nadat de richting van poort A (en eventueel B) is ingesteld moet je weer terug naar bank 0 met : BCF 03,5. Dus krijgen we de volgende code krijgen:
instelporta EQU 85h
BSF 03,5
CLRF instelporta
BCF 03,5
Het zal best dat je BSF 03, 5 moet doen om op bank1 te komen, maar ik snap toch niet helemaal waarom...
Addres 03h is het status register, toch? 5 is 00000101, dus dat zijn de zero en carry flag die je set... Hebben ze dan een andere betekenis als je ze zelf zet? Of is dat de speciale betekenis die het heeft bij een bepaalde instructie?
Ik dacht overigens dat registers stukjes geheugen waren in een processor (flip-flops?). Maar nu blijken er ook registers te zijn in het ram-geheugen?
k.p.meinesz
Een schizofreen is nooit alleen!
Op 19 augustus 2004 21:20:42 schreef Berry:
Hoi,ik ben een beetje in de artikelen aan het rondkijken, en ik vroeg me af of ik nou gek was of iets in het artikel niet klopte
[...]
Hoezo kan het niet direct en moet je eerst het in W laden? Je kan toch dit doen
porta EQU 05h
BSF porta, 01hwaarom zou dat dan niet werken?
Nog een vraagje over dit artikel
[...]
Het zal best dat je BSF 03, 5 moet doen om op bank1 te komen, maar ik snap toch niet helemaal waarom...
Addres 03h is het status register, toch? 5 is 00000101, dus dat zijn de zero en carry flag die je set... Hebben ze dan een andere betekenis als je ze zelf zet? Of is dat de speciale betekenis die het heeft bij een bepaalde instructie?Ik dacht overigens dat registers stukjes geheugen waren in een processor (flip-flops?). Maar nu blijken er ook registers te zijn in het ram-geheugen?
leees ff in de data sheet over READ-Modify-write instructie en schaduw registers
dan weet je waarom geen bsf/bcf instructie toe te passen op een poort
bsf 03,5 betekend status register bit 5
oftewel bank select bit
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Me = acteur van dat artikel
Op 19 augustus 2004 21:20:42 schreef Berry:
of ik nou gek was of iets in het artikel niet klopte
Dat laaste is niet het geval dus ..... 
Hoezo kan het niet direct en moet je eerst het in W laden? Je kan toch dit doen
porta EQU 05h
BSF porta, 01h
Denk je dat ik dat uit me duim zuig?
waarom zou dat dan niet werken?
Kijk maar in de datasheet en assembleer het eventueel in MPLAB. Dan zul je zien dat het niet mogelijk is om dat direct te doen. Het is ook niet voor niks het working (werk) register. Middels dat working register zet je waardes op hun plek. Het is een soort van karretje waar je data in doet en wat dan naar zijn bestemming rijd en daar weer zijn inhoud lost.
5 is 00000101
Klopt helemaal, maar bij die instructie geeft dat getal het bit nummer aan. Dus hier is dat bit nummer 5. Zie eveneens de datasheet, daar staat het in vermeld bij de instructieset.
k.p.meinesz
Een schizofreen is nooit alleen!
Op 19 augustus 2004 22:41:45 schreef Bastiaan:
Kijk maar in de datasheet en assembleer het eventueel in MPLAB. Dan zul je zien dat het niet mogelijk is om dat direct te doen. Het is ook niet voor niks het working (werk) register. Middels dat working register zet je waardes op hun plek. Het is een soort van karretje waar je data in doet en wat dan naar zijn bestemming rijd en daar weer zijn inhoud lost.
theoretisch kun je een BSF/BCF instructie prima op een poort uitvoeren
echter je krijgt soms fouten doordat de BSF/BCF instructie eerst de poort leest dan veranderd en weer terug schrijft
staat in de datasheet
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op 19 augustus 2004 23:19:10 schreef k.p.meinesz:
[...]
theoretisch kun je een BSF/BCF instructie prima op een poort uitvoeren
echter je krijgt soms fouten doordat de BSF/BCF instructie eerst de poort leest dan veranderd en weer terug schrijft
staat in de datasheet
Dat klopt, maar omdat het niet altijd werkt en dus niet betrouwbaar genoeg is hebben ze die optie "afgesloten" dus eigenlijk werkt het niet.
Jij gaat wat dat betreft diep er op in. Iets te diep voor een beginner denk ik 
ps Ik heb wel heel wat teweeg gebracht bij je door die tutorial te schrijven
. Vanaf dat je ermee aan de slag bent gegaan ben je helemaal verkocht en ken je alle ins en outs 
[Bericht gewijzigd door Bastiaan op ]
k.p.meinesz
Een schizofreen is nooit alleen!
Op 19 augustus 2004 23:43:51 schreef Bastiaan:
[...]
Dat klopt, maar omdat het niet altijd werkt en dus niet betrouwbaar genoeg is hebben ze die optie "afgesloten" dus eigenlijk werkt het niet.
Jij gaat wat dat betreft diep er op in. Iets te diep voor een beginner denk ik
je hebt gelijk iets te diep voor beginner maar , als hij het probeert im bv MPLAB werkt het prima en zal pas bij het werkelijke bouwen de fout naar voren komen nu weet ie dat er iets mee is
ps Ik heb wel heel wat teweeg gebracht bij je door die tutorial te schrijven
. Vanaf dat je ermee aan de slag bent gegaan ben je helemaal verkocht en ken je alle ins en outs
[/quote]
kun je nagaan hoe ongelovelijk motiverend dat stukkie text is. 
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op 20 augustus 2004 00:23:12 schreef k.p.meinesz:
maar als hij het probeert im bv MPLAB werkt het prima en zal pas bij het werkelijke bouwen de fout naar voren komen nu weet ie dat er iets mee is
Ow, is dat zo? Ik dacht dat de assembler een fout gaf als je dat wilde assembleren.
Maar om eerlijk te zijn heb ik alweer een tijdje niet meer met PIC en dus PIC-asm gewerkt (wel met C en AVR-asm) dus weet niet meer precies wat die deed.
kun je nagaan hoe ongelovelijk motiverend dat stukkie text is.
Yep, en het is heel erg leuk om te zien dat jij er nu zoveel vanaf weet (en velen anderen met je).
Berry
A PIC-based MP3 player: www.apic-bmp.nl.tt | Intresse in techniek? www.djoamersfoort.nl
Denk je dat ik dat uit me duim zuig?
Nee, dat zeker niet. Ik vroeg me gewoon af waarom het niet zo kon 
Kijk maar in de datasheet en assembleer het eventueel in MPLAB. Dan zul je zien dat het niet mogelijk is om dat direct te doen. Het is ook niet voor niks het working (werk) register. Middels dat working register zet je waardes op hun plek. Het is een soort van karretje waar je data in doet en wat dan naar zijn bestemming rijd en daar weer zijn inhoud lost.
Ok, dat zal kloppen. Maar ik snap niet waarom je bij het status register het wel kan doen, en bij de poorten niet 
Klopt helemaal, maar bij die instructie geeft dat getal het bit nummer aan. Dus hier is dat bit nummer 5. Zie eveneens de datasheet, daar staat het in vermeld bij de instructieset.
Klopt, ik zie het nu! 
@k.p.meinesz: Waar heb jij dat dan allemaal van geleert? De datasheets? Sites???
k.p.meinesz
Een schizofreen is nooit alleen!
het artikel van bastiaan was de aanzet toen ik dat kon heb ik gewoon heel www afgezocht naar voorbeelden.
en veel lezen in de datasheets.
het eerste programma wat ik zelf schreef was de binaire klok(staat ergens in dit forum)
BSF/BCF is een READ-MODIFY-WRITE instructie
als je dit op een poort doet lees de pic eerst de poort
vervolgens verandert hij de waarde en zet deze terug op de poort
nu als een pin vanbuitenaf hoog gemaakt is en je doet een BSF op welke pin dan ook dan leest de pic voor die pin dat hij hoog is en schrijft deze daardoor ook hoog weer weg terwijl deze laag had moeten blijven.
stel poort B=00000000
bsf 06,0 zou dus 00000001 op leveren
echter stel dat ik een spanning op pin 7 zet
het zijn uitgangen dus ik lees nogsteeds 00000000
echter na de bsf word de poort opeens 10000001
dus bit 7 word ook gezet omdat ervan buiten een 1 opstaat
daarom is het beter om zgn. schaduw registers te gebruiken
en dit register in zijn geheel steeds naar de poort te schrijven
dus
movf poortb,w
movwf schaduwregB
bsf schaduwregb,x
movf schaduwregb,w
movwf poortb
zo voorkom je dat foute waardes op de poorten komen
www.piclist.com
staat een boel voorbeeld code op.
en google zoeken met pic + asm leverd ook aardig wat info op
succes
Berry
A PIC-based MP3 player: www.apic-bmp.nl.tt | Intresse in techniek? www.djoamersfoort.nl
Op 20 augustus 2004 13:54:58 schreef k.p.meinesz:
BSF/BCF is een READ-MODIFY-WRITE instructie
als je dit op een poort doet lees de pic eerst de poort
vervolgens verandert hij de waarde en zet deze terug op de poort
nu als een pin vanbuitenaf hoog gemaakt is en je doet een BSF op welke pin dan ook dan leest de pic voor die pin dat hij hoog is en schrijft deze daardoor ook hoog weer weg terwijl deze laag had moeten blijven.stel poort B=00000000
bsf 06,0 zou dus 00000001 op leveren
echter stel dat ik een spanning op pin 7 zet
het zijn uitgangen dus ik lees nogsteeds 00000000
echter na de bsf word de poort opeens 10000001
dus bit 7 word ook gezet omdat ervan buiten een 1 opstaat
daarom is het beter om zgn. schaduw registers te gebruiken
en dit register in zijn geheel steeds naar de poort te schrijven
dus
movf poortb,w
movwf schaduwregB
bsf schaduwregb,x
movf schaduwregb,w
movwf poortb
zo voorkom je dat foute waardes op de poorten komen
Ik snap het niet helemaal...
Als je shadow regs gebruikt, dan is het toch nogsteeds Read-Modify-Write en kan het dus tijdens de modify nog veranderen?
Fuzzbass
Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com
Op 20 augustus 2004 14:32:04 schreef Berry:
[...]Ik snap het niet helemaal...
Als je shadow regs gebruikt, dan is het toch nogsteeds Read-Modify-Write en kan het dus tijdens de modify nog veranderen?
Het daadwerkelijke schrijven naar de poort gebeurt in het voorbeeld met een write-instructie, i.t.t. een read-modify-write instructie. Ken het verschil en begrijp het probleem.
Berry
A PIC-based MP3 player: www.apic-bmp.nl.tt | Intresse in techniek? www.djoamersfoort.nl
ik kan die 2 dingen (write en read-modify-write) niet vinden in de datasheet... Moeten ze daar echt instaan?
k.p.meinesz
Een schizofreen is nooit alleen!
Op 20 augustus 2004 15:26:40 schreef Berry:
ik kan die 2 dingen (write en read-modify-write) niet vinden in de datasheet... Moeten ze daar echt instaan?
ja het staat er echt in
Hoofdstuk 5.3.2
successive operations on I/O ports.