Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[El] PWM met een PIC 16F84A

Pagina: 1
Acties:
  • 153 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Heeft iemand een goede en simpele methode voor een PWM progje (in asm niet jal!) dat een ledje helemaal aan en uit kan sturen, het liefst langzaam (voor RGB leds later) Met de onderstaande testroutine kan ik een dutycycle generen van 1 tot 254, echter brandt de led nog zwakjes met een DC (dutycycle)van 1 en is deze ook niet volledig aan (minder vel dan rechtstreeks aan de +5v) met een DC van 254, als ik de switches op 0 of 255 zet gaat het fout.
bv een dc van 255 wordt: 255 x led_on dan 255-255=0 >> decfsz temp = weer 255!!! dus ook weer 255 x led_off!!!

p.s. de jal voorbeeldjes (van de rgbfan) werken niet mooi omdat het fade-to-on efffect niet alleen bij hhet nieuwe ledje dat aan gaat wordt uitgevoerd maar ook bij de leds die al aan stonden. veroorzaakt een lelijk knipper effect

Mijn uiteindelijke doel is (voorlopig) een asm versie te maken van het jal RGBfan progje, dus een voor een 4 rgb-ledjes van alle kleuren te voorzien dus een led cycled doorr alle kleuren, blijft dan op een kleur staan en de volgende led doet hetzelfde totdat alle 4 leds geweest zijn en dan weer opnieuw.

;*************************************************
;test to determine dutycycle/led brightness
;active-low switches on PORT B0-7 via 10K to Vcc
;LED anode + 100ohm on port A0, LED kathode to GND

dutty equ 40h
temp equ 41h
;--- config ---
org 00h
bsf STATUS, RP0 ;switch to bank1
clrf TRISA ;porta as input
movlw h'ff' ;portb as output
movwf TRISB
bcf STATUS, RP0 ;switch to bank0
;--------------
pwm movf PORTB,w
movwf temp
comf temp ;ext-switches active-low, reverse

bsf PORTA,0 ;LED on a0
pwm_on nop
nop ;wait few cycles
decfsz temp
goto pwm_on

movlw h'ff' ;calc off dutycycle= 255 - (dutycycle on)
movwf temp
movf POTB,w
subwf temp,,f ;sub W from temp, rest. in temp

bcf PORTA,0 ;LED off a0
pwm_off nop
nop
decfsz temp
goto pwm_off
goto pwm

end
;*****************************************************
met dit progje moet de dutycycle dus 1-254 zijn ik wil juist 0-255 volledig uit tot aan kunnen regelen.

  • Ibex
  • Registratie: November 2002
  • Laatst online: 11:12

Ibex

^^ met stom.

dus al ik het goed begrijp wil je ongeveer dat laten doen: (elke lijn is een volgende "cyclus")
code:
1
2
3
4
5
6
7
8
9
10
11
    L1 L2 L3
C1  R  R  R
C2  G  R  R
C3  G  G  R
C4  G  G  G
C5  B  G  G
C6  B  B  G
C7  B  B  B
C8  R  B  B
C9  R  R  B
terug naar C1


L1 = Led 1, L2 = Led 2, ...
C1 = Cyclus 1, C2 = Cyclus 2,..

Is het dat wat je bedoeld (eventueel met meerdere led's)?

[ Voor 26% gewijzigd door Ibex op 03-09-2003 19:58 ]

Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be


Verwijderd

Topicstarter
Yep, dit is inderdaad wat ik wil alleen begint het met alles uit, maar dat is een bijzaak, en moeten de LEDs naar de kleur to 'faden' dus bv. langzaam van uit naar rood, en bv. van rood naar blauw waarbij dus rood langzaam minder wordt en blauw omgekeerd evenredig meer.

De PWM (puls width modulation) routine die daarvoor nodig is wil ik bv ook gebruiken om mijn werkkamer, plafond of pc-case LED verlichting traploos te kunnen dimmen. Genoeg toepassing dus, maar dan moet het wel werken. Aan een shift-register achtige functie heb ik dus niet genoeg.

  • Ibex
  • Registratie: November 2002
  • Laatst online: 11:12

Ibex

^^ met stom.

een asm om de kleuren te laten veranderen is niet echt moeilijk om te maken, maar ik zou helaas niet weten hoe ik ze kan laten faden. Anders zal ik morgen eens proberen om de kleuren te laten verspringen (en dus niet faden) en die asm te posten. misschien kan je ze dan zelf laten dimmen.

Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be


Verwijderd

Verwijderd schreef op 03 September 2003 @ 20:16:
De PWM (puls width modulation) routine die daarvoor nodig is wil ik bv ook gebruiken om mijn werkkamer, plafond of pc-case LED verlichting traploos te kunnen dimmen. Genoeg toepassing dus, maar dan moet het wel werken. Aan een shift-register achtige functie heb ik dus niet genoeg.
triaploos is 't nooit als je 't digitaal aanpakt he,
maximaal 255 stapjes...

naar mijn idee moet je gwoon een periode vaststellen van 255 stapjes
binnen die periode heb je dan afhankelijk van je instelling 0 to 255ste deel van de periode de poort hoog

  • Ralpy
  • Registratie: September 2001
  • Laatst online: 16-11 13:53
Ja, volgens mij heb ik die nog wel liggen..
Want ik was eerst met mijn project in ASM begonnen, maar nooit echt afgemaakt, maar al wel werkend volgens mij, ik zal nog wel een keer kijken.

Maargoed.. jal compiled ook naar ASM.. Alleen tis natuurlijk niet zo compact geschreven als dat je het zelf zou schrijven.

Verwijderd

Topicstarter
_AscII_
Dit is inderdaad het principe van PWM en dat is voor mijn ook geen probleem, bestudeer de code maar, deze is echt heel simpel.

Maar wat ik wil is dat de code ook werkt als de dutycycle op 0 of op 255 staat, bv:
<speudo code>
IF dutycycle = o then LED_UIT
ELSEIF dutycycle = 255 then LED_AAN
ELSE start PWM_routine
</speudo code>

Hoe doe je dat met asm code waarin je alleen maar een regel code kan overspringen als een waarde bv nul is :'( ipv twee regels of meer.

Ook moet de PWM routine heel snel/vaak herhaald worden om de ilusie te scheppen dat het vloeiend verloopt, ja ook met maar 255 stapjes.

En de routine heel snel herhalen wordt een probleem als je dan een schakelaartje voor up/down dimming moet testen, dat die b.v. de aan_dutycycle met 1 verhoogt en de off_DC met een verlaagt. De dutycycle is dan in een hartslag op 255 natuurlijk en dat is niet de bedoeling :?

  • Fox2
  • Registratie: Juni 2003
  • Laatst online: 29-06 19:47

Fox2

Spanning!

voor 8-bits PWM moet je continu een teller van 0 t/m 255 laten lopen, en die moet je vergelijken met de gewenste duty-cycle voor elk kanaal. tellertje heb je er dus maar 1 van nodig, duty-cycle waarden per kanaal eentje.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
begin_pwm_loop:
  INCF  counter, f
  TSTF  counter
  SKPZ
  GOTO  counter_not_zero

counter_zero:
  TSTF  duty_red
  SKPZ
  BSF  portx, pinvoorledrood  ; led aan
  TSTF  duty_green
  SKPZ
  BSF  portx, pinvoorledgroen  ; led aan
  TSTF  duty_blue
  SKPZ
  BSF  portx, pinvoorledblauw  ; led aan
  GOTO  end_pwm_loop

counter_not_zero:
  INCF  duty_red, W
  SUBWF  counter, W
  SKPNZ
  BCF  portx, pinvoorledrood

  INCF  duty_green, W
  SUBWF  counter, W
  SKPNZ
  BCF  portx, pinvoorledgroen

  INCF  duty_blue, W
  SUBWF  counter, W
  SKPNZ
  BCF  portx, pinvoorledblauw
end_pwm_loop:

zoiets dus... ik heb het niet getest (zo uit mijn hoofd). Je moet de routine op een regelmatig interval aanroepen (bijvoorbeeld met een timer-interrupt). Jouw waarneming dat het LEDje minder fel brandt, zou kunnen komen doordat hij te snel wordt geschakeld. Zelfs LEDs hebben een (hele korte) opstarttijd nodig.

Faden van de ene naar de andere kleur is niet moeilijk:
code:
1
2
  INCF  duty_green, f
  DECF  duty_red, f

Dit moet je natuurlijk ook met gelijke tussenpozen uitvoeren en je moet even letten of de fade-grenzen al bereikt zijn.

Verwijderd

Topicstarter
Bedankt Fox2 :)
Dit is inderdaad wat ik bedoel....

Maar zou je dit voorbeeld ook naar PIC (16F84A) code kunnen vertalen?
code:
1
2
3
4
5
begin_pwm_loop:
  INCF  counter, f
  TSTF  counter
  SKPZ
  GOTO  counter_not_zero

Dit deel kan ik wel vertalen met:
code:
1
2
3
begin_pwm
   incfsz counter
   goto counter_not_zero


Maar dit wordt al lastiger:
code:
1
2
3
counter_zero:
  TSTF  duty_red
  SKPZ


Zou zoiets hiervoor in de plaats werken?
code:
1
2
3
counter_zero:
   movlw   h'00'
   subwf    duty_red  ;if duty_red=o >> 0-0=0

Maar... hoe skip ik nu over de volgende instructie als duty_red echt 0 is ?
Er zijn alleen maar Bit skip intructies, en daar heb ik niets aan omdat ik het hele byte wil testen.
De skip intructies op byte niveau zijn decfsz en incfsz, deze gaan dus gepaart met het verlagen over verhogen van een register, en ik wil alleen met een JUMP ON ZERO o.i.d.

Bovendien ben ik ook nog niet echt bekend met hoe ik een timer routine moet schrijven. Ik ben namelijk nog niet veel gedaan met een pic maar wil het wel graag leren. In asembler.

Ik heb niets tegen JAL maar die progjes maken vaak/altijd? gebruik van includes (waarin weer includes zitten enz) en dat maakt zo'n programma ondoorgrondelijk.
Ik wil namelijk altijd precies weten hou iets werkt.

Bovendien is het vertalen van JAL naar hex via jal.exe ook nutteloos omdat in die hex-code dan alle includes (en dat zijn vaak veel instructies!) ook geassembleerd zijn en de labels en variablen worden vervangen door cijfers. veel succes met het lezen van die hex code :Z

Aan Ralpy.
Ik zou graag eens jou code willen zien, kan je die alsnog eens posten?

  • Ibex
  • Registratie: November 2002
  • Laatst online: 11:12

Ibex

^^ met stom.

ik zal het asm-bestandje niet meer schrijven, ik heb niet zoveel tijd nu. Maar ik heb vroeger een looplichtje gemaakt (7 ledjes, en het loopt van links naar rechts, naar links, naar rechts,...) Ik zal ff de code uploaden en daarachter de link hier posten :) De asm staat hier en de hex staat hier.

Tis maar dat je er mss iets mee bent he :)

[ Voor 30% gewijzigd door Ibex op 05-09-2003 17:48 ]

Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be


  • maddog_rvo
  • Registratie: November 2000
  • Laatst online: 27-11 16:56
PWM is toch het snel in en uitschakelen van b.v. een led om te laten lijken dat deze minder fel brandt?, is dit ook mogelijk om dit via een pic16F84A te doen voor 12V, zo ja wat heb ik erachter allemaal nodig, het lijkt me nl. niet dat dit via een relais lukt.

Verwijderd

Topicstarter
Aan maddog_rvo

Dit gaat prima met 12v, ook rechtstreek via een PIC,
zelf gebruik ik een PIC16F84A.

Hier b.v .het schema dat ik gebruik om rechtstreeks 8 12V CCfl aan te struren.
De CCFL inverters blijken na meting zo'n 480mA te gebruiken bij 12v.

Afbeeldingslocatie: http://www.photons.nl/ccfl_circuit.jpg

Rb= 480 ohm, T1=BD139, dit schema per CCFL gebruiken.

Hier een voorbeeld filmpje van het resultaat

p.s. het toepassen van PWM op CCFL geeft vaak niet het gewenste dim resultaat, maar andere, interressante effecten zoals half oplichtende buisjes, of lichtte kleur verandering.

Dat laatste kan ook aan mijn ogen liggen, ik test deze opstellingen namelijk altijd in het donker 8)7

Verwijderd

Dan maar hopen dat de hfe van die BD139 groot genoeg is..

Verwijderd

Topicstarter
offtopic:
Valt niets te hopen, datasheet lezen ;)

Bovendien worden de torretjes niet eens warm, zelfs niet bij uren continue gebruik.
En de invertortjes krijg braaf hun 480 mA >:)

p.s. please stay on topic :+


Kan iemand de code van Fox2 omzetten in een werkende code voor de PIC16F84A
Fox2 heeft het principe uitstekend duidelijk gemaakt alleen is de uitvoering ervan bij mij nog niet helemaal helder.

Zodra ik de PWM routine en de aanroep timer/interrupt routine werkend heb zal ik deze hier posten zodat die door iedereen kan worden gebruikt voor z'n asm. bibliotheek.

Altijd handig. :)

[ Voor 57% gewijzigd door Verwijderd op 06-09-2003 15:24 ]


Verwijderd

Als jij de datasheet had gelezen dan had je geweten dat de hfe van een BD139 vanaf 25 is en dan krijgen ze met je voorschakelweerstandje van 470 Ohm niet hun 480mA.

Verwijderd

Topicstarter
offtopic:
Nogmaals, de invertors werken, heb het gemeten.
Zie het filmpje voor het resultaat, misschien zijn mijn acht BD139 dan defect?

Of ik heb de verkeerde sheet gelezen - ik zal het nog eens nalezen :) -
maar dit doet er werkelijk niet toe in deze post :'(
Degene die het niet met mijn eens zijn mogen wat mijn betreft een tweede tor toevoegen of een zwaardere gebruiken, bij mij werkt het.... en al heel lang.


Het gaat hier om de software, daar heeft iedereen iets aan.

[ Voor 6% gewijzigd door Verwijderd op 06-09-2003 15:35 ]


Verwijderd

Ik vind je vrij brutaal voor iemand met 12 posts.
Bovendien begin je zelf over de hardware, ik niet.

  • m-m
  • Registratie: Augustus 2001
  • Niet online

m-m

exter en species_8472, chill ff ;)

en iemands postcount zeg niets over iemands kennis.

Verwijderd

Nee, maar z'n schema's wel...
.

[ Voor 49% gewijzigd door Verwijderd op 06-09-2003 16:43 ]


Verwijderd

Topicstarter
Beste exter

Ik ben alles behalve brutaal, zo'n reply vindt ik dus niet passen in zo'n forum.
Het gaat hier om kennis delen voor zowel beginners als gevorden. Dus als jij je kennis zo hoog inschat geef dan antwoord op mijn originele vraag, en val niet iemand aan, over zijn of haar kennis, zelfs niet als je gelijk mocht hebben.

Om deze nodeloze discusie nu stop te zetten zal ik kort, het schema uiteen zetten zoals ik het bedacht had, ook al is het lang geleden dat ik dit gebruikte, en enigzins offtopic.

De Hfe van een BD139 is alleen 25 bij een Ic van 500mA, als je gaat meten dan ligt de Hfe rond voor een Ic van 480mA hoger. Ik nam een Hfe van 30 en kwam daarmee op een Ib van 16mA.

Iets waar een PIC16F84A geen moeite heeft. Bij deze waarde hoort een Basisweerstand van ongeveer 268 ohm. Vervolgens ben ik deze langzaam gaan verhogen omdat de invertor niet een voledige 480mA nodig heeft om de CCFL voledig aan te sturen.

Om een lang verhaal kort te maken, kwam ik op 470 ohm uit waarbij de CCFL nog volledig oplicht. Vandaar.... Bovendien werkt het prima in de praktijk :)

Tot zo ver mijn, beginners, kennis.

Mijn excusses aan Exter voor eventuele misopvattingen, het schema toont namelijk alleen het end resultaat, en dat is geen 480mA bij een Hfe 25 natuurlijk.
De 480mA is alleen wat de invertor direct aan de 12V, zou verbruiken.

p.s. PMW voor LED door PICs blijft een Interessant topic dus als iemand hier nog ASM. code voor heeft.....

[ Voor 8% gewijzigd door Verwijderd op 06-09-2003 18:45 ]


  • maddog_rvo
  • Registratie: November 2000
  • Laatst online: 27-11 16:56
Verwijderd schreef op 06 September 2003 @ 13:40:
Aan maddog_rvo

Dit gaat prima met 12v, ook rechtstreek via een PIC,
zelf gebruik ik een PIC16F84A.
....
blabla ;)
Thnx, ik heb het nu geprobeert met een ULN2003 en dat werkte dus niet :P
daarna met een pic en die trok het wel, ga ik weer ff lekker stuntelen :) (die uln2003 probeerde ik rechtstreeks de pic via jouw schema)

[ Voor 11% gewijzigd door maddog_rvo op 06-09-2003 18:50 ]


  • Winnetou
  • Registratie: September 2002
  • Niet online
Eey (beetje offtopic misschien) maar ik heb ook die PIC16F84A maar krijg hem niet geprogrammeerd. Kan een van jullie misschien vertellen hoe je die pic (hardwarematig) geprogrammeerd krijgt. Ik blijf errors op data-adres 0000h krijgen ;-(

Die folgende Sendung ist für Zuschauer unter sechzehn Jahre nicht geeignet


Verwijderd

Topicstarter
Zelf gebruik ik het schema en de software van de tutorial, werkt perfect.
Echter heb ik gemerkt dat de programmer niet met elke com port werkt,
probeer eens wat andere com poorten, van andere pc natuurlijk.

Dit is mijn prototype programmer, van de tutorial:

Afbeeldingslocatie: http://www.photons.nl/prog_frt.jpg
Afbeeldingslocatie: http://www.photons.nl/prog_bck.jpg

Verder gebruik ik icprog 1,05a voor het branden.

Ook plaatst ik deze regels bovenin de code:
code:
1
2
3
include "p16f84a.inc"   
__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
errorlevel  -302        ;suppress bank warnings

Deze code zet de fuses PWRT=on, Oscilator=XT (XT is 4 MHz kristal)

Misschien heb je hier wat aan :)

[ Voor 12% gewijzigd door Verwijderd op 06-09-2003 23:58 ]


  • Winnetou
  • Registratie: September 2002
  • Niet online
Is dat dit schema?

Afbeeldingslocatie: http://www.circuitsonline.net/circuits/sch/000091.gif

Die folgende Sendung ist für Zuschauer unter sechzehn Jahre nicht geeignet


  • Ibex
  • Registratie: November 2002
  • Laatst online: 11:12

Ibex

^^ met stom.

alwinh schreef op 06 September 2003 @ 20:25:
Eey (beetje offtopic misschien) maar ik heb ook die PIC16F84A maar krijg hem niet geprogrammeerd. Kan een van jullie misschien vertellen hoe je die pic (hardwarematig) geprogrammeerd krijgt. Ik blijf errors op data-adres 0000h krijgen ;-(
Heb je misschien toevallig windows XP? Anders, lees even de reactie van mij op Fancontroller met een Microcontroller (4 fans + display) , daar staat hoe ik die fout heb verholpen (de post met de screenshots)

Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be


  • Winnetou
  • Registratie: September 2002
  • Niet online
Ik heb windows xp ja. Ik had de driver al enabled zodat ik die foutmelding bij het opstarten niet meer krijg.
Helaas lukt het programmeren van de chip nog steeds niet. Ik blijf de foutmelding Programming failed at Code address 0000h krijgen. Dat is inderdaad dezelfde foutmelding als die je krijgt als de chip helemaal niet aangesloten is. Wat zou het nog meer kunnen zijn :?

/edit
Vanaf welke kant is eigenlijk die db9 connector bedoeld, er staat bij 1 t/m 9 maar is dat de nummering die op de connector gebruikt wordt of is het een vooraanzicht waarbij 1=9 en 9=1 etc. ?
Hm ik geloof toch gewoon de nummers die op de connector aangegeven staan.

[ Voor 29% gewijzigd door Winnetou op 07-09-2003 13:15 ]

Die folgende Sendung ist für Zuschauer unter sechzehn Jahre nicht geeignet


Verwijderd

Topicstarter
Hier is een iets meer gedetailleerde weergave van het ontwerp.

Afbeeldingslocatie: http://www.photons.nl/circuit_prog.jpg
fear mij mad notepad en ms-paint skills >:)
De connector in de tekening is de soldeerzijde van de connector.
Als je recht tegen de voorzijde van de connector zou kijken dan zie je dat deze genummerd is, van rechtsboven met 1 tot linksonder met 9

Misschien handig om de prototype-boven en onderzijde foto's plus bovenstaande foto, op te nemen in de tutorial. Dit kan een hoop vergissingen voorkomen.

En geeft tevens een idee hoe je deze kunt bouwen zonder een printje te hoeven etsen. (wat wel aan te raden is, overigens)

  • Winnetou
  • Registratie: September 2002
  • Niet online
Je schakeling ziet er vrij netjes uit, maar het is lastig precies te zien wat de onderkant en hetzelfde deel aan de onderkant is en wat nou precies met elkaar verbonden is. Nouja, ik neem aan dat het hetzelfde is als het schema :)

Volgens mij werkt ie bij mij nou ook :) Dank voor de hulp.

[ Voor 49% gewijzigd door Winnetou op 07-09-2003 16:30 ]

Die folgende Sendung ist für Zuschauer unter sechzehn Jahre nicht geeignet


Verwijderd

Topicstarter
maar het is lastig precies te zien wat de onderkant en hetzelfde deel aan de onderkant is en wat nou precies met elkaar verbonden is
Ja dat is inderdaad lastig te zien, maar het is precies zoals in het schema.

Het is echter mijn ervaring dat juist hele simpele schema's niet werken omdat je iest over het hoofd ziet, misschien de zener diode verkeerd om? Een zener gebruik je immers 'verkeerd' om, ten opzichte van een gewone diode.

De software werkt bij mijn op Win9x, W2k en WinXP prima, echter maar op een enkele PC! Op andere PC's van mijn doet die het niet op de com-poorten. Zal iets te maken hebben met verschil in de seriele spanningen van die poort.

Ik zal wat later wel een layout tekening maken zoals ik de opstelling heb op mijn testprintje, compleet met de orientatie van de onderdelen. Kan je die gewoon nabouwen. Dan weet je zeker dat de hardware klopt.

Bovendien werkt dit schema zonder externe voeding, is heel goed(koop) en kan ook de opvolger van de PIC16F84A programmeren. Voorlopig koop ik dus geen proffessionele programmer.

Pas als ik Bastiaans volledige LED voorraad heb opgekocht wordt het interessant om zwaardere PICs te gebruiken :)

  • Fox2
  • Registratie: Juni 2003
  • Laatst online: 29-06 19:47

Fox2

Spanning!

Verwijderd schreef op 05 september 2003 @ 17:01:
Maar zou je dit voorbeeld ook naar PIC (16F84A) code kunnen vertalen?
code:
1
2
3
counter_zero:
  TSTF  duty_red
  SKPZ

Zou zoiets hiervoor in de plaats werken?
code:
1
2
3
counter_zero:
   movlw   h'00'
   subwf    duty_red  ;if duty_red=o >> 0-0=0

Maar... hoe skip ik nu over de volgende instructie als duty_red echt 0 is ?
Er zijn alleen maar Bit skip intructies, en daar heb ik niets aan omdat ik het hele byte wil testen.
De skip intructies op byte niveau zijn decfsz en incfsz, deze gaan dus gepaart met het verlagen over verhogen van een register, en ik wil alleen met een JUMP ON ZERO o.i.d.

Bovendien ben ik ook nog niet echt bekend met hoe ik een timer routine moet schrijven. Ik ben namelijk nog niet veel gedaan met een pic maar wil het wel graag leren. In asembler.
Ik ben niet echt bekend met de 16F8x, ik heb alleen maar met de 16C5x, 16C7x en 16C77x gewerkt.

Ik zou zeggen, lees de Microchip documentatie (bijvoorbeeld http://www.microchip.com/...s/devices/16f84/index.htm of de PIC-controller reference manual o.i.d.) eens door, vooral de hoofdstukken over de ALU en de interrupts/timers. In die laatste kun je vinden hoe je timers kunt gebruiken om een bepaald stuk code met een regelmaat uit te laten voeren.

De ALU beschikt over een STATUS-register, die na elke ALU-operatie wordt geupdate. Hierin zit bijvoorbeeld ook het ZERO-bit, die aangeeft of het resultaat van de laatste ALU-bewerking nul is.

Het 'TSTF' in mijn stukje code doet (qua functionaliteit) weinig anders dan:
code:
1
2
3
MOVFW  duty_red  ; bij MOV wordt het status-byte niet bijgewerkt
ADDLW  0, W  ; dus voer je een behoorlijk loze berekening uit
  ; om dat alsnog te doen...

Als nu het ZERO-bit geset is, weet je dat duty_red nul was...

SKPZ is een compiler-alias-achtig-iets. De resulterende code is identiek aan die van:
code:
1
BTFSS  STATUS, Z  ; test zero bit

De controller krijgt die hele SKPZ instructie dus niet eens te zien, deze wordt door de compiler al omgezet in bovenstaande. Je hebt dus best kans dat SKPZ ook in jouw geval wel werkt, hij staat alleen niet bij de standaard instructieset.

Uit mijn hoofd: volgens mij kun je in MPLAB (ik neem aan dat je dat gebruikt) help krijgen over de assembler- & compiler directives. Hier ergens staan alle instructies en alias'en. De documentatie is alleen niet zo overzichtelijk...

[ Voor 4% gewijzigd door Fox2 op 08-09-2003 14:53 . Reden: layout was om zeep door te lange code-regels ]


Verwijderd

Topicstarter
Thanks, Fox2

Het een en ander is mij nu duidelijk na het bestuderen van de timer/interrupt hoofdstukken. _/-\o_

Hiervoor had ik alleen met de Z80 en soort gelijke gewerkt en deze hebben een heel andere mnemonic set, en zo'n 148 instructies :) i.p.v. 35..

Ik zal eens aan je code sleutelen..... moet toch lukken om deze naar de PIC16F84A te vertalen.
time to burn the midnight oil
Ik zal de listings posten als het lukt om de routines werkend te krijgen 8)7

  • Fox2
  • Registratie: Juni 2003
  • Laatst online: 29-06 19:47

Fox2

Spanning!

Dat noemen ze RISC: Reduced Instruction Set Controllers...
Pagina: 1