Всичко свързано с тоците ми е слабост, опитайте се да ме затрудните.
horgasz - специалист
Sub^Zero, виж тук: http://forum.allaboutcircuits.com/showt ... hp?t=27230, но трябва да се регистрираш за да видиш кода на човека с твоя проект.
Успех
NeoBoss - специалист
еми значи аз съм студент индустриален мениджмънт и винаги съм изучвал само икономика. Миналата година исках да направя контролер за rgb ленти който неможах да намеря на пазара затова реших да си го направя сам. с минимални познания по C++ и със един пик контролер успоях да го направя за 2 месеца през свободното си време.

Жалко че не останаха хора които да си защитават диломите сами. Пусни си някъде другате демата във форум за програмиране като не търсиш съжаление а покажеш желание да научиш и разбереш това което искаш да направиш. Тогава доста хора ще ти помогнат.

като цяло работата не ти е толкова много да настроиш два пина (до колкото видях на примера) единия HI. LO за посоката и другия PWM за скороста.
ето ти PWM На асаблер за тоя пик
http://www.pages.drexel.edu/~kws23/tuto ... M/PWM.html

предполагам щом си си искарал изпитите с учене не с препизване езика ще ти е познат и ще ти е от ползва . На мен лично асаблера ми е пълна мъгла :lol:
ganevson - специалист
SuB^ZerO написа:
Здравейте всички разбиращи и не чак толкова разбиращи (като мен) от микроконтролери съфорумници. Студент съм и ми е възложен курсов проект на тема "контролиране на електродвигател чрез микроконтролер PIC16F84A. Естествено се досещате че щом пиша тук съм срещнал трудности с изпълнението му, а ето и с повече подробности.

Схемата която избрах е подходяща за обикновен електродвигател ( а не стъпков или серво ) и е по-подробно описана тук : http://www.instructables.com/id/Super-E ... -Arduino-/
Целта ми е да направя така че моторчето да се движи в едната посока, след което в другата и да променя скоростта си на въртене по предварително зададен начин. Английският ми не е на много добро ниво, но до колкото разбрах от форумите в които влизах, трябва да използвам PWM за програмното регулиране на скоростта. На експериментална платка осъществих схемата от линка по-горе, като свързах "enable pin" към пин 1 на порт Б и "direction pin" към пин 2 пак на порт Б на микроконтролера.

Моля някой разбиращ от асемблер и микроконтролери да ми напише програмата която е дадена в линка така че да е подходяща за PIC16F84A.

Предварително благодаря на тези които опитат да помогнат


Май мястото на темата не е тук , а в "Електроника и схеми" но късно видях. Моля модераторите да я преместят. Sorry #-o
Мисля че трябва да се обърнеш за помощ в друг форум където се разглеждат предимно въпроси в сверата на електрониката.Аз също съм електрончик ,но стигни до някъде сам със заданието си и когато стигнеш до задънена улица или многопосочно кръстовище, ползвай жокера на форумите.
MrMurdjo - майстор
PIC16F84 няма вградена ШИМ функция (на български на PWM му викат ШИМ). Не че не може да се реализира чисто софтуерно, но си е доста повече напън.
Проектът, който е взел за модел, е на "Ардуино", т.е. Атмелски микроконтролер, например с ATMEGA8, който си има вградени функции за ШИМ и реализацията е елементарна. Тия дни даже точно с това се занимавах - да регулирам силата на светене на светодиоди.
Колкото до това кой колко е научил - винаги съм смятал, че официалното образование в учебно заведение не може да ти даде всичко, но задължително трябва да ти даде основа и ориентация - да знаеш какво ти е нужно и къде да го намериш в литературата. Другото е въпрос на постоянство и самообразоване. Защото материята е необхватна.
На днешно време, с наличието на интернет, просто не бих повярвал, ако някой ми каже, че няма информация.

Развойната среда на Атмел е безплатна. Към нея се закачва WinAvr, който е безплатен и с отворен код. В резултат има развойна среда не само на асемблер, но и на С.
Както казват колегите, нека видим положени усилия от питащия, нека видим някакъв замисъл, вероятно ще помогнем. Дори съм готов да му спретна една проста развойна платка с Атмега за без пари.

Но да ми иска някой наготово да му завърша образованието, няма да стане.
Единият ми син е програмист. Знам как учеше, знам колко знае. Знам също и колко багаж имат под шапката и доста негови колеги, които също се водят инженери, защото се налага да ги учи на елементарни неща в местоработата му.
a_anastassov - специалист
MrMurdjo написа:
Но да ми иска някой наготово да му завърша образованието, няма да стане.
Колега MrMurdjo,
Съгласен съм с Вас на 100%, но при условие, че програмирането Е е основен предмет на изучаване на SuB^ZerO. Когато бях студент изучавахме много неща за "обща култура" (като програмист разглеждам и този вариант) - за това предложих да се напише програма с умишлена грешка. Ако ще се дипломира като програмист той трябва да се потруди и да я открие.
MrMurdjo - майстор
Чакай малко.
Гедже мидир я да бен гьормийорум - ти това би трябвало да го разбереш :)

Нещо аз ли не схващам. Как ще се захваща с курсов проект с микроконтролер, ако не е е залегнало в учебната програма и като крайна цел не е предвидено да добие основни познания за логически схеми и техните електрически параматри, за принципната архитектура на един процесор и начина му на работа?
Това все едно филолог да положи изпит по изобразително изкуство.
Моля някой разбиращ от асемблер и микроконтролери да ми напише програмата която е дадена в линка така че да е подходяща за PIC16F84A.
Много моля да ме извини питащия, защото е докачлив, но само това изречение е достатъчно да покаже, че си няма хал хабер за какво става дума. Не е казал нито каква специалност, нито къде учи. Но ако пък от учебното заведение са му дали задание, което не отговаря на профила и учебната програма, просто нямам думи.
Защото ако с Атмел нещата са относително прости (зареждаш контролни регистри, пускаш таймера и на изходящото краче получаваш импулси с даден коефициент на запълване), то да го направиш на PIC16F84, иска даже малко повече от елементарно програмиране на асемблер, той има един единствен простичък таймер и за постигане на променлив коефициент на запълване трябва да се работи през прекъсване, обработка на прекъсването с евентуална промяна на началното състояние на брояча.
SuB^ZerO - специалист
horgasz написа:
Sub^Zero, виж тук: http://forum.allaboutcircuits.com/showt ... hp?t=27230, но трябва да се регистрираш за да видиш кода на човека с твоя проект.
Успех
horfasz предполагам, че точно това ми трябва , но за жалост не ми излиза никъде кодът на програмата на "PIC GUY TREVOR" въпреки, че се регистрирах ... или той го е премахнал или трябва да имам по-голям стаж в този форум за да ми излезе ... случайно да си го запазил ? Благодаря съм ти благодарен за помощта
SuB^ZerO - специалист
Постигнах голям напредък , но имам и голям проблем ... целта на програмата е следната :
1.моторчето се върти по часовниковата стрелка за определено време със скорост 100%
2.пауза
3.моторчето се върти по часовниковата стрелка за определено време със скорост 50%
4.пауза
5.моторчето се върти обратно на часовниковата стрелка за определено време със скорост 100%
6.пауза
7.моторчето се върти обратно на часовниковата стрелка за определено време със скорост 50%
8.пауза
9. всичко от начало се повтаря до безкрай

а ето и какво се получава при мен:

1.моторчето се върти по часовниковата стрелка за определено време със скорост 100%
2.пауза
3.моторчето се върти по часовниковата стрелка за определено време със скорост 50% и програмата не продължава напред ...

Намалянето на скоростта постигам със софтуерен ШИМ (PWM), и по пътят на логиката проблема на програмата ми е в броячът ("cou") който трябва да отчете кога подпрограмата за ШИМ ("pwmf50") да прехвърли управлението на главната програма - main.
Ще може ли някой да помогне ?
Ето и кодът (на пръв поглед изглежда сложен заради размерът му но всъщност има две подпрограми които се дублират/с разлика в стойностите/ и една главна програма - main):

list p=16F84A
#include <p16F84A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

w EQU 0
f EQU 1
Counter EQU H'0C'
c equ 0
portb equ 0x06 ; port b equate
duty equ 0x0c ; length of duty cycle
temp equ 0x0d ; length of duty cycle
cou set d'100'


ORG H'0000'
goto start

start bsf STATUS,RP0
movlw B'11010111'
movwf OPTION_REG
bcf STATUS,RP0
clrf PORTB
bsf STATUS,RP0
movlw B'11111000'
movwf TRISB
bcf STATUS,RP0
goto main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;deley for the pause between subroutines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WaitP movlw D'30'
movwf Counter
clrf TMR0
againP bcf INTCON,T0IF
loopP btfss INTCON,T0IF
goto loopP
decfsz Counter,f
goto againP
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;delay for the time of Action on pwm100b and pwm100f
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WaitA movlw D'70'
movwf Counter
clrf TMR0
againA bcf INTCON,T0IF
loopA btfss INTCON,T0IF
goto loopA
decfsz Counter,f
goto againA
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;pwm 50% forward
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pwm50f movlw d'0'
movwf portb
movlw d'90' ; Duty cycle length
movwf duty
movf duty,w
movwf temp
bsf portb,0
bsf portb,1
pwma50f nop
nop
nop
decfsz temp
goto pwma50f
movlw d'255'
movwf temp
movf duty,w
subwf temp,f
bcf portb,0
bcf portb,1

pwmb50f nop
nop
nop
decfsz temp
goto pwmb50f
bcf INTCON,T0IF
btfss INTCON,T0IF
goto pwm50f
decfsz cou
clrf TMR0
return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;pwm 50% backward
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pwm50b movlw d'0'
movwf portb
movlw d'90' ; Duty cycle length
movwf duty
movf duty,w
movwf temp
bsf portb,0
bsf portb,1
bsf portb,2
pwma50b nop
nop
nop
decfsz temp
goto pwma50b
movlw d'255'
movwf temp
movf duty,w
subwf temp,f
bcf portb,0
bcf portb,1
bcf portb,2

pwmb50b nop
nop
nop
decfsz temp
goto pwmb50b
bcf INTCON,T0IF
btfss INTCON,T0IF
goto pwm50b
decfsz cou
clrf TMR0
return





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;pwm 100% forward
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pwm100f bsf portb,0
bsf portb,1
call WaitA
bcf portb,0
bcf portb,1
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;pwm 100% backward
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pwm100b bsf portb,0
bsf portb,1
bsf portb,2
call WaitA
bcf portb,0
bcf portb,1
bcf portb,2
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main call pwm100f
call WaitA
call pwm50f
call WaitP
call pwm100b
call WaitA
call pwm50b
call WaitP
goto main

END
lenko71 - специалист
Това има смисъл:

Код: Избери всички

againP bcf INTCON,T0IF
loopP btfss INTCON,T0IF
goto loopP
но оттук няма как да прескочи goto...:

Код: Избери всички

bcf INTCON,T0IF
btfss INTCON,T0IF
goto pwm50b
---------------
както и оттук:

Код: Избери всички

bcf INTCON,T0IF
btfss INTCON,T0IF
goto pwm50f
----------------
В първия случай нулираш флага, след което изчакваш да се превърти брояча като постоянно проверяваш флага. В другите два случая обаче, след като нулираш флага скачаш другаде.
Не съм се задълбочавал подробно в алгоритъма като цяло , но засега това е проблема.
SuB^ZerO - специалист
btfss би трябвало да прескочи следващата инструкция ако бит T0IF е "1" т.е. да прескочи goto pwm50f i pwm50b .... (поне така пише в книгата от която чета) Ако това не е вярно би ли предложил вариант в който да изляза от този затворен цикъл - pwm50f - goto pwm50f Другият въпрос е това ли е единственият начин да се излезе от него .... опитах с директиви if-elseif-endif , но нещо не ми се получи .... Някакви идеи ?

Тема "Моля за помощ PIC16F84A (Микроконтролери и асемблер)" | Включи се в дискусията:


Сподели форума:

Бъди информиран. Следвай "Направи сам" във Facebook:

Намери изпълнител и вдъхновения за дома. Следвай MaistorPlus във Facebook: