Форум по Роботика
Технически форум => Програмиране => Темата е започната от: IbT в Март 26, 2009, 07:34:34 pm
-
Седнах най-накрая да се мъча с програмата за самонасочващата система. Обаче съм стигнал до конфигурацията на контролера само. Използвам SourceBoost IDE и с него си генерирах повечето стойности на регистрите. Обаче гледам в дата-та на тоя контролер, че за да използвам АЦП-то трябва да задам кой канал да чете. Та ... въпросът ми е само по един канал ли може да чете. Понеже ще използвам прекъсване от АЦП-то как мога да му задам да работи и по 4-те канала.
П.С. Абсолютно начинаещ съм в пиковете и програмирането за тях, затова моля за по-разбрани отговори :) ... Иначе с програмиране на С (но за ПС) се оправям. Това е първият от поредица въпроси, но всичко с времето си. Трябва да почна отнякъде :)
-
Здравей :)
Ами ADC модулът, който мери напрежение, е един, но има 4, 8 или 10 канала (зависи от модела контролер). Ти можеш програмно да му казваш кой канал да мери, но не можеш всичките на веднъж. Примерно можеш в един цикъл for да въртиш един брояч от 0 до 3 и на всяко инкрементиране да измерваш напрежението на съответни канал. Така накрая ще си премерил и 4те напрежения.
-
Хммм ... и аз за вариант с цикъл се сетих, но мислех, че може няколко канала да меря :) Сега тъкмо сядам да го пиша, но май първо трябва да си намеря някакъв примерен сорс за LCD-то, че да мога да си визуализирам резултатите :)
-
Оправих се вече с дисплея. Сега наистина минавам към АЦП-то, но пак имам питанка. Ето какво пише в датата:
CHS2:CHS0: Analog Channel Select bits
000 = Channel 0, (RA0/AN0)
010 = Channel 2, (RA2/AN2)
011 = Channel 3, (RA3/AN3)
100 = Channel 4, (RA5/AN4)
101 = Channel 5, (RE0/AN5)(1)
110 = Channel 6, (RE1/AN6)(1)
111 = Channel 7, (RE2/AN7)(1)
Ами на мен като ми трябва AN1 какво правя?
-
Какъв ти е ЛЦД -то точно, аз се занимавам с графични и буквенно -цифрени ЛЦД.
-
LCD-то ми е HD44780. Аз с него почти се оправих. Намерих си примерен код и го преработих малко като за 1 и 2 ред задавам два масива char*. Не успях само да го накарам да ми изкарва променливи int, както и adresh и adresl се опитах, но и там е същото.
-
Ами това с AN1 e странно! Свали си ерата на даташийта да не е някаква грешка. Другия вариант е този 16F871 да е някакъв по странен... До сега не съм го ползвал, тък като е сравнително стар. Може би трябваше да се спреш на 16Ф877А или 16Ф876
-
Ами с АЦП като работиш трябва да се съобразиш колко ти е времето за дискретизация от това зависи на колко време ще проверяваш ADRESH/L
, има флаг за това ама пак си прочети даташийта.Друго трябва да се конфигурира и разрядността на АЦП и подравняване на получената стойността от модула.
-
Проблема с LCD-to и стойността на adresh е, че този код, който съм намерил може на ми изкарва само char*, след няколко преработки го бях накарал int и adresh да ми ги изкарва с някакви гергелици. Иначе с char* нямам проблеми.
-
Аз на асемблер пиша и имам малко познания по С , и може би няма да съм ти много полезен .
-
Ами според мен проблемът е, че integer са 16 битови, а char - 8. Въпреки, че доколкото разбрах от хелпа на компилатора itoa() функцията преобразува integer в ASCII, което всъщност си е 8 бита. И все пак не мога да разбера защо не се получава. Функцията, която ми пише по дисплея, всъщност обходжда цялото съобщение и изпраща символите един по един. Просто функцията itoa() нещо ми бърка работата, но не мога да разбера. Това ми е засега единия проблем, а другият е, че искам да използва и AN1 (Канал 1), но по тази таблица съдя, че не мога. Според мен са пропуснали да го напишат и когато оправя дисплея ще го пробвам.
-
Ами използвай sprintf() Казваш му да принтира 16битовото число и му казваш в кой стринг (масив от чарове) и го пращаш него.
Попринцип itoa() връща указател към получения стринг. Това взел ли си го предвид ?
-
Перфектна работа свърши sprintf. sv_shady, много ти благодаря. Въобще не се бях сетил за нея, понеже повече на С++ съм програмирал и съвсем отскоро съм С (колкото и нелогично да звучи, но съм си почнал от С++ и общо взето заради контролерите минах на С). Продължавам напред и очаквайте скоро новият ми въпрос :)
-
Ами вече преобладават по-сериозни машини, които нямат проблем с обектно ориентирани езици като С++ и е нормално да си почнал от него :) И аз бях така, но С предоставя набор от много гъвкави, полезни и леки функции като sprintf() :)
-
Ами вече преобладават по-сериозни машини, които нямат проблем с обектно ориентирани езици като С++ и е нормално да си почнал от него :) И аз бях така, но С предоставя набор от много гъвкави, полезни и леки функции като sprintf() :)
А за AN1 мисля, че е грешка в даташийта защото си свалих най-новия от сайта на микрочип и си имаше AN1
-
Именно за това избрах С вместо С++. Сега използвам boostc със SourceBoost IDE и съм доволен особено в комбинация с Porteus :) Иначе имам и BoostC++ компилатор, но мисля, че С-то ще ми е по-удобно. Имам и на Hi-Tech компилатор, но пък IDE-то им нещо не ми харесва.
-
Аз лично ползвам CCS :) Купих си и техния дебъгер и ползвам пълноценно идето им, а пък и имат много подробна документация и примери :)
-
Ами аз имам и техен компилатор, който си върви с MPLAB, но е пробна версия. Пък IDE-to на sourceboost ми харесва защото има и симулатор - доста опростен, но пак е нещо. Можеш да си включваш и разни плугини към контролера и да тестваш, но не е толкова мощен като Porteus.