dag iedereen.
Kan er mij iemand uitleggen hoe ik een D/A conversie moet doen met een pic(16f876)
Deze instelling heb ik al gevonden maar als ik simuleer zie ik niks van verschil.
MOVLW B'10001110'
MOVWF ADCON1
BCF STATUS,RP0
MOVLW B'00000101'
MOVWF ADCON0
BSF ADCON0,GO
loop
BTFSC ADCON0,GO
GOTO start
MOVWF ADRESL
END
ZEG me aub wat ik fout doe.
Ik zou zo snel mogelijk ee oplossing moeten hebben want mijn mentor voor mijn eindwerk is aan het zagen.
toepassing:dit moet toegepast worden op een snelheidsregeling met een pot op mijn pic voor motoren.
dank u allemaal en help aub.
als ik het goed bergrijp wil je je programma laten wachten totdat de ad conversie klaar is en doe je dit met de volgende code:
BTFSC ADCON0,GO
GOTO start
hier springt het programma terug naar start en ik denk dat je hem dan weer opnieuw initialiseert wat niet nodig is, volgens mij kun je daar gewoon invullen GOTO loop
daarna wil je de waarde van het analoge singaal weten en daar heb je staan:
MOVWF ADRESL
oftwel zet W in ADRESL dit moet dan zijn MOVFW ADRESL
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
De PIC16F876A (PIC16F876 wordt volgens mij niet meer gemaakt) heeft geen D/A converter, je zult waarschijnlijk PWM moeten gebruiken... (Of bedoel je soms A/D converter?)
Bart Hiddink
Bart Hiddink is Ideetron; electronics and projects, http://www.ideetron.nl. LoRaWAN Nutcase.
Met de simulator wordt het lastig:
"MPLAB SIM only simulates to the register level, not the pin level, e.g., RB0 represents the value in bit0 of the PORTB register, not the value on the pin named RB0. This makes sense as the simulator is a software model, and not actual device hardware. In general, bit/pin binary values are interchangeable.
However, A/D operation requires that the corresponding port register read '0', which may be different from what would be on an actual pin. This can impact the operation of ADC and comparators. Please see the Peripheral section for more on how these are simulated."
Leesvoer:
http://ww1.microchip.com/downloads/en/DeviceDoc/51519B.pdf
En bedenk dan nog even hoe je een analoog signaal als stimulus zou moeten geven.
dank u voor de replies
en nu is mijn vraag dus als ik A/D binnenlees met een potmeter wat moet ik dan schrijven in mijn programma dat de pic weet dat hij naar een bepaald deel moet gaan van het programma waar ik vb pwm maak?
als iemand wil kan je mij een voorbeeld doorsturen van jezelf in assembler taal
zeer graag bedankt.
mail adress: in je profiel
[Bericht gewijzigd door Henry S. op (3%)]
wel je zal wel een A/D bedoelen.
Kijk eens in de datasheet daar staat een voorbeeld in. bestuur dat eens en probreer eens te simuleren in PIC SIMULATER IDE.
Bart Hiddink
Bart Hiddink is Ideetron; electronics and projects, http://www.ideetron.nl. LoRaWAN Nutcase.
Je opdracht is dus om een PWM signaal op te wekken die een relatie heeft met de stand van een potmeter.
Het PWM signaal moet een ruitenwissermotor aansturen en met de potmeter kun je dan de snelheid van de motor regelen.
Heb je alleen de MPLAB IDE die je voor deze opdracht kunt gebruiken?
Geen oefenbordje?
Hoeveel ervaring heb je met het programmeren in PIC assembler?
ik kan wel met drukknoppen werken enzo ma A/D conversie is al moeilijker en ja op school hebben we een oefenbordje om het uit te testen.ik programeer hem dan en dan zet ik dit in een bredbordje ofzo.
nog een vraag.
dit heb ik nu
BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
start MOVLW B'10001110'
MOVWF ADCON1
BCF STATUS,RP0
MOVLW B'00000101'
MOVWF ADCON0
BSF ADCON0,GO
loop NOP
BTFSC ADCON0,GO
GOTO loop
MOVF ADRESL
MOVF ADRESL,W
MOVWF PORTB
END
Dus ik simuleer het en wat gebeurt er nu.
ik stuur mijn ingelzen waarde van die adcon0 naar ADRESL en dan stuur ik die file naar working register (die waarde dus) en dan wan working register naar portB.
probleem: als ik die file naar W reg stuur dan komt dat daar niet toe.Hoe komt dit??
help aub
Het register 'ADRESL' staat in bank1. Dus je moet eerst naar bank1 gaan voor je hem uitleest.
Verder is deze instructie 'MOVF ADRESL' ongeldig en nutteloos, dus die kan weg.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Je stuurt geen waarde van ADCON0 naar ADRESL...
MOVF ADRESL (Is dus eigenlijk MOVF, ADRESL,f) doet niets, behalve de Zero-flag updaten...
Je bedoelt waarschijnlijk MOVWF ADRESL...
(Waarom zou je in hemelsnaam de inhoud van ADCON0 naar ADRESL willen schrijven???)
Bart Hiddink
Bart Hiddink is Ideetron; electronics and projects, http://www.ideetron.nl. LoRaWAN Nutcase.
MOVF ADRESL
MOVF ADRESL,W
MOVWF PORTB
De eerste, daarmee laad je de waarde uit ADRESL en stopt die weer in ADRESL.
Die instructie is alleen bruikbaar om de Z flag te testen.
Verder doet die instructie niets.
De tweede instructie haalt de waarde uit ADRESL en stopt die in het W register.
Dan stop je met de laatste instructie de waarde van het W register in PORTB.
Het moet dus werken ondanks de eerste, zinloze instructie.
Als je geen verandering ziet als je in de simulator naar je W-reg kijkt, dan kan dat komen omdat de waarde niet veranderd.
De waarde blijft dan zwart.
Ik moet vermoeden dat het wel werkt, maar dat je het niet kunt simuleren in MPLAB.
Je zult het dus echt moeten testen.
ok dank je wel iedereen maar kan iemand mij dan een snel voorbeeld tonen van hoe het wel moet?
ooo wacht is kunt ge de inhoud van ADCON0 direct naar PORTB sturen?
nee het gaat niet kem het gesimuleert
BSF STATUS,RP0
MOVFW ADRESL
MOVWF PORTB
NU heb ik dit maar het resultaat kan ik nu in het working register steken maar hij wil niet op de uitgang komen dus raar iemand??
[Bericht gewijzigd door Henry S. op (29%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
NU heb ik dit maar het resultaat kan ik nu in het working register steken maar hij wil niet op de uitgang komen dus raar iemand??
ADRESL is in bank1, PORTB in bank0. (Valt het kwartje?...
)
aja dank u ik had het al ze sorry
Nu hebbek een opdracht gekregen van men mentor en ik moet dus met een pot meter een looplicht laten gaan dus op 8 leds.
nu hebbek al veel geprobeert zols dit vb:
control BSF ADCON0,GO
loop NOP
BTFSC ADCON0,GO
GOTO loop
BSF STATUS,RP0
MOVF ADRESL,W
BCF STATUS,RP0
MOVWF 20h ; verplaats a/d resultaat naar een adres waar je het dan zult delen
;GOTO pauze
BSF STATUS,RP0
een1 BTFSC ADRESL,00
GOTO een
twee1 BTFSC ADRESL,01
GOTO twee
drie1 BTFSC ADRESL,02
GOTO drie
vier1 BTFSC ADRESL,03
GOTO vier
vijf1 BTFSC ADRESL,04
GOTO vijf
zes1 BTFSC ADRESL,05
GOTO zes
zeven1 BTFSC ADRESL,06
GOTO zeven
acht1 BTFSC ADRESL,07
GOTO acht
GOTO control
een MOVLW B'00000001'
BCF STATUS,RP0
MOVWF PORTB
GOTO een1
twee MOVLW B'00000010'
BCF STATUS,RP0
MOVWF PORTB
GOTO twee1
drie MOVLW B'00000100'
BCF STATUS,RP0
MOVWF PORTB
GOTO drie1
vier MOVLW B'00001000'
BCF STATUS,RP0
MOVWF PORTB
GOTO vier1
vijf MOVLW B'00010000'
BCF STATUS,RP0
MOVWF PORTB
GOTO vijf1
zes MOVLW B'00100000'
BCF STATUS,RP0
MOVWF PORTB
GOTO zes1
zeven MOVLW B'01000000'
BCF STATUS,RP0
MOVWF PORTB
GOTO zeven1
acht MOVLW B'10000000'
BCF STATUS,RP0
MOVWF PORTB
GOTO acht1
Maar het probleem is nu als ik vbeeld getal nummer 5 binnenlees dan is dit in binair B'00000101' maar dan gaat hij zien dat bit nul ook is geactiveert.
daarmee weet daar iemand iets op?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ik heb de bovenstaande codebrij eens bekeken, maar wat moet 't eigenlijk exact doen? (Kan er niet veel van maken)
Er zitten trouwens eindeloze loops in waar je nooit meer uitkomt...
Dit is een looplicht eigenlijk dus als ik aan de pot meter draai die aan de pic hangt gaat naarmatede stand van de pot het looplicht verder en verder ik heb nu maar acht leds aan de uitgang dus ik zou iets moeten hebben dat je kan zeggen van ,je weet dat het opgesplits word in 1024
dus dat delen door acht =128
0 tot en met 128 is dan led een doen oplichten
128 tot 256 is led twee doen oplichten
zo iets achtigs zo moeten werken maar de vraag is hoe programeer je dit?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Met adresl alleen kun je natuurlijk nooit 1024 bits krijgen...
Gewoon a/d instelling op left-justify zetten en adresh gebruiken. Ik neem in onderstaande code aan dat alles zich in bank 0 afspeelt...
banksel count ;Juiste bank
movlw d'8' ;8 bits
movwf count ;
loop movlw d'32' ;32 bit per stap
subwf adresh,w ;
rrf temp,f ;Reultaat carry naar temp
decfsz count ;Allemaal gedaan?
goto loop ;Nee
movlw 0xFF ;Complement het resultaat
xorwf temp,w ;
movwf portb ;en schrijf naar port b
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ja... (Een keer is genoeg...)
banksel adreshis trouwens een stuk duidelijker, en je hoeft ook niet na te denken over welke bank je moet hebben...
En als je dan de data uit adresh wilt verplaatsen naar een adres. Is het dan zo goed?
banksel adresh
movf adresh
movwf 20h
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ja, omdat 20h ook in bank 0 ligt. Overigens beter nooit een geheugenplaats alleen met een adres aanduiden. Geef er een naam aan. Het kost niets en zonder wordt de code een chaotische boel waar je na een jaar geen bal meer van snapt...
MOVF ADRESH moet trouwens nog een destination achter. (MOVF ADRESH, W of MOVF ADRESH,F)
aja oké want ik ad nog steeds het probleem dat mijn data van adresh en adresl nooit goed werden ingelezen bij mijn project.
zie http://www.circuitsonline.net/forum/view/56147/1/ADC+PIC
Alvast van harte bedankt voor de info!