Автор Тема: Помощ за С и 16F871  (Прочетена 3956 пъти)

IbT

  • Зомбиран Роботостроител
  • *****
  • Публикации: 156
    • Профил
Помощ за С и 16F871
« -: Март 26, 2009, 07:34:34 pm »
Седнах най-накрая да се мъча с програмата за самонасочващата система. Обаче съм стигнал до конфигурацията на контролера само. Използвам SourceBoost IDE и с него си генерирах повечето стойности на регистрите. Обаче гледам в дата-та на тоя контролер, че за да използвам АЦП-то трябва да задам кой канал да чете. Та ... въпросът ми е само по един канал ли може да чете. Понеже ще използвам прекъсване от АЦП-то как мога да му задам да работи и по 4-те канала.

П.С. Абсолютно начинаещ съм в пиковете и програмирането за тях, затова моля за по-разбрани отговори :) ... Иначе с програмиране на С (но за ПС) се оправям. Това е първият от поредица въпроси, но всичко с времето си. Трябва да почна отнякъде :)

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
Помощ за С и 16F871
« Отговор #1 -: Март 26, 2009, 07:38:17 pm »
Здравей :)
Ами ADC модулът, който мери напрежение, е един, но има 4, 8 или 10 канала (зависи от модела контролер). Ти можеш програмно да му казваш кой канал да мери, но не можеш всичките на веднъж. Примерно можеш в един цикъл for да въртиш един брояч от 0 до 3 и на всяко инкрементиране да измерваш напрежението на съответни канал. Така накрая ще си премерил и 4те напрежения.
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

IbT

  • Зомбиран Роботостроител
  • *****
  • Публикации: 156
    • Профил
Помощ за С и 16F871
« Отговор #2 -: Март 26, 2009, 07:54:38 pm »
Хммм ... и аз за вариант с цикъл се сетих, но мислех, че може няколко канала да меря :) Сега тъкмо сядам да го пиша, но май първо трябва да си намеря някакъв примерен сорс за LCD-то, че да мога да си визуализирам резултатите :)

IbT

  • Зомбиран Роботостроител
  • *****
  • Публикации: 156
    • Профил
Помощ за С и 16F871
« Отговор #3 -: Март 26, 2009, 11:18:23 pm »
Оправих се вече с дисплея. Сега наистина минавам към АЦП-то, но пак имам питанка. Ето какво пише в датата:
Цитат

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 какво правя?

tommyboy

  • Направо Робот! :)
  • *****
  • Публикации: 416
    • Профил
Помощ за С и 16F871
« Отговор #4 -: Март 27, 2009, 11:04:02 am »
Какъв ти е ЛЦД -то точно, аз се занимавам с графични и буквенно -цифрени ЛЦД.

IbT

  • Зомбиран Роботостроител
  • *****
  • Публикации: 156
    • Профил
Помощ за С и 16F871
« Отговор #5 -: Март 27, 2009, 12:36:25 pm »
LCD-то ми е HD44780. Аз с него почти се оправих. Намерих си примерен код и го преработих малко като за 1 и 2 ред задавам два масива char*. Не успях само да го накарам да ми изкарва променливи int, както и adresh и adresl се опитах, но и там е същото.

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
Помощ за С и 16F871
« Отговор #6 -: Март 27, 2009, 08:35:34 pm »
Ами това с AN1 e странно! Свали си ерата на даташийта да не е някаква грешка. Другия вариант е този 16F871 да е някакъв по странен... До сега не съм го ползвал, тък като е сравнително стар. Може би трябваше да се спреш на 16Ф877А или 16Ф876
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

tommyboy

  • Направо Робот! :)
  • *****
  • Публикации: 416
    • Профил
Помощ за С и 16F871
« Отговор #7 -: Март 27, 2009, 09:32:42 pm »
Ами с АЦП като работиш трябва да се съобразиш колко ти е времето за дискретизация от това зависи на колко време ще проверяваш ADRESH/L
, има флаг за това ама пак си прочети даташийта.Друго трябва да се  конфигурира и разрядността на АЦП и подравняване на получената стойността от модула.

IbT

  • Зомбиран Роботостроител
  • *****
  • Публикации: 156
    • Профил
Помощ за С и 16F871
« Отговор #8 -: Март 27, 2009, 10:18:38 pm »
Проблема с LCD-to и стойността на adresh е, че този код, който съм намерил може на ми изкарва само char*, след няколко преработки го бях накарал int и adresh да ми ги изкарва с някакви гергелици. Иначе с char* нямам проблеми.

tommyboy

  • Направо Робот! :)
  • *****
  • Публикации: 416
    • Профил
Помощ за С и 16F871
« Отговор #9 -: Март 28, 2009, 12:57:06 pm »
Аз на асемблер пиша и имам малко познания по С , и може би няма да съм ти много полезен .

IbT

  • Зомбиран Роботостроител
  • *****
  • Публикации: 156
    • Профил
Помощ за С и 16F871
« Отговор #10 -: Март 28, 2009, 03:36:10 pm »
Ами според мен проблемът е, че integer са 16 битови, а char - 8. Въпреки, че доколкото разбрах от хелпа на компилатора itoa() функцията преобразува integer в ASCII, което всъщност си е 8 бита. И все пак не мога да разбера защо не се получава. Функцията, която ми пише по дисплея, всъщност обходжда цялото съобщение и изпраща символите един по един. Просто функцията itoa() нещо ми бърка работата, но не мога да разбера. Това ми е засега единия проблем, а другият е, че искам да използва и AN1 (Канал 1), но по тази таблица съдя, че не мога. Според мен са пропуснали да го напишат и когато оправя дисплея ще го пробвам.

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
Помощ за С и 16F871
« Отговор #11 -: Март 28, 2009, 10:07:52 pm »
Ами използвай sprintf() Казваш му да принтира 16битовото число и му казваш в кой стринг (масив от чарове) и го пращаш него.
Попринцип itoa() връща указател към получения стринг. Това взел ли си го предвид ?
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

IbT

  • Зомбиран Роботостроител
  • *****
  • Публикации: 156
    • Профил
Помощ за С и 16F871
« Отговор #12 -: Март 28, 2009, 10:47:11 pm »
Перфектна работа свърши sprintf. sv_shady, много ти благодаря. Въобще не се бях сетил за нея, понеже повече на С++ съм програмирал и съвсем отскоро съм С (колкото и нелогично да звучи, но съм си почнал от С++ и общо взето заради контролерите минах на С). Продължавам напред и очаквайте скоро новият ми въпрос :)

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
Помощ за С и 16F871
« Отговор #13 -: Март 28, 2009, 11:04:07 pm »
Ами вече преобладават по-сериозни машини, които нямат проблем с обектно ориентирани езици като С++ и е нормално да си почнал от него :) И аз бях така, но С предоставя набор от много гъвкави, полезни и леки функции като sprintf() :)
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
Помощ за С и 16F871
« Отговор #14 -: Март 28, 2009, 11:04:50 pm »
Ами вече преобладават по-сериозни машини, които нямат проблем с обектно ориентирани езици като С++ и е нормално да си почнал от него :) И аз бях така, но С предоставя набор от много гъвкави, полезни и леки функции като sprintf() :)

А за AN1 мисля, че е грешка в даташийта защото си свалих най-новия от сайта на микрочип и си имаше AN1
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания