| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Въпрос за MikroC? http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=3860 |
Страница 1 от 1 |
| Автор: | milenjs [ Пон Мар 12, 2007 4:27 pm ] | |||||||||
| Заглавие: | Въпрос за MikroC? | |||||||||
Това си е наистина и само за академията С-то ми е мътно и така и не можах да разбра как се работи с bit field Пробвах някои работи с този компилатор, ADC, USART всичко си работи както искам но ми се опъна като реших да пробвам прекъсване от TMR1. Писах - не иска. Викам чакай да пробвам с примерите, компилирам, пускам примера и - ядец - след при пускането на примера светодиодите на порта се включват след 2-3 сек. и си остават така
|
||||||||||
| Автор: | Nikola Kirov [ Пон Мар 12, 2007 4:46 pm ] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Заглавие: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Един от удобните начини в C да работиш с битовете на някоя променлива е тя да е част от union. В горния пример при дефинирането на променлива така BITU MyVariable; Заема 1 баит.Ако искаш достъп до цялата променлива:
или
ако искаш достъп до някои бит аналогично с MyVariable.bit0
другия начин е да работиш с маски. Компилатора ги компилира като битови операции после.
По същия начин става и достъпа
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Автор: | milenjs [ Пон Мар 12, 2007 5:25 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Благодаря Николай, светна ми донякъде, това с маските си го ползвам, просто искам да сложа "човешки" имена на пиновете и битовете че много се бъркам иначе... Значи с именуване на битовете в променлива се оправих -
Работи си ОК, обаче как да си именувам пиновете на портовете. Четох в разните упътвания към компилатора, дават следния пример който обаче не работи
Компилатора веднага изпищява - PortA identifier redifined!, предполагам и си е така, как да го излъжа??? С указател??? А за прекъсването от Таймер1 някой да има идея??? |
|||||||||||||||||||
| Автор: | setoy [ Пон Мар 12, 2007 5:56 pm ] | |||||||||
| Заглавие: | ||||||||||
Когато искаш човешки имена пишеш
Оттам нататък компилатора като види LAMP1 автоматично си го замества с PortA.bit0. За таймера не мога да кажа. Виж из асемблера какво точно се случва, не ми е много ясно компилатора какво прави с флаговете. |
||||||||||
| Автор: | milenjs [ Пон Мар 12, 2007 6:02 pm ] |
| Заглавие: | |
#define LAMP1 PortA.bit0 - това го пробвах първо - с този компилатор не става, дава Invalid expression Прекъсването си работи нормално с 877А, с 688 не мога да разбера защо не вдява, сега препрочитам пдф-то, нещо съм изтървал но с други компилатори и същия чип не съм имал проблеми с прекъсването от таймер1. |
|
| Автор: | milenjs [ Пон Мар 12, 2007 6:21 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Еб.... мама му! След дълго четене и мислене
с това
и всичо си е на мястото т.е. работи както се очаква /ако мигането може да се нарече работа.../ Защо става така??? Имаше писано в форума нещо за буфера на портовете но не мога да се сетя. Това което се получава с ~ е че вдига порта в 1-ци а не го установява при последващо изпълнение в 0-ли. И това е само за 688, при 877а си работи??? |
|||||||||||||||||||
| Автор: | milenjs [ Вто Мар 13, 2007 10:30 am ] | |||||||||
| Заглавие: | ||||||||||
Странно се държи тази комбинация - MikroC + 16F688
Ей това в прекъсването на таймер1 /0.1с/ си работи но защото пиша портс наведнъж, ако установявам един по един отделните битове всичките ми се вдигат в 1 и си остават така... |
||||||||||
| Автор: | evc [ Вто Мар 13, 2007 12:43 pm ] |
| Заглавие: | |
Не е от компилатора. При ниските серии е така. От 18 нагоре си имат LAT регистри. Нищо не ти пречи да си направиш PORTB_map, т.е. образ на порта в паметта и да извършваш битови операции с него, а после да го изкарваш на порта като цял байт. workaround, но какво да правиш! Другия начин е да минеш на истински процесор - 18 или дори 24. |
|
| Автор: | rumen [ Вто Мар 13, 2007 2:55 pm ] |
| Заглавие: | |
evc няма да е така На асм се вдигат свалят пинове с битови операции без проблем. А и не само на асм. |
|
| Автор: | Nikola Kirov [ Вто Мар 13, 2007 3:13 pm ] |
| Заглавие: | |
В Hi-Tech и IAR нямам спомен да е имало проблем с операции от типа. PORTC |= 0x01; |
|
| Автор: | Predator_MF [ Вто Мар 13, 2007 3:22 pm ] | |||||||||
| Заглавие: | ||||||||||
Какво ще стане ако напишеш следното:
|
||||||||||
| Автор: | Nikola Kirov [ Вто Мар 13, 2007 3:29 pm ] | |||||||||
| Заглавие: | ||||||||||
Погледнах си код от времената когато се рових с PIC16. Един откъс от мокрочипската документация която обяснява случая
|
||||||||||
| Автор: | milenjs [ Вто Мар 13, 2007 4:12 pm ] |
| Заглавие: | |
@evc - не е от 16-та серия - на 877а си работи перфектно, не зная защо; @rumen - от компилатора ще да е, въпреки че гледах асм-то и не разбрах нищо, с друг компилатор и 688 няма проблеми с битовите операции с порта @Predator_MF - този компилатор това #define LED1 PORTB.F0 не го приема /мнооого кофти/, по точно приема декларацията но LED = 1 го отхвърля. Текста на Никола обяснява донякъде проблема.... Дано съм помогнал на някой с това главоблъскане, исках да направя сравнение /по-точно да пробвам MikroC-то/ в сравнение с Proton-a a и да мина на С компилатор, на първо време по-елементарен като за мене А - ето и резултатите от сравнението - устройството работи по един и същи начин с двата компилатора MikroC - used Rom - 1176(28%), Used Ram - 56 (27%) Proton+ - used Rom - 809(20%), Used Ram - 35 (14%) По големия код на MikroC-то вероятно е защото използвам вградените ф-ии за работа с RS-a, а програмата на Proton-a по скоро си е асемблерска, тук там имам If-Then-Else и работа с ADC-то, а RS-a си е на LowLevel... |
|
| Автор: | setoy [ Вто Мар 13, 2007 4:44 pm ] |
| Заглавие: | |
Ми не, навремето загубих малко време да разгледам МикроС. Вградените му функции са кадърно написани, причината е че компилатора е олигофреничен. Например, когато сравнява 2 числа ги зарежда в стека, вика функция, която ги изважда и също през стека връща резултата. То ако разгледаш асемблерския код се вижда какви олигофренщини върши . CCS се държи в по-голяма степен разумно, за останалите нямам наблюдения. Който е ползвал, да казва. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|