
Модератори:Jarevych, Жульєн, Yelik, Dimon, Denja, NIK
Цифровий спідометр 88 самотушки (+вся приборна панель...)
- hrdrive
- Повідомлень:15593
- З нами з:Чет, 11 грудня 2008, 15:55
- Стать:чоловік
- Авто:RGS III
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
iwanes, імхо, 3 варіант найкращий з тих всіх 

INTE®©ULLE®™
- iwanes
- Повідомлень:95
- З нами з:Сер, 13 травня 2009, 11:17
- Ім'я:Іван
- Авто:таврія стара:)
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
те що вже є зложено докупи....
Якщо у вас телефон НОВКІА --> то це кінець вашого тюнінґу...
Тоді чого ви тут tuning.lviv.ua?
Тоді чого ви тут tuning.lviv.ua?
- iwanes
- Повідомлень:95
- З нами з:Сер, 13 травня 2009, 11:17
- Ім'я:Іван
- Авто:таврія стара:)
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
Цифровий спідометр 88 самотушки (+вся приборна панель...)
Майже написав програму для мікропроцесора PIC16F628, такщо скоро буде зібрано то всьо в тестовому варіанті на макетниці
...
Написання програми спідометра на асемблері для PIC16F628 заняло купу часу та нервів, а виправлення незрозуміілих мені і компілятору MPLAB помилок то взагалі капець... Лишился ще тільки вирахувати точно затримки таймера для датчика щвидкості при різних швидкостях.

Написання програми спідометра на асемблері для PIC16F628 заняло купу часу та нервів, а виправлення незрозуміілих мені і компілятору MPLAB помилок то взагалі капець... Лишился ще тільки вирахувати точно затримки таймера для датчика щвидкості при різних швидкостях.
Якщо у вас телефон НОВКІА --> то це кінець вашого тюнінґу...
Тоді чого ви тут tuning.lviv.ua?
Тоді чого ви тут tuning.lviv.ua?
- Breaker
- Повідомлень:3912
- З нами з:Вів, 14 серпня 2007, 10:27
- Стать:чоловік
- Авто:BMW e46 coupe
- Звідки:UA
- Дякував (ла): 0
- Подякували: 0
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
iwanes, таке цікаве питання: воно того варте??? Потратити рік часу на побудову спідометра?
- iwanes
- Повідомлень:95
- З нами з:Сер, 13 травня 2009, 11:17
- Ім'я:Іван
- Авто:таврія стара:)
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
я думаю варте! Прада рузі і рідні вже нерозуміють мене(ну що можна так довго і нудно ремонтувати..) і дивляться якось тороха скоса... але то таке... потім оцінять , може...
Просто я рік робив нетільки спідометр а ле й доводив ужаси радяньської машини до хочаб чогось схожого на машину... міняв всьо шо тіки можна було на то шо міг зробити/переробити сам чи що могли мені виточити/зварити мастри...)
Просто я рік робив нетільки спідометр а ле й доводив ужаси радяньської машини до хочаб чогось схожого на машину... міняв всьо шо тіки можна було на то шо міг зробити/переробити сам чи що могли мені виточити/зварити мастри...)
Якщо у вас телефон НОВКІА --> то це кінець вашого тюнінґу...
Тоді чого ви тут tuning.lviv.ua?
Тоді чого ви тут tuning.lviv.ua?
- DNK
- Повідомлень:3778
- З нами з:Суб, 08 вересня 2007, 14:56
- Ім'я:Діма
- Стать:чоловік
- Авто:сx, YZF-R6
- Дякував (ла): 0
- Подякували: 3 рази
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
ТИ візьми шось сам зроби а потім пиши тупі коменти.Breaker писав:воно того варте
Молодець Іванес удачі в доробці .
Я гнівався на Бога за те що не мав взуття,
доки не побачив людину яка не мала ніг...
ВОРОГИ-ЖУЛЄН
доки не побачив людину яка не мала ніг...
ВОРОГИ-ЖУЛЄН
- iwanes
- Повідомлень:95
- З нами з:Сер, 13 травня 2009, 11:17
- Ім'я:Іван
- Авто:таврія стара:)
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
тут троха порахував за який час міряти швидкість і заплутався!
Самий оптимальний за 0.5-0.7 сек міряти, но тоді точність ваще ніяка...(або тре інший алгоритм програми)
а як цифри обновлятимуться за час 1.2 сек то це надто довго при розгоні/гальмуванні....машина вже проїде 30-20 метрів... ітого при тозгоні буде 5-14-26-35-44-55.. км (якось так)
який час краще вибрати? (див. ексельівський файл)
Самий оптимальний за 0.5-0.7 сек міряти, но тоді точність ваще ніяка...(або тре інший алгоритм програми)
а як цифри обновлятимуться за час 1.2 сек то це надто довго при розгоні/гальмуванні....машина вже проїде 30-20 метрів... ітого при тозгоні буде 5-14-26-35-44-55.. км (якось так)
який час краще вибрати? (див. ексельівський файл)
- Вкладення
-
- спідометр_Excel.xls
- теоритичні прорахунки
- (84.5Кіб)Завантажено 105 разів
Якщо у вас телефон НОВКІА --> то це кінець вашого тюнінґу...
Тоді чого ви тут tuning.lviv.ua?
Тоді чого ви тут tuning.lviv.ua?
- iwanes
- Повідомлень:95
- З нами з:Сер, 13 травня 2009, 11:17
- Ім'я:Іван
- Авто:таврія стара:)
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
тут добавив (див. прикріплений Архів-»Ексель) ще пару розрахунків для подільника таймера, але це тіки для програми на асемблері PIC16 (TMR0)
************************************************************************
-------Вимірювання на машині показали:------------------------------
71 см -- довжина колеса R13 (зимова резина , висоти непам’ятаю)
1 оберт колеса(360*) = (270*)обертів датчика
тому:
1 оберт колеса = 4.5 імпульси датчика ! (знаю брєд, но факт! міряв багато раз)
192 см -- 5 імпульсів датчика
223 см -- 6 імпульсів датчика
Сьодні чи завтра оформлю свої розрахнки в більш меньш читабельний вигляд і виложу тут. (ну бо вчсьо в чорновому варіанті, порозкидано і позаписувано так як писалося в той момент коли мене осяйнула очередна генальна ідая...)
************************************************************************
-------Вимірювання на машині показали:------------------------------
71 см -- довжина колеса R13 (зимова резина , висоти непам’ятаю)
1 оберт колеса(360*) = (270*)обертів датчика
тому:
1 оберт колеса = 4.5 імпульси датчика ! (знаю брєд, но факт! міряв багато раз)
192 см -- 5 імпульсів датчика
223 см -- 6 імпульсів датчика
Сьодні чи завтра оформлю свої розрахнки в більш меньш читабельний вигляд і виложу тут. (ну бо вчсьо в чорновому варіанті, порозкидано і позаписувано так як писалося в той момент коли мене осяйнула очередна генальна ідая...)
- Вкладення
-
- подільник_PIC16F.rar
- (12.91Кіб)Завантажено 88 разів
Якщо у вас телефон НОВКІА --> то це кінець вашого тюнінґу...
Тоді чого ви тут tuning.lviv.ua?
Тоді чого ви тут tuning.lviv.ua?
- iwanes
- Повідомлень:95
- З нами з:Сер, 13 травня 2009, 11:17
- Ім'я:Іван
- Авто:таврія стара:)
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
Цифровий спідометр 88 самотушки (+вся приборна панель...)
Переходимо до методики визначення швидкості. Як всім відомо, якщо автомобіль рухається, то з датчика швидкості приходять
імпульси, якщо не рухається - то і імпульсів тоже не дочекаєтеся! І що саме цікавіше -- частота (або кому зручніше - період
повторення) прямо пропорційна (обернено пропорційна, для періоду повторення) швидкості руху, от тут-то собака і порилась. Що таке
частота - це кількість імпульсів в секунду (просто геніально, спасибі Герцу) N(в секунду)=Fп, тому отримуємо:
{для машини таврія } >>>>>
V=Fп/2.6 (м/сек) (ми ж пам’ятаємо, що на 1 метр приходиться по 2.6 імпульси)
Але де ви бачили спідометри із шкалою "М/СЕК"? Та й Даішники штрафують за лишні км/год. Звідси висновок - треба перераховувати, а
як? Довго мучився, думав, потім знов мучився...
Але все геніально просто:
ділимо 3600 (це стіьки секунд в 1 годині) на (кількість імпульсів датчика швидкості на 1 км пройденого шляху)
і ділимо на 1000 (стільки метрів в 1 км)
Після складнійших математичних перетворень получаємо чарівну формулу V=:
V=3600/2700 * Fп (км/год), де *Fп -- це кількість імпульсів з датчика швидкості.
V=1,33 * Fп (км/год) - якраз те, що треба!
1.33 сек.-- це ширина "часових воріт" крізь які встигає пройти деяка кількісь імпульсів,
яка і являється після рахування(додавання) імпільсів за час 1.33 сек ---> і являється швидкістю! (км/год)
{для машини таврія } >>>>>
1 імпульс = 1,3 км/год, 10 імпульсів - 13 км/год, 100 імпульсів - 130 км/год і т.д.
імпульси, якщо не рухається - то і імпульсів тоже не дочекаєтеся! І що саме цікавіше -- частота (або кому зручніше - період
повторення) прямо пропорційна (обернено пропорційна, для періоду повторення) швидкості руху, от тут-то собака і порилась. Що таке
частота - це кількість імпульсів в секунду (просто геніально, спасибі Герцу) N(в секунду)=Fп, тому отримуємо:
{для машини таврія } >>>>>
V=Fп/2.6 (м/сек) (ми ж пам’ятаємо, що на 1 метр приходиться по 2.6 імпульси)
Але де ви бачили спідометри із шкалою "М/СЕК"? Та й Даішники штрафують за лишні км/год. Звідси висновок - треба перераховувати, а
як? Довго мучився, думав, потім знов мучився...
Але все геніально просто:
ділимо 3600 (це стіьки секунд в 1 годині) на (кількість імпульсів датчика швидкості на 1 км пройденого шляху)
і ділимо на 1000 (стільки метрів в 1 км)
Після складнійших математичних перетворень получаємо чарівну формулу V=:
V=3600/2700 * Fп (км/год), де *Fп -- це кількість імпульсів з датчика швидкості.
V=1,33 * Fп (км/год) - якраз те, що треба!
1.33 сек.-- це ширина "часових воріт" крізь які встигає пройти деяка кількісь імпульсів,
яка і являється після рахування(додавання) імпільсів за час 1.33 сек ---> і являється швидкістю! (км/год)
{для машини таврія } >>>>>
1 імпульс = 1,3 км/год, 10 імпульсів - 13 км/год, 100 імпульсів - 130 км/год і т.д.
Якщо у вас телефон НОВКІА --> то це кінець вашого тюнінґу...
Тоді чого ви тут tuning.lviv.ua?
Тоді чого ви тут tuning.lviv.ua?
- Breaker
- Повідомлень:3912
- З нами з:Вів, 14 серпня 2007, 10:27
- Стать:чоловік
- Авто:BMW e46 coupe
- Звідки:UA
- Дякував (ла): 0
- Подякували: 0
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
да ладно. Діма ти так написав, ніби ти мене знаєш і можеш запевняти, що я нічого сам не зробивDNK писав:ТИ візьми шось сам зроби а потім пиши тупі коменти.




круто, якщо є багато часу. Успіхівiwanes писав:Просто я рік робив нетільки спідометр а ле й доводив ужаси радяньської машини до хочаб чогось схожого на машину... міняв всьо шо тіки можна було на то шо міг зробити/переробити сам чи що могли мені виточити/зварити мастри...)



- iwanes
- Повідомлень:95
- З нами з:Сер, 13 травня 2009, 11:17
- Ім'я:Іван
- Авто:таврія стара:)
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
Цифровий спідометр 88 самотушки (+вся приборна панель...)
то всьо так шось туго йде шо то капець.... таке враження шо я як тіки хочу щось корисне зробити то вилазить зразу на тебе одного 20 граблів... і поки ти всі до одного їх непройдеш і не виправиш(або неполамаєш) то ніц невийде...
Зайнявся я індикатором остатку бензини в баку... і дійшов до виисновку що датчик який намертво закис в баку є дохлий , ох... б**** як його тяжко відкручувати...(місця 0-ль, + вибухо небезпечні пари бензину....)
як то кажуть що москаль зробить то україньцю незрозуміти...
А ті болти шо той датчик баку тримають (6 штук зі шліцами) то є капець пів дня відкручував/висверлював і відпилював їх на***.....
Ще цілий день (вчора) потратив щоб купити нормальні болти, калені в маслі (чорні) з внуррішнім шестигранніком м4х16 на заміну... (ну і звісно що попав під вчорашню зливу....
) пів дня потратив із зза сраних 6-ти вінтиків...
А шоб найти той поплавковий датчик (облазивши пів львова) і він затянув аж на 120 грн..(брав в магазині, і то він опинився якимось бракованим... брєд повний!
Як це бракований? а так: міряю тестером чорну клему і масу -- показує ОБРИВ!!! а мав показувати опір від 1-90 Ом .
Міряю опір на резисторі (повний 88 Ом... а схему індикатора на 10 світодіодів стовбиком вже всю розрахував розвів плату і найшов/купив всі компоненти під опір 93 Ом... і теоритичний розрахунок показав:
що тре міняти опроний резистор у схемі на інший (якшо він ще нтакий існує інакше тре щось знов комбінувати..)... ох...а радіобазар аж в середу..як то всьо довго тянеться!! )
Тому контакти прийшлося перепаювати бо були сильно якісь окислені в місцях пайки , певне паяти невміють на заводі остатки кислоти незмивають взагалі ті москалі... , а потім і допаювати 5-6 мм дротика від основного дроту який йде на клему до штатної площадки резистора благо нагрітий паяльник був під рукою....(десь там паяли незалудивши зверха по окислу от контакту небуло взагалі....там де нетре як все перебор, а там де тре нема зовсім контакту).... )
Зайнявся я індикатором остатку бензини в баку... і дійшов до виисновку що датчик який намертво закис в баку є дохлий , ох... б**** як його тяжко відкручувати...(місця 0-ль, + вибухо небезпечні пари бензину....)
як то кажуть що москаль зробить то україньцю незрозуміти...
А ті болти шо той датчик баку тримають (6 штук зі шліцами) то є капець пів дня відкручував/висверлював і відпилював їх на***.....
Ще цілий день (вчора) потратив щоб купити нормальні болти, калені в маслі (чорні) з внуррішнім шестигранніком м4х16 на заміну... (ну і звісно що попав під вчорашню зливу....

А шоб найти той поплавковий датчик (облазивши пів львова) і він затянув аж на 120 грн..(брав в магазині, і то він опинився якимось бракованим... брєд повний!
Як це бракований? а так: міряю тестером чорну клему і масу -- показує ОБРИВ!!! а мав показувати опір від 1-90 Ом .
Міряю опір на резисторі (повний 88 Ом... а схему індикатора на 10 світодіодів стовбиком вже всю розрахував розвів плату і найшов/купив всі компоненти під опір 93 Ом... і теоритичний розрахунок показав:
що тре міняти опроний резистор у схемі на інший (якшо він ще нтакий існує інакше тре щось знов комбінувати..)... ох...а радіобазар аж в середу..як то всьо довго тянеться!! )
Тому контакти прийшлося перепаювати бо були сильно якісь окислені в місцях пайки , певне паяти невміють на заводі остатки кислоти незмивають взагалі ті москалі... , а потім і допаювати 5-6 мм дротика від основного дроту який йде на клему до штатної площадки резистора благо нагрітий паяльник був під рукою....(десь там паяли незалудивши зверха по окислу от контакту небуло взагалі....там де нетре як все перебор, а там де тре нема зовсім контакту).... )
Якщо у вас телефон НОВКІА --> то це кінець вашого тюнінґу...
Тоді чого ви тут tuning.lviv.ua?
Тоді чого ви тут tuning.lviv.ua?
- iwanes
- Повідомлень:95
- З нами з:Сер, 13 травня 2009, 11:17
- Ім'я:Іван
- Авто:таврія стара:)
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
Цифровий спідометр 88 самотушки (+вся приборна панель...)
покажчик бензину дув позачора спаяний, провірений, а вчора був також додатково відкалідрований для мого датчика баку (також без проблем підійде для деу ланоса такий покажчик, як кого цікавить можна і для інших машин переробити то непроблема...)
- Вкладення
-
- бак_лого.JPG (8.82Кіб)Переглянуто 3119 разів
-
- 100_6270.JPG (30.57Кіб)Переглянуто 3119 разів
-
- 100_6263.JPG (27.49Кіб)Переглянуто 3119 разів
-
- 100_6271.JPG (26.24Кіб)Переглянуто 3119 разів
-
- 100_6272.JPG (24.38Кіб)Переглянуто 3119 разів
-
- 100_6280.JPG (37.28Кіб)Переглянуто 3119 разів
-
- 100_6294.JPG (43.16Кіб)Переглянуто 3119 разів
-
- 100_6300.JPG (37.49Кіб)Переглянуто 3119 разів
-
- 100_6304.JPG (42.51Кіб)Переглянуто 3119 разів
-
- 100_6305.JPG (40.96Кіб)Переглянуто 3119 разів
-
- 100_6306.JPG (55.46Кіб)Переглянуто 3119 разів
-
- 100_6307.JPG (37.65Кіб)Переглянуто 3119 разів
-
- 100_6308.JPG (39.11Кіб)Переглянуто 3119 разів
-
- 100_6309.JPG (41.18Кіб)Переглянуто 3119 разів
-
- 100_6310.JPG (39.44Кіб)Переглянуто 3119 разів
-
- 100_6311.JPG (38.69Кіб)Переглянуто 3119 разів
-
- 100_6316.JPG (38.66Кіб)Переглянуто 3119 разів
Востаннє редагувалось Чет, 17 червня 2010, 11:10 користувачем iwanes, всього редагувалось 1 раз.
Якщо у вас телефон НОВКІА --> то це кінець вашого тюнінґу...
Тоді чого ви тут tuning.lviv.ua?
Тоді чого ви тут tuning.lviv.ua?
- andrew
- Повідомлень:8616
- З нами з:Чет, 15 грудня 2005, 22:52
- Ім'я:Андрій
- Стать:чоловік
- Звідки:м.Львів
- Дякував (ла): 1 раз
- Подякували: 47 рази
- Контактна інформація:
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
iwanes цікавить електронний покажчик на Диво СЕНС :)
Ціна питання , можна в ПП або по тел. 067-674-57-23
Ціна питання , можна в ПП або по тел. 067-674-57-23
- 777
- Повідомлень:353
- З нами з:П'ят, 07 листопада 2008, 18:39
- Ім'я:777
- Стать:чоловік
- Звідки:Планета Земля
- Дякував (ла): 0
- Подякували: 0
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
а можеш щось похоже на класику зробити?
ціна питання?
ціна питання?
- iwanes
- Повідомлень:95
- З нами з:Сер, 13 травня 2009, 11:17
- Ім'я:Іван
- Авто:таврія стара:)
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
Цифровий спідометр 88 самотушки (+вся приборна панель...)
ось фотка де я підпаював кусочок дротика (під оловом , і його вже невидно...) у поплавковому датчику рівня бензину.
+ ще оприлюднюю ісходніки програми на асемблері! аж 370 стрічок написав....
*****************************************************
; Програма спідометра 888 із Внутрішнім підпрограмою-драйвером для Динамічної індикації цифр.
;***********************************
; list p=16F628A
list p=16F628
#include <p16f628.inc>
errorlevel -302
;__config 0x3ffe ; ок ? + внутрішній кварц на 4 МГц
; Біти конфігурації __CONFIG 3F10h
;__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _INTOSC_OSC_NOCLKOUT
__CONFIG 3F10h ; ВКЛЮЧЕНО Павер Ап Таймер + внутрішній кварц (intClock 1/0) + mclear підключений до +5 В через резистор 680 Ом
;--Register Definitions--
;W EQU 0x00
;F EQU 0x01
;--Register Files--
;INDF EQU 0x00
;TMR0 EQU 0x01
;PCL EQU 0x02
;STATUS EQU 0x03
;FSR EQU 0x04
;PORTA EQU 0x05
;PORTB EQU 0x06
;EEDATA EQU 0x08
;EEADR EQU 0x09
;PCLATH EQU 0x0A
;INTCON EQU 0x0B
;OPTION_REG EQU 0x81
;TRISA EQU 0x05
;TRISB EQU 0x06
;EECON1 EQU 0x08
;EECON2 EQU 0x09
;--STATUS bits--
;C EQU 0x00
;DC EQU 0x01
;Z EQU 0x02
;NOT_PD EQU 0x03
;NOT_TO EQU 0x04
;RP0 EQU 0x05
;RP1 EQU 0x06
;IRP EQU 0x07
;--INTCON bits--
;RBIF EQU 0x00
;INTF EQU 0x01
;T0IF EQU 0x02
;RBIE EQU 0x03
;INTE EQU 0x04
;T0IE EQU 0x05
;EEIE EQU 0x06
;GIE EQU 0x07
;--OPTION_REG bits--
;PS0 EQU 0x00
;PS1 EQU 0x01
;PS2 EQU 0x02
;PSA EQU 0x03
;T0SE EQU 0x04
;T0CS EQU 0x05
;INTEDG EQU 0x06
;NOT_RBPU EQU 0x07
;--EECON1 bits--
;RD EQU 0x00
;WR EQU 0x01
;WREN EQU 0x02
;WRERR EQU 0x03
;EEIF EQU 0x04
; __config 0x3ff2
; __config 0x3f10h
; опис своїх змінних:
count1 equ 0x20 ; 0x0C count1 це кількість разів по 32мс від таймера TMR0, і чекаємо коли буде 40 разів (.40=28h)(40мс * 32 = 1300 мс) // (60мс * 10 = 600 мс) (28h*2=50h)
hdnull equ 0x21 ;impnum -[кількість імпульсів датчика за час 1.3 сек] //hdnull (0x0D) сотні і десятки нулі// ?
dig_O equ 0x22 ;0x0E одиниці (Units) порозрядний лічильник для Одиниць --це кількість імпульсів датчика за час 1.3 сек
;одиниці dig_U (Units)(0E) ok
dig_D equ 0x23 ;0x0F десятки (Diked) порозрядний лічильник для Десятків --це кількість імпульсів датчика за час 1.3 сек
; десятки dig_D (Diked)(0F) ok
dig_S equ 0x24 ;0x10 сотні (Hundred) порозрядний лічильник для Сотень --це кількість імпульсів датчика за час 1.3 сек
; сотні dig_H (Hundred)(10) ok
O_dinam equ 0x27 ;0x13 записати у зміннну посегментний код для швидкого виводу у PORTB цифри Одиниці// вуфер у змінну -» Одиниці (0x13)//
; одиниці (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
D_dinam equ 0x25 ;0x11 записати у зміннну посегментний код для швидкого виводу у PORTB цифри Десятки// вуфер у змінну -» Десятки (0x11)
;десятки (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
S_dinam equ 0x26 ;0x12 записати у зміннну посегментний код для швидкого виводу у PORTB цифри Сотні// вуфер у змінну -» Сотні (0x12)
;сотні (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
nomAnod equ 0x28 ;0x14 № анода/№ цифри яка зараз світить цифри (розряди № 1/2/3)
iniTMR equ d'022'
;*** Programm dump ***
org 0x0000 ;Start address
;------------------------------------------------
;Ініціалізація ВНУТРІШНій тактовий генератор (OSCF = 0->32KHz /OSCF=1 -->4MHz)
BCF STATUS, RP1 ;Вибір банка RP1 ->0
BCF STATUS, RP0 ;Вибір банка 0 // БІТ Kлєар RP0 // обнулити Біт RP0 в =0
BSF STATUS, RP0 ;Вибір банка 1 // БІТ Sет RP0 // встановити Біт RP0 в =1
BSF PCON, OSCF ;ВСТАНОВИТИ БІТ OSCF =1 (=0->32KHz/=1 -->4MHz) //ВСТАНОВИТИ БІТ OSCF =0 ---ok при +3 v
;------------------------------------/////////////
; Очистка Sys регістрів (провсяк випадок, ну мало що йому клемане при старті...)
clrf PORTA ; очистити/обнулити ПОЧИСТИТИ PORTA = 00h (ІНІЦІАЛІЗАЦІЯ защолок PORTA)
clrf PORTB ; очистити/обнулити ПОЧИСТИТИ PORTB = 00h (ІНІЦІАЛІЗАЦІЯ защолок PORTB)
clrf INTCON ; очистити/обнулити регістр INTCON
clrf TMR0 ; очистити/обнулити TMR0
clrwdt ; очистити/обнулити wdt, сторожовий пес по живленню (при включченні проца 72млс затримка)
;------------- sys регістр INTCON -----------------------/////////////
; MOVLW B'01010101'
; ¦¦¦¦¦¦¦¦
; ¦¦¦¦¦¦¦+- RBIF флажок преривання по зміні сигналу на порті B
; ¦¦¦¦¦¦+-- INTF флажок преривання по входу RB0/INT
; ¦¦¦¦¦+--- T0IF флажок преривання по переповненню таймера T0
; ¦¦¦¦+---- RBIE разрешение преривання по изменению на порте B
; ¦¦¦+----- INTE дозволено преривання по входу RB0/INT
; ¦¦+------ T0IE дозволено преривання по переполнению T0
; ¦+------- PEIE дозволено преривання від переферійних пристроїв
; +-------- GIE глобальне преривання преривань
; MOVWF INTCON
;
;*** Ініціалізація порта А як цифровий вивід/вхід
; (невикористовувати компаратори)
BCF STATUS, RP0 ;Вибір банка 0 ***
CLRF PORTA ;ПОЧИСТИТИ PORTA = 00h (ІНІЦІАЛІЗАЦІЯ защолок PORTA)
MOVLW 0x07 ; біти конфігурації для CMCON // (невикористовувати компаратори)
MOVWF CMCON ;канали PORTA цифрові входи/виходи
BCF STATUS,RP1
BSF STATUS,RP0 ;Вибір банка 1
MOVLW B'00000000' ; всі ножки ПОРТА на вивід
; № біта^ 76543210 (якщо 1 -працює на вхід сигналу від кнопки/датчика, 0- як нога-вивід інформації)
; ¦¦¦¦¦¦¦+- RA0 (лапка №17) незадіяна (тому заземлити провсяк випадок...)
; ¦¦¦¦¦¦+-- RA1 (лапка №18) Цифра 2
; ¦¦¦¦¦+--- RA2 (лапка №1) Цифра 1
; ¦¦¦¦+---- RA3 (лапка №2) Цифра 3
; ¦¦¦¦
; ¦¦¦+----- RA4 (лапка №3) незадіяна (тому заземлити провсяк випадок...)
; ¦¦+------ RA5 (лапка №4) {MCLEAR} (завжди читаються як '0'{0 як вихід})
; ¦+------- RA6 (лапка №15) (завжди читаються як '0'{0 як вихід}) незадіяна (тому заземлити провсяк випадок...)
; +-------- RA7 (лапка №16) (завжди читаються як '0'{0 як вихід}) незадіяна (тому заземлити провсяк випадок...)
MOVWF TRISA ;Загpузити B'00000000' в pегістp TRISA / НАРЕШТІ настроїли :)
; BCF STATUS, RP0 ; вибрати назад банк 0 (там є пам’ять для моїх змінних) ***
;***************
;****Ініціалізація порта В **
; BCF STATUS, RP0 ;Вибір банка 0 ***
; CLRF PORTB ;ПОЧИСТИТИ PORTB = 00h (ІНІЦІАЛІЗАЦІЯ защолок PORTA)
; BCF STATUS,RP1
; BSF STATUS,RP0 ;Вибір банка 1 // то всьо вже зробили спочатку...
; коли була " Очистка Sys регістрів "
MOVLW B'00000001' ;всі ножки ПОРТB на вивід,крім <RB0>--працює як вхід із датчика швидкості
; № біта^ 76543210 (1-працює на вхід сигналу від кнопки/датчика, 0- як ноги-виходи, на індикатор)
; ¦¦¦¦¦¦¦+- RB0 (лапка №6) із датчика спідометра//( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦¦¦¦¦¦+-- RB1 (лапка №7) сегмент А//( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦¦¦¦¦+--- RB2 (лапка №8) сегмент B//( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦¦¦¦+---- RB3 (лапка №9) сегмент C//( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦¦¦+----- RB4 (лапка №10) сегмент D // ( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦¦+------ RB5 (лапка №11) сегмент E // ( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦+------- RB6 (лапка №12) сегмент F // ( читаються якщо '0' вивід-->інфомації/1 = вхід)
; +-------- RB7 (лапка №13) сегмент G // ( читаються якщо '0' вивід-->інфомації/1 = вхід)
MOVWF TRISB ;Загpузити B'00000000' в pегістp TRISB / НАРЕШТІ настроїли :)
;
; BCF STATUS,RP0 ; вибрати назад банк 0 (там є пам’ять для моїх змінних) <<<
;**************настройки для PIC16F84 *********************************************************************
; Очистка Sys регістрів (провсяк випадок, ну мало що йому клемане при старті...)
; clrf PORTA ; очистити/обнулити
; clrf PORTB ; очистити/обнулити
; clrf INTCON ; очистити/обнулити
; clrf TMR0 ; очистити/обнулити
; clrwdt ; очистити/обнулити wdt
;--------------------------------
; bsf STATUS,RP0 ; вибрати банк 1
; movlw b'00000000' ;0x00 b'0000 0000',' ',.00 всі ножки ПОРТА на вивід //константу у вуфер
; b'0000 0000' (1-працює на вхід сигналу від кнопки/датчика, 0- як ноги-виходи)
; № 7654 3210
; movwf TRISA ; застосувати зміни для PORTA (вуфер у защолку/настройку портаА)
; movlw b'00000001' ;0x01 b'0000 0001',' ',.01 '00000001' всі ножки на вивід,крім <RB0>--працює як вхід із датчика швидкості //константу у вуфер
; b'0000 0001' (1-працює на вхід сигналу від кнопки/датчика, 0- як ноги-виходи)
; № 7654 3210
; movwf TRISB ; застосувати зміни для PORTB (вуфер у защолку/настройку портаБ)
;************/ END *******настройки для PIC16F84 //// END *****************************************************
; Ініціалізація таймера (і його передподільника 1:128 ) // '..0111'--> 1:256
movlw b'01000110' ;0x46 b'0100 0110','F',.70 1:128 передподільник //константу у вуфер
movwf OPTION_REG ;MOVWF TMR0 ; у таймер TMR0, t i = (1/4МГц~= 1 ) * 128(вибрали Такий предподільник 1:128) * (256 - 70 = 186) //= 0,97656 *128 *186 = 181.64 мкс ~= 0.182 млс *128= 23.3 млс (=0.023 сек)
;Регистр OPTION // OPTION_REG :
; b'0001 0110' = .22 = (0x16h)
; № 7654 3210 Регистр OPTION_REG :
; |||| ||||_ PS0=0 параметр для передподільника
; |||| |||__ PS1=1 параметр для передподільника
; |||| ||___ PS2=1 параметр для передподільника == '..110' --- 1:128 // '..111' --- 1:256
; |||| |____ PSA=0 --- подільник включений перед/для TMR0 // =1 для Сторожового Пса (WDT)- дає затримку в 72млс при включенні для зарядки конденсаторів чи що...
; ||||
; ||||______ T0SE=1 1--по спаду фронту на ножці RA4/T0CKI ( Вибір фронту приросту лічилника TMR0 при зовнішньому тактовому сигналі)// 0-- по передньому фронту
; |||_______ T0CS=0 (Вибір тактового сигналу для TMR0) 0--внутрішній тактовий сигнал CLKOUT // 1-зовнішній тактовий сигнал із ножки RA4/T0CKI
; ||________ INTEDG=0 преривання (=1 --по передньому// =0 --по задньому) фронту сигналу
; |_________ NOT_RBPU=0 0--підтягуючі резистори включені на ножках PORTB / =1 -вимкнені.
bcf STATUS,RP0 ; вибрати назад банк 0 (там є пам’ять для моїх змінних)
;********************************************************************
;Закіньчили настройки, тепер моя прога
;Запис початкових значень у змінні <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<,,,,
;
;********************************************************************
;Запис початкових значень у змінні
movlw 0x02 ;b'0000 0010',' ',.02 ,записати номер Активної/Висвічуваної вже цифри (для виводу 3-х нулів "оOо")
;// 2-га ножка ПортаА є активна (+5 В, решта +0 В).
movwf 0x28 ; вуфер у змінну segcod (0x14) номер Активної/Підсвічуваної вже цифри // (номер цифри № 1/2/3) [№3/2/1]
movlw 0x02 ;b'0000 0010',' ',.02 ,записати код посегментний для "о" (для виводу 3-х нулів "оOо")//значення-константу у вуфер
movwf 0x26 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Сотні// вуфер у змінну -» Сотні (0x12)
;// вуфер-» Сотні (0x12) [кількість імпульсів датчика за час 1.3 сек]
movlw 0x02 ;b'0000 0010',' ',.02 ,записати код посегментний для "0" (для виводу 3-х нулів "оOо")
movwf 0x25 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Десятки// вуфер у змінну -» Десятки (0x11)
;// вуфер-» Десятки (0x11) [кількість імпульсів датчика за час 1.3 сек]
movlw 0x02 ;b'0000 0010',' ',.02 ,записати код посегментний для "о" (для виводу 3-х нулів "оOо")
; (0--світить , 1--погашений сегмент)// значення-константу "Погасити всі сеґменти" у вуфер
movwf 0x27 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Одиниці// вуфер у змінну -» Одиниці (0x13)
;// вуфер-» Одиниці (0x13) [кількість імпульсів датчика за час 1.3 сек]
; Основна прога (Цикл бескінечний)------------------------------------
L_0015: ; Основний ЦИКЛ програми...---------------------------------------------------
;берем 10 і пишемо у порозрядний лічильник для Одиниць,Десятків,Сотень (якби обнуляєм його... бо 0-імпульсів ше неприходило...)
movlw 0x0A ;b'0000 1010',' ',.10 константу ".10" у ввуфер
movwf 0x22 ; одиниці (Units) порозрядний лічильник для Одиниць --це кількість імпульсів датчика за час 1.3 сек
movwf 0x23 ; десятки (Diked) порозрядний лічильник для Десятків --це кількість імпульсів датчика за час 1.3 сек
movwf 0x24 ; сотні (Hundred) порозрядний лічильник для Сотень --це кількість імпульсів датчика за час 1.3 сек
movlw 0x28 ;b'0010 1000','(',.40 разів по 32,5 млс (від TMR0) * 40 = 1300 млс (1.3 сек) //константу ".40" у ввуфер
movwf 0x20 ;count1 -це кількість разів по 32,5 млс від таймера TMR0, і чекаємо коли буде 40 разів (32.5млс * 40 = 1300 млс)==1.3 сек // count1 equ 0x0C
bcf INTCON,INTF ; обнулити в регістрі INTCON біт INTF ( обнулити = переривання ще небуло)
;обнулити провсяк-випадок флажок переривання які приходять із ножки <RB0> (імпульс від спідометра)
L_001C: ; Сюда йде прога після любого переривання (по RB0 сигнал датчика або по переповненню таймера TMR0 ) //адрес 0x1C
;Приймем тактову частоту - Fтакт. = 4,096 МГц (стандартний кварц). Тоді час циклу буде: t c = 1 / Fтакт. * 4 = 0,97656 мкс //
; данні взяв звідси: http://radio-konst.narod.ru/moi_konstru ... prosto.htm
movlw 0x9F ;b'1001 1111','џ',.159 '...111'--» це подільник на 1:256 для таймера(TMR0) / константа iniTMR
; movlw b'01000110' ;0x46 b'0100 0110','F',.70 '...111'--» це подільник на 1:128 для таймера(TMR0) / константа iniTMR
; movlw b'00010110' ; = .22 = (0x16h) ше раз ініціалізація для таймера....(предподільники і так далі, регіст INTCON)
; movlw iniTMR ;
movwf TMR0 ; записати значення у TMR0 затримка =(1/10)*4*(1*256)*(256)=26 млс
; movwf OPTION_REG
bcf INTCON,T0IF ;обнулити біт INTCON <2> , якщо = 1-було переповнення TMR0 // 0-переповнення TMR0 не було. ; обнулити біт T0IF для TMR0 (T0IF =1 якшо є // T0IF =0 ще небуло) переривання/переповнення TMR0
L_001F: ; ПРОЦЕДУРКА розбиття числа/шидкості на 3-ри сегменти індикатора (3-три розряди 2-йково--10-ткового перетворення)
btfss INTCON,INTF ;1) біт INTF №<1>=1 ? був сигнал від датчика? ( прерывания на выводе RB0/INT?)
goto L_002E ;2)INTF №<1>=0 небуло, йдем провірим таймер (і так довго і нудно ковбасимось...)
decfsz 0x22,F ;INTF №<1>=1, iff dig_U = dig_U -1, і пропустити нижню команду якщо dig_U = 0 (Одиниці)
goto L_002D ; IF dig_U #=0 ,на підпрограмку "якщо 0 то обнуляєм INTF = 0 --зовнішнього преривання не було"
movlw 0x0A ; IF dig_U =0 ,константу '.10' в (W) Вуфер // b'0000 1010',' ',.10
movwf 0x22 ; вуфер в флажок Одиниць dig_U
decfsz 0x23,F ; iff , dig_D = dig_D -1, і пропустити нижню команду якщо dig_D = 0 (Десятки)
goto L_002D ; IF dig_D #=0 ,на підпрограмку "якщо 0 то обнуляєм INTF = 0 --зовнішнього преривання не було"
movlw 0x0A ; IF dig_D =0 ,константу '.10' в (W) Вуфер ;b'0000 1010',' ',.10
movwf 0x23 ; вуфер в флажок Десятків dig_D ; // сотні (Hundred)
decfsz 0x24,F ; iff , dig_H = dig_H -1, і пропустити нижню команду якщо dig_H = 0 (Сотні)
goto L_002D ; IF dig_H #=0 ,на підпрограмку "якщо 0 то обнуляєм INTF = 0 --зовнішнього преривання не було"
movlw 0x0A ; IF dig_H =0 ,константу '.10' в (W) Вуфер ;b'0000 1010',' ',.10
movwf 0x24 ; вуфер в флажок Сотень dig_H ; // impnum == кількість імпульсів датчика за час 0.6 сек //або сотні
L_002D: ;ПРОЦЕДУРКА якщо цифра=0 то обнуляєм INTF = 0 --зовнішнього преривання не було від ножки RB0/INT //то значить був імпульс від датчика швидкості
bcf INTCON,INTF ;обнулити мітку/біт переривань (біт преривання на виводі RB0/INT)
L_002E: ;ПРОЦЕДУРКА провірка таймера TMR0, якщо НЕ #=0
btfss INTCON,T0IF ; 3) INTCON <2> =1 ? (T0IF =1 якшо є // T0IF =0 ще небуло) переривання/переповнення TMR0
goto L_001F ; 4)ні, T0IF =0 ще небуло, то вертаємося/йдемо далі чекати/ковбаситися на 1)...4)
bcf STATUS,C ; так, T0IF =1 якшо є, очистити у STATUS, біт С (флажок переносу =0 -- небуло переносу ) // (пропустити команду goto ...) і приступити до очистки STATUS, біт С
rrf 0x28,F ; Циклічний зсув Вправо 0x14, через перенос. (розряди № 1/2/3)
btfss 0x28,0 ; iif 0x14,біт №<0> =1 ?
goto L_0038 ; ні #=1, то йдемо виводити у порт циферку ???
movlw 0x08 ; ТАК =1, b'0000 1000',' ',.08 , ТАК =1,
movwf 0x28 ; вуфер у змінну 0x14
movlw 0x28 ;b'0001 0100','',.20 константу 0x14 у вуфер
movwf FSR ; константу/адрес 14h у FSR ( '00010100' ) (Регістр адресу при безпосередній адресації)
L_0038: ; вивід у порт циферки + перезаливка цифр у інші змінні 0x12-сотні/0x11-десятки/0x13-одиниці (для ДинамічноїІндикації)
clrf PORTA ; чистимо PORTA
decf FSR,F ; FSR = FSR-1 означає вибрати іншу змінну із пам’яті по меншому адресу (АДРЕС-1)
; FSR =змінній за адресом[0x11-0x12-0x13] (Десятки/Сотні/Одиниці)
movf INDF,W ; витягуємо із пам’яті маску анодів наступного розряду (Одиниці/Десятки/Сотні)
;// переслати значення змінної яка находиться за адресом в FSR =змінній за адресом[0x11-0x12-0x13] у Вуфер ->
movwf PORTB ; Вуфер у PORTB
movf 0x28,W ; змінну 0x14 у Вуфер -> (світять покишо Одиниці = 0 , вивід 1-дного 0-ля замість 3-х нулів 000)
movwf PORTA ; Вуфер у PORTA (розряди № 1/2/3)
decfsz 0x20,F ;провірити Умову(нижче), та Зробити count1=count1-1 це кількість разів по 10мс (колись по 60мс від таймера TMR0, і чекаємо коли буде 10разів (60мс * 10 = 600 мс))
goto L_001C ; Поки/коли count1 #=0 ,на підпроґ. ms600 [і там iniTMR ] // але НЕ за наступною цифрою/розрядом
clrf 0x21 ; якщо count1= 0 , очистити impnumb/hdnull (0x0D) , сотні нулі (отже несвітяться)
movf 0x24,W ; переслати Сотні dig_H (Hundred)(10) у вуфер// impnum у вуфер кількість імпульсів датчика за час 0.6 сек
call L_004C ; на процедурку перевірка чи цифра не дорівнює #= 10 ( із поверненням сюда )
movwf 0x26 ;повернулися+ скинули вуфер у змінну- маску Сотень (0x12)
movf 0x23,W ;вуфер у змінну десятки dig_D (Diked)(0F)
call L_004C ; на процедурку перевірка чи цифра не дорівнює #= 10 ( із поверненням сюда )
movwf 0x25 ;повернулися+ скинули вуфер у змінну- маску Десятків (0x11)
bsf 0x21,0 ; встановити impnumb/hdnull біт №<0> у 1 // hdnull (0x0D) сотні і десятки нулі = 0.0.9. км/г == " . .9." км/г
movf 0x22,W ; значення зміної одиниці dig_U (Units)(0E) у вуфер
call L_004C ; на процедурку перевірка чи цифра не дорівнює #= 10 ( із поверненням сюда )
movwf 0x27 ;повернулися+ скинули вуфер у змінну- маску Одиниць (0x13)
goto L_0015 ; НАЗАД, на Основний ЦИКЛ програми...---------------------------------------------------
L_004C: ; перевірка чи цифра не дорівнює #= 10
sublw 0x0A ;b'0000 1010',' ',.10 ==> W =.10 - W і чи (W)=0 ??? , від .10 відняти вуфер, результат у вуфер, 10-10=0 ???
btfss STATUS,Z ; і чи вуфер (W)=0 ??? --> STATUS, біт 'Z' №<2> = 1 ???( Z=1 -- 0-нульвий результат // провірити чи не було часом 0-львого результату після віднімання?)
goto L_0051 ; Z=1 Ні, на перекодування із .10 числення для 7-ми сеґм. індикатора (бо 10 {дві цифри 1 та 0} в одну цифру 8 ну ніяк невлізуть для виводу на індикатор...)
btfss 0x21,0 ; Z=1 Так,0-нульвий результат -- змінна одиниці dig_U = 0 то ґовту на БЛАНК == вивести пусту цифру
goto L_0054 ; hdnull<0>=0, перейти на БЛАНК (гастить всі сегменти одної Цифри 8 .) щоб несвітилися непотрібні нулі
L_0051: ;БЛАНК , вивести пусту цифру
bsf 0x21,0 ;змінна hdnull <0>=1 , встановити у змінній impnumb біт <0> в = 1 , (0000 0000 --» 0000 0001)
call L_0056 ; CALL ТАблиця 7-сеґментного коду
return ; повернутися із підпрограми назад
L_0054: ;МІТКА погасити всі діоди
movlw 0xFE ;b'1111 1110','ю',.254 БЛАНК: 11111110 у вуфер ( погасити всі діоди == вивести пусту цифру )
return ; повернутися із підпрограми
L_0056: ;МІТКА - Таблиця перекодіровок на 7-ми сеґментний індикатор
andlw 0x0F ;b'0000 1111',' ',.15 побітне "І" константи "0000 1111" та вуфера
addwf PCL,F ; додати до лічильника операцій адресу стрічки із вуфера (щоб взяти потрібну мені зараз цифру...)
retlw 0x02 ;b'0000 0010',' ',.02 0 (0= світить // 1= +5v несвітить сегмент)
retlw 0x9E ;b'1001 1110','ћ',.158 1 (0= світить // 1= +5v несвітить сегмент)
retlw 0x24 ;b'0010 0100','$',.36 2 (0= світить // 1= +5v несвітить сегмент)
retlw 0x0C ;b'0000 1100',' ',.12 3 (0= світить // 1= +5v несвітить сегмент)
retlw 0x98 ;b'1001 1000','',.152 4 (0= світить // 1= +5v несвітить сегмент)
retlw 0x48 ;b'0100 1000','H',.72 5 (0= світить // 1= +5v несвітить сегмент)
retlw 0x40 ;b'0100 0000','@',.64 6 (0= світить // 1= +5v несвітить сегмент)
retlw 0x1E ;b'0001 1110','',.30 7 (0= світить // 1= +5v несвітить сегмент)
retlw 0x00 ;b'0000 0000',' ',.00 8 (0= світить // 1= +5v несвітить сегмент)
retlw 0x08 ;b'0000 1000',' ',.08 9 (0= світить // 1= +5v несвітить сегмент)
retlw 0x7E ;b'0111 1110','~',.126 "" a (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xBE ;b'1011 1110','ѕ',.190 *| b (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xDE ;b'1101 1110','Ю',.222 .| c (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xEE ;b'1110 1110','о',.238 _ d (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xF6 ;b'1111 0110','ц',.246 .| e (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xFA ;b'1111 1010','ъ',.250 *| f (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xFC ;b'1111 1100',' ',.252 - g (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ... Вже тире "-" ввів перше
retlw 0xFE ;b'1111 1110','ъ',.254 " " (0= світить // 1= +5v несвітить сегмент) "Пустишка"
retlw 0x30 ;b'0011 0000','',.48 Р (0= світить // 1= +5v несвітить сегмент) ...
retlw 0x88 ;b'1000 1000','',.136 у (0= світить // 1= +5v несвітить сегмент) ...
retlw 0x98 ;b'1001 1000','',.152 Ч (0= світить // 1= +5v несвітить сегмент) ...
END
; -----------------------------------------------------
; опис своїх змінних
;count1 equ 0x0С 0x20 ;count1 це кількість разів по 32мс від таймера TMR0, і чекаємо коли буде 40 разів (.40=28h)(40мс * 32 = 1300 мс) // (60мс * 10 = 600 мс) (28h*2=50h)
;impnum equ 0x0D 0x21 ;impnum -[кількість імпульсів датчика за час 1.3 сек] //hdnull (0x0D) сотні і десятки нулі// ?
;dig_U O equ 0x0E 0x22 ; одиниці (Units) порозрядний лічильник для Одиниць --це кількість імпульсів датчика за час 1.3 сек
;одиниці dig_U (Units)(0E) ok
;dig_D D equ 0x0F 0x23 ; десятки (Diked) порозрядний лічильник для Десятків --це кількість імпульсів датчика за час 1.3 сек
; десятки dig_D (Diked)(0F) ok
;dig_H S equ 0x10 0x24 ; сотні (Hundred) порозрядний лічильник для Сотень --це кількість імпульсів датчика за час 1.3 сек
; сотні dig_H (Hundred)(10) ok
;O_dinam equ 0x13 0x25 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Одиниці// вуфер у змінну -» Одиниці (0x13)//
; одиниці (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
;D_dinam equ 0x11 0x26 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Десятки// вуфер у змінну -» Десятки (0x11)
;десятки (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
;S_dinam equ 0x12 0x27 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Сотні// вуфер у змінну -» Сотні (0x12)
;сотні (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
;nomAnod equ 0x14 0x28 ; № анода/№ цифри яка зараз світить цифри (розряди № 1/2/3)
+ ще оприлюднюю ісходніки програми на асемблері! аж 370 стрічок написав....

*****************************************************
; Програма спідометра 888 із Внутрішнім підпрограмою-драйвером для Динамічної індикації цифр.
;***********************************
; list p=16F628A
list p=16F628
#include <p16f628.inc>
errorlevel -302
;__config 0x3ffe ; ок ? + внутрішній кварц на 4 МГц
; Біти конфігурації __CONFIG 3F10h
;__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _INTOSC_OSC_NOCLKOUT
__CONFIG 3F10h ; ВКЛЮЧЕНО Павер Ап Таймер + внутрішній кварц (intClock 1/0) + mclear підключений до +5 В через резистор 680 Ом
;--Register Definitions--
;W EQU 0x00
;F EQU 0x01
;--Register Files--
;INDF EQU 0x00
;TMR0 EQU 0x01
;PCL EQU 0x02
;STATUS EQU 0x03
;FSR EQU 0x04
;PORTA EQU 0x05
;PORTB EQU 0x06
;EEDATA EQU 0x08
;EEADR EQU 0x09
;PCLATH EQU 0x0A
;INTCON EQU 0x0B
;OPTION_REG EQU 0x81
;TRISA EQU 0x05
;TRISB EQU 0x06
;EECON1 EQU 0x08
;EECON2 EQU 0x09
;--STATUS bits--
;C EQU 0x00
;DC EQU 0x01
;Z EQU 0x02
;NOT_PD EQU 0x03
;NOT_TO EQU 0x04
;RP0 EQU 0x05
;RP1 EQU 0x06
;IRP EQU 0x07
;--INTCON bits--
;RBIF EQU 0x00
;INTF EQU 0x01
;T0IF EQU 0x02
;RBIE EQU 0x03
;INTE EQU 0x04
;T0IE EQU 0x05
;EEIE EQU 0x06
;GIE EQU 0x07
;--OPTION_REG bits--
;PS0 EQU 0x00
;PS1 EQU 0x01
;PS2 EQU 0x02
;PSA EQU 0x03
;T0SE EQU 0x04
;T0CS EQU 0x05
;INTEDG EQU 0x06
;NOT_RBPU EQU 0x07
;--EECON1 bits--
;RD EQU 0x00
;WR EQU 0x01
;WREN EQU 0x02
;WRERR EQU 0x03
;EEIF EQU 0x04
; __config 0x3ff2
; __config 0x3f10h
; опис своїх змінних:
count1 equ 0x20 ; 0x0C count1 це кількість разів по 32мс від таймера TMR0, і чекаємо коли буде 40 разів (.40=28h)(40мс * 32 = 1300 мс) // (60мс * 10 = 600 мс) (28h*2=50h)
hdnull equ 0x21 ;impnum -[кількість імпульсів датчика за час 1.3 сек] //hdnull (0x0D) сотні і десятки нулі// ?
dig_O equ 0x22 ;0x0E одиниці (Units) порозрядний лічильник для Одиниць --це кількість імпульсів датчика за час 1.3 сек
;одиниці dig_U (Units)(0E) ok
dig_D equ 0x23 ;0x0F десятки (Diked) порозрядний лічильник для Десятків --це кількість імпульсів датчика за час 1.3 сек
; десятки dig_D (Diked)(0F) ok
dig_S equ 0x24 ;0x10 сотні (Hundred) порозрядний лічильник для Сотень --це кількість імпульсів датчика за час 1.3 сек
; сотні dig_H (Hundred)(10) ok
O_dinam equ 0x27 ;0x13 записати у зміннну посегментний код для швидкого виводу у PORTB цифри Одиниці// вуфер у змінну -» Одиниці (0x13)//
; одиниці (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
D_dinam equ 0x25 ;0x11 записати у зміннну посегментний код для швидкого виводу у PORTB цифри Десятки// вуфер у змінну -» Десятки (0x11)
;десятки (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
S_dinam equ 0x26 ;0x12 записати у зміннну посегментний код для швидкого виводу у PORTB цифри Сотні// вуфер у змінну -» Сотні (0x12)
;сотні (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
nomAnod equ 0x28 ;0x14 № анода/№ цифри яка зараз світить цифри (розряди № 1/2/3)
iniTMR equ d'022'
;*** Programm dump ***
org 0x0000 ;Start address
;------------------------------------------------
;Ініціалізація ВНУТРІШНій тактовий генератор (OSCF = 0->32KHz /OSCF=1 -->4MHz)
BCF STATUS, RP1 ;Вибір банка RP1 ->0
BCF STATUS, RP0 ;Вибір банка 0 // БІТ Kлєар RP0 // обнулити Біт RP0 в =0
BSF STATUS, RP0 ;Вибір банка 1 // БІТ Sет RP0 // встановити Біт RP0 в =1
BSF PCON, OSCF ;ВСТАНОВИТИ БІТ OSCF =1 (=0->32KHz/=1 -->4MHz) //ВСТАНОВИТИ БІТ OSCF =0 ---ok при +3 v
;------------------------------------/////////////
; Очистка Sys регістрів (провсяк випадок, ну мало що йому клемане при старті...)
clrf PORTA ; очистити/обнулити ПОЧИСТИТИ PORTA = 00h (ІНІЦІАЛІЗАЦІЯ защолок PORTA)
clrf PORTB ; очистити/обнулити ПОЧИСТИТИ PORTB = 00h (ІНІЦІАЛІЗАЦІЯ защолок PORTB)
clrf INTCON ; очистити/обнулити регістр INTCON
clrf TMR0 ; очистити/обнулити TMR0
clrwdt ; очистити/обнулити wdt, сторожовий пес по живленню (при включченні проца 72млс затримка)
;------------- sys регістр INTCON -----------------------/////////////
; MOVLW B'01010101'
; ¦¦¦¦¦¦¦¦
; ¦¦¦¦¦¦¦+- RBIF флажок преривання по зміні сигналу на порті B
; ¦¦¦¦¦¦+-- INTF флажок преривання по входу RB0/INT
; ¦¦¦¦¦+--- T0IF флажок преривання по переповненню таймера T0
; ¦¦¦¦+---- RBIE разрешение преривання по изменению на порте B
; ¦¦¦+----- INTE дозволено преривання по входу RB0/INT
; ¦¦+------ T0IE дозволено преривання по переполнению T0
; ¦+------- PEIE дозволено преривання від переферійних пристроїв
; +-------- GIE глобальне преривання преривань
; MOVWF INTCON
;
;*** Ініціалізація порта А як цифровий вивід/вхід
; (невикористовувати компаратори)
BCF STATUS, RP0 ;Вибір банка 0 ***
CLRF PORTA ;ПОЧИСТИТИ PORTA = 00h (ІНІЦІАЛІЗАЦІЯ защолок PORTA)
MOVLW 0x07 ; біти конфігурації для CMCON // (невикористовувати компаратори)
MOVWF CMCON ;канали PORTA цифрові входи/виходи
BCF STATUS,RP1
BSF STATUS,RP0 ;Вибір банка 1
MOVLW B'00000000' ; всі ножки ПОРТА на вивід
; № біта^ 76543210 (якщо 1 -працює на вхід сигналу від кнопки/датчика, 0- як нога-вивід інформації)
; ¦¦¦¦¦¦¦+- RA0 (лапка №17) незадіяна (тому заземлити провсяк випадок...)
; ¦¦¦¦¦¦+-- RA1 (лапка №18) Цифра 2
; ¦¦¦¦¦+--- RA2 (лапка №1) Цифра 1
; ¦¦¦¦+---- RA3 (лапка №2) Цифра 3
; ¦¦¦¦
; ¦¦¦+----- RA4 (лапка №3) незадіяна (тому заземлити провсяк випадок...)
; ¦¦+------ RA5 (лапка №4) {MCLEAR} (завжди читаються як '0'{0 як вихід})
; ¦+------- RA6 (лапка №15) (завжди читаються як '0'{0 як вихід}) незадіяна (тому заземлити провсяк випадок...)
; +-------- RA7 (лапка №16) (завжди читаються як '0'{0 як вихід}) незадіяна (тому заземлити провсяк випадок...)
MOVWF TRISA ;Загpузити B'00000000' в pегістp TRISA / НАРЕШТІ настроїли :)
; BCF STATUS, RP0 ; вибрати назад банк 0 (там є пам’ять для моїх змінних) ***
;***************
;****Ініціалізація порта В **
; BCF STATUS, RP0 ;Вибір банка 0 ***
; CLRF PORTB ;ПОЧИСТИТИ PORTB = 00h (ІНІЦІАЛІЗАЦІЯ защолок PORTA)
; BCF STATUS,RP1
; BSF STATUS,RP0 ;Вибір банка 1 // то всьо вже зробили спочатку...
; коли була " Очистка Sys регістрів "
MOVLW B'00000001' ;всі ножки ПОРТB на вивід,крім <RB0>--працює як вхід із датчика швидкості
; № біта^ 76543210 (1-працює на вхід сигналу від кнопки/датчика, 0- як ноги-виходи, на індикатор)
; ¦¦¦¦¦¦¦+- RB0 (лапка №6) із датчика спідометра//( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦¦¦¦¦¦+-- RB1 (лапка №7) сегмент А//( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦¦¦¦¦+--- RB2 (лапка №8) сегмент B//( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦¦¦¦+---- RB3 (лапка №9) сегмент C//( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦¦¦+----- RB4 (лапка №10) сегмент D // ( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦¦+------ RB5 (лапка №11) сегмент E // ( читаються якщо '0' вивід-->інфомації/1 = вхід)
; ¦+------- RB6 (лапка №12) сегмент F // ( читаються якщо '0' вивід-->інфомації/1 = вхід)
; +-------- RB7 (лапка №13) сегмент G // ( читаються якщо '0' вивід-->інфомації/1 = вхід)
MOVWF TRISB ;Загpузити B'00000000' в pегістp TRISB / НАРЕШТІ настроїли :)
;
; BCF STATUS,RP0 ; вибрати назад банк 0 (там є пам’ять для моїх змінних) <<<
;**************настройки для PIC16F84 *********************************************************************
; Очистка Sys регістрів (провсяк випадок, ну мало що йому клемане при старті...)
; clrf PORTA ; очистити/обнулити
; clrf PORTB ; очистити/обнулити
; clrf INTCON ; очистити/обнулити
; clrf TMR0 ; очистити/обнулити
; clrwdt ; очистити/обнулити wdt
;--------------------------------
; bsf STATUS,RP0 ; вибрати банк 1
; movlw b'00000000' ;0x00 b'0000 0000',' ',.00 всі ножки ПОРТА на вивід //константу у вуфер
; b'0000 0000' (1-працює на вхід сигналу від кнопки/датчика, 0- як ноги-виходи)
; № 7654 3210
; movwf TRISA ; застосувати зміни для PORTA (вуфер у защолку/настройку портаА)
; movlw b'00000001' ;0x01 b'0000 0001',' ',.01 '00000001' всі ножки на вивід,крім <RB0>--працює як вхід із датчика швидкості //константу у вуфер
; b'0000 0001' (1-працює на вхід сигналу від кнопки/датчика, 0- як ноги-виходи)
; № 7654 3210
; movwf TRISB ; застосувати зміни для PORTB (вуфер у защолку/настройку портаБ)
;************/ END *******настройки для PIC16F84 //// END *****************************************************
; Ініціалізація таймера (і його передподільника 1:128 ) // '..0111'--> 1:256
movlw b'01000110' ;0x46 b'0100 0110','F',.70 1:128 передподільник //константу у вуфер
movwf OPTION_REG ;MOVWF TMR0 ; у таймер TMR0, t i = (1/4МГц~= 1 ) * 128(вибрали Такий предподільник 1:128) * (256 - 70 = 186) //= 0,97656 *128 *186 = 181.64 мкс ~= 0.182 млс *128= 23.3 млс (=0.023 сек)
;Регистр OPTION // OPTION_REG :
; b'0001 0110' = .22 = (0x16h)
; № 7654 3210 Регистр OPTION_REG :
; |||| ||||_ PS0=0 параметр для передподільника
; |||| |||__ PS1=1 параметр для передподільника
; |||| ||___ PS2=1 параметр для передподільника == '..110' --- 1:128 // '..111' --- 1:256
; |||| |____ PSA=0 --- подільник включений перед/для TMR0 // =1 для Сторожового Пса (WDT)- дає затримку в 72млс при включенні для зарядки конденсаторів чи що...
; ||||
; ||||______ T0SE=1 1--по спаду фронту на ножці RA4/T0CKI ( Вибір фронту приросту лічилника TMR0 при зовнішньому тактовому сигналі)// 0-- по передньому фронту
; |||_______ T0CS=0 (Вибір тактового сигналу для TMR0) 0--внутрішній тактовий сигнал CLKOUT // 1-зовнішній тактовий сигнал із ножки RA4/T0CKI
; ||________ INTEDG=0 преривання (=1 --по передньому// =0 --по задньому) фронту сигналу
; |_________ NOT_RBPU=0 0--підтягуючі резистори включені на ножках PORTB / =1 -вимкнені.
bcf STATUS,RP0 ; вибрати назад банк 0 (там є пам’ять для моїх змінних)
;********************************************************************
;Закіньчили настройки, тепер моя прога
;Запис початкових значень у змінні <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<,,,,
;
;********************************************************************
;Запис початкових значень у змінні
movlw 0x02 ;b'0000 0010',' ',.02 ,записати номер Активної/Висвічуваної вже цифри (для виводу 3-х нулів "оOо")
;// 2-га ножка ПортаА є активна (+5 В, решта +0 В).
movwf 0x28 ; вуфер у змінну segcod (0x14) номер Активної/Підсвічуваної вже цифри // (номер цифри № 1/2/3) [№3/2/1]
movlw 0x02 ;b'0000 0010',' ',.02 ,записати код посегментний для "о" (для виводу 3-х нулів "оOо")//значення-константу у вуфер
movwf 0x26 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Сотні// вуфер у змінну -» Сотні (0x12)
;// вуфер-» Сотні (0x12) [кількість імпульсів датчика за час 1.3 сек]
movlw 0x02 ;b'0000 0010',' ',.02 ,записати код посегментний для "0" (для виводу 3-х нулів "оOо")
movwf 0x25 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Десятки// вуфер у змінну -» Десятки (0x11)
;// вуфер-» Десятки (0x11) [кількість імпульсів датчика за час 1.3 сек]
movlw 0x02 ;b'0000 0010',' ',.02 ,записати код посегментний для "о" (для виводу 3-х нулів "оOо")
; (0--світить , 1--погашений сегмент)// значення-константу "Погасити всі сеґменти" у вуфер
movwf 0x27 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Одиниці// вуфер у змінну -» Одиниці (0x13)
;// вуфер-» Одиниці (0x13) [кількість імпульсів датчика за час 1.3 сек]
; Основна прога (Цикл бескінечний)------------------------------------
L_0015: ; Основний ЦИКЛ програми...---------------------------------------------------
;берем 10 і пишемо у порозрядний лічильник для Одиниць,Десятків,Сотень (якби обнуляєм його... бо 0-імпульсів ше неприходило...)
movlw 0x0A ;b'0000 1010',' ',.10 константу ".10" у ввуфер
movwf 0x22 ; одиниці (Units) порозрядний лічильник для Одиниць --це кількість імпульсів датчика за час 1.3 сек
movwf 0x23 ; десятки (Diked) порозрядний лічильник для Десятків --це кількість імпульсів датчика за час 1.3 сек
movwf 0x24 ; сотні (Hundred) порозрядний лічильник для Сотень --це кількість імпульсів датчика за час 1.3 сек
movlw 0x28 ;b'0010 1000','(',.40 разів по 32,5 млс (від TMR0) * 40 = 1300 млс (1.3 сек) //константу ".40" у ввуфер
movwf 0x20 ;count1 -це кількість разів по 32,5 млс від таймера TMR0, і чекаємо коли буде 40 разів (32.5млс * 40 = 1300 млс)==1.3 сек // count1 equ 0x0C
bcf INTCON,INTF ; обнулити в регістрі INTCON біт INTF ( обнулити = переривання ще небуло)
;обнулити провсяк-випадок флажок переривання які приходять із ножки <RB0> (імпульс від спідометра)
L_001C: ; Сюда йде прога після любого переривання (по RB0 сигнал датчика або по переповненню таймера TMR0 ) //адрес 0x1C
;Приймем тактову частоту - Fтакт. = 4,096 МГц (стандартний кварц). Тоді час циклу буде: t c = 1 / Fтакт. * 4 = 0,97656 мкс //
; данні взяв звідси: http://radio-konst.narod.ru/moi_konstru ... prosto.htm
movlw 0x9F ;b'1001 1111','џ',.159 '...111'--» це подільник на 1:256 для таймера(TMR0) / константа iniTMR
; movlw b'01000110' ;0x46 b'0100 0110','F',.70 '...111'--» це подільник на 1:128 для таймера(TMR0) / константа iniTMR
; movlw b'00010110' ; = .22 = (0x16h) ше раз ініціалізація для таймера....(предподільники і так далі, регіст INTCON)
; movlw iniTMR ;
movwf TMR0 ; записати значення у TMR0 затримка =(1/10)*4*(1*256)*(256)=26 млс
; movwf OPTION_REG
bcf INTCON,T0IF ;обнулити біт INTCON <2> , якщо = 1-було переповнення TMR0 // 0-переповнення TMR0 не було. ; обнулити біт T0IF для TMR0 (T0IF =1 якшо є // T0IF =0 ще небуло) переривання/переповнення TMR0
L_001F: ; ПРОЦЕДУРКА розбиття числа/шидкості на 3-ри сегменти індикатора (3-три розряди 2-йково--10-ткового перетворення)
btfss INTCON,INTF ;1) біт INTF №<1>=1 ? був сигнал від датчика? ( прерывания на выводе RB0/INT?)
goto L_002E ;2)INTF №<1>=0 небуло, йдем провірим таймер (і так довго і нудно ковбасимось...)
decfsz 0x22,F ;INTF №<1>=1, iff dig_U = dig_U -1, і пропустити нижню команду якщо dig_U = 0 (Одиниці)
goto L_002D ; IF dig_U #=0 ,на підпрограмку "якщо 0 то обнуляєм INTF = 0 --зовнішнього преривання не було"
movlw 0x0A ; IF dig_U =0 ,константу '.10' в (W) Вуфер // b'0000 1010',' ',.10
movwf 0x22 ; вуфер в флажок Одиниць dig_U
decfsz 0x23,F ; iff , dig_D = dig_D -1, і пропустити нижню команду якщо dig_D = 0 (Десятки)
goto L_002D ; IF dig_D #=0 ,на підпрограмку "якщо 0 то обнуляєм INTF = 0 --зовнішнього преривання не було"
movlw 0x0A ; IF dig_D =0 ,константу '.10' в (W) Вуфер ;b'0000 1010',' ',.10
movwf 0x23 ; вуфер в флажок Десятків dig_D ; // сотні (Hundred)
decfsz 0x24,F ; iff , dig_H = dig_H -1, і пропустити нижню команду якщо dig_H = 0 (Сотні)
goto L_002D ; IF dig_H #=0 ,на підпрограмку "якщо 0 то обнуляєм INTF = 0 --зовнішнього преривання не було"
movlw 0x0A ; IF dig_H =0 ,константу '.10' в (W) Вуфер ;b'0000 1010',' ',.10
movwf 0x24 ; вуфер в флажок Сотень dig_H ; // impnum == кількість імпульсів датчика за час 0.6 сек //або сотні
L_002D: ;ПРОЦЕДУРКА якщо цифра=0 то обнуляєм INTF = 0 --зовнішнього преривання не було від ножки RB0/INT //то значить був імпульс від датчика швидкості
bcf INTCON,INTF ;обнулити мітку/біт переривань (біт преривання на виводі RB0/INT)
L_002E: ;ПРОЦЕДУРКА провірка таймера TMR0, якщо НЕ #=0
btfss INTCON,T0IF ; 3) INTCON <2> =1 ? (T0IF =1 якшо є // T0IF =0 ще небуло) переривання/переповнення TMR0
goto L_001F ; 4)ні, T0IF =0 ще небуло, то вертаємося/йдемо далі чекати/ковбаситися на 1)...4)
bcf STATUS,C ; так, T0IF =1 якшо є, очистити у STATUS, біт С (флажок переносу =0 -- небуло переносу ) // (пропустити команду goto ...) і приступити до очистки STATUS, біт С
rrf 0x28,F ; Циклічний зсув Вправо 0x14, через перенос. (розряди № 1/2/3)
btfss 0x28,0 ; iif 0x14,біт №<0> =1 ?
goto L_0038 ; ні #=1, то йдемо виводити у порт циферку ???
movlw 0x08 ; ТАК =1, b'0000 1000',' ',.08 , ТАК =1,
movwf 0x28 ; вуфер у змінну 0x14
movlw 0x28 ;b'0001 0100','',.20 константу 0x14 у вуфер
movwf FSR ; константу/адрес 14h у FSR ( '00010100' ) (Регістр адресу при безпосередній адресації)
L_0038: ; вивід у порт циферки + перезаливка цифр у інші змінні 0x12-сотні/0x11-десятки/0x13-одиниці (для ДинамічноїІндикації)
clrf PORTA ; чистимо PORTA
decf FSR,F ; FSR = FSR-1 означає вибрати іншу змінну із пам’яті по меншому адресу (АДРЕС-1)
; FSR =змінній за адресом[0x11-0x12-0x13] (Десятки/Сотні/Одиниці)
movf INDF,W ; витягуємо із пам’яті маску анодів наступного розряду (Одиниці/Десятки/Сотні)
;// переслати значення змінної яка находиться за адресом в FSR =змінній за адресом[0x11-0x12-0x13] у Вуфер ->
movwf PORTB ; Вуфер у PORTB
movf 0x28,W ; змінну 0x14 у Вуфер -> (світять покишо Одиниці = 0 , вивід 1-дного 0-ля замість 3-х нулів 000)
movwf PORTA ; Вуфер у PORTA (розряди № 1/2/3)
decfsz 0x20,F ;провірити Умову(нижче), та Зробити count1=count1-1 це кількість разів по 10мс (колись по 60мс від таймера TMR0, і чекаємо коли буде 10разів (60мс * 10 = 600 мс))
goto L_001C ; Поки/коли count1 #=0 ,на підпроґ. ms600 [і там iniTMR ] // але НЕ за наступною цифрою/розрядом
clrf 0x21 ; якщо count1= 0 , очистити impnumb/hdnull (0x0D) , сотні нулі (отже несвітяться)
movf 0x24,W ; переслати Сотні dig_H (Hundred)(10) у вуфер// impnum у вуфер кількість імпульсів датчика за час 0.6 сек
call L_004C ; на процедурку перевірка чи цифра не дорівнює #= 10 ( із поверненням сюда )
movwf 0x26 ;повернулися+ скинули вуфер у змінну- маску Сотень (0x12)
movf 0x23,W ;вуфер у змінну десятки dig_D (Diked)(0F)
call L_004C ; на процедурку перевірка чи цифра не дорівнює #= 10 ( із поверненням сюда )
movwf 0x25 ;повернулися+ скинули вуфер у змінну- маску Десятків (0x11)
bsf 0x21,0 ; встановити impnumb/hdnull біт №<0> у 1 // hdnull (0x0D) сотні і десятки нулі = 0.0.9. км/г == " . .9." км/г
movf 0x22,W ; значення зміної одиниці dig_U (Units)(0E) у вуфер
call L_004C ; на процедурку перевірка чи цифра не дорівнює #= 10 ( із поверненням сюда )
movwf 0x27 ;повернулися+ скинули вуфер у змінну- маску Одиниць (0x13)
goto L_0015 ; НАЗАД, на Основний ЦИКЛ програми...---------------------------------------------------
L_004C: ; перевірка чи цифра не дорівнює #= 10
sublw 0x0A ;b'0000 1010',' ',.10 ==> W =.10 - W і чи (W)=0 ??? , від .10 відняти вуфер, результат у вуфер, 10-10=0 ???
btfss STATUS,Z ; і чи вуфер (W)=0 ??? --> STATUS, біт 'Z' №<2> = 1 ???( Z=1 -- 0-нульвий результат // провірити чи не було часом 0-львого результату після віднімання?)
goto L_0051 ; Z=1 Ні, на перекодування із .10 числення для 7-ми сеґм. індикатора (бо 10 {дві цифри 1 та 0} в одну цифру 8 ну ніяк невлізуть для виводу на індикатор...)
btfss 0x21,0 ; Z=1 Так,0-нульвий результат -- змінна одиниці dig_U = 0 то ґовту на БЛАНК == вивести пусту цифру
goto L_0054 ; hdnull<0>=0, перейти на БЛАНК (гастить всі сегменти одної Цифри 8 .) щоб несвітилися непотрібні нулі
L_0051: ;БЛАНК , вивести пусту цифру
bsf 0x21,0 ;змінна hdnull <0>=1 , встановити у змінній impnumb біт <0> в = 1 , (0000 0000 --» 0000 0001)
call L_0056 ; CALL ТАблиця 7-сеґментного коду
return ; повернутися із підпрограми назад
L_0054: ;МІТКА погасити всі діоди
movlw 0xFE ;b'1111 1110','ю',.254 БЛАНК: 11111110 у вуфер ( погасити всі діоди == вивести пусту цифру )
return ; повернутися із підпрограми
L_0056: ;МІТКА - Таблиця перекодіровок на 7-ми сеґментний індикатор
andlw 0x0F ;b'0000 1111',' ',.15 побітне "І" константи "0000 1111" та вуфера
addwf PCL,F ; додати до лічильника операцій адресу стрічки із вуфера (щоб взяти потрібну мені зараз цифру...)
retlw 0x02 ;b'0000 0010',' ',.02 0 (0= світить // 1= +5v несвітить сегмент)
retlw 0x9E ;b'1001 1110','ћ',.158 1 (0= світить // 1= +5v несвітить сегмент)
retlw 0x24 ;b'0010 0100','$',.36 2 (0= світить // 1= +5v несвітить сегмент)
retlw 0x0C ;b'0000 1100',' ',.12 3 (0= світить // 1= +5v несвітить сегмент)
retlw 0x98 ;b'1001 1000','',.152 4 (0= світить // 1= +5v несвітить сегмент)
retlw 0x48 ;b'0100 1000','H',.72 5 (0= світить // 1= +5v несвітить сегмент)
retlw 0x40 ;b'0100 0000','@',.64 6 (0= світить // 1= +5v несвітить сегмент)
retlw 0x1E ;b'0001 1110','',.30 7 (0= світить // 1= +5v несвітить сегмент)
retlw 0x00 ;b'0000 0000',' ',.00 8 (0= світить // 1= +5v несвітить сегмент)
retlw 0x08 ;b'0000 1000',' ',.08 9 (0= світить // 1= +5v несвітить сегмент)
retlw 0x7E ;b'0111 1110','~',.126 "" a (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xBE ;b'1011 1110','ѕ',.190 *| b (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xDE ;b'1101 1110','Ю',.222 .| c (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xEE ;b'1110 1110','о',.238 _ d (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xF6 ;b'1111 0110','ц',.246 .| e (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xFA ;b'1111 1010','ъ',.250 *| f (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ...
retlw 0xFC ;b'1111 1100',' ',.252 - g (0= світить // 1= +5v несвітить сегмент) пробіжка по сеґментах ... Вже тире "-" ввів перше
retlw 0xFE ;b'1111 1110','ъ',.254 " " (0= світить // 1= +5v несвітить сегмент) "Пустишка"
retlw 0x30 ;b'0011 0000','',.48 Р (0= світить // 1= +5v несвітить сегмент) ...
retlw 0x88 ;b'1000 1000','',.136 у (0= світить // 1= +5v несвітить сегмент) ...
retlw 0x98 ;b'1001 1000','',.152 Ч (0= світить // 1= +5v несвітить сегмент) ...
END
; -----------------------------------------------------
; опис своїх змінних
;count1 equ 0x0С 0x20 ;count1 це кількість разів по 32мс від таймера TMR0, і чекаємо коли буде 40 разів (.40=28h)(40мс * 32 = 1300 мс) // (60мс * 10 = 600 мс) (28h*2=50h)
;impnum equ 0x0D 0x21 ;impnum -[кількість імпульсів датчика за час 1.3 сек] //hdnull (0x0D) сотні і десятки нулі// ?
;dig_U O equ 0x0E 0x22 ; одиниці (Units) порозрядний лічильник для Одиниць --це кількість імпульсів датчика за час 1.3 сек
;одиниці dig_U (Units)(0E) ok
;dig_D D equ 0x0F 0x23 ; десятки (Diked) порозрядний лічильник для Десятків --це кількість імпульсів датчика за час 1.3 сек
; десятки dig_D (Diked)(0F) ok
;dig_H S equ 0x10 0x24 ; сотні (Hundred) порозрядний лічильник для Сотень --це кількість імпульсів датчика за час 1.3 сек
; сотні dig_H (Hundred)(10) ok
;O_dinam equ 0x13 0x25 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Одиниці// вуфер у змінну -» Одиниці (0x13)//
; одиниці (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
;D_dinam equ 0x11 0x26 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Десятки// вуфер у змінну -» Десятки (0x11)
;десятки (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
;S_dinam equ 0x12 0x27 ;записати у зміннну посегментний код для швидкого виводу у PORTB цифри Сотні// вуфер у змінну -» Сотні (0x12)
;сотні (треба шоб виводити по сто раз на секунду для динамічної індикації) Готові шаблони для порта Б
;nomAnod equ 0x14 0x28 ; № анода/№ цифри яка зараз світить цифри (розряди № 1/2/3)
- Вкладення
-
- p16F628A.asm.zip
- прога одним файлом.
- (23.59Кіб)Завантажено 96 разів
Якщо у вас телефон НОВКІА --> то це кінець вашого тюнінґу...
Тоді чого ви тут tuning.lviv.ua?
Тоді чого ви тут tuning.lviv.ua?
- iwanes
- Повідомлень:95
- З нами з:Сер, 13 травня 2009, 11:17
- Ім'я:Іван
- Авто:таврія стара:)
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
- Контактна інформація:
Цифровий спідометр 88 самотушки (+вся приборна панель...)
Вчора довго мучився із прокладянням проводу із датчика баку до приборки (бо небуло контакту! тестер показав розрив...
), прокладав по шині проводів бо халтуру ліпити і класти де попало якось нехотілося...
Це зайняло немало часу (десь весь вечір) із розборкою і доступом до тої шини+ требабуло визначити який провід куда підключається (провсяк випадок. авось там валяється мій вільний/ запасний провід? но як все неповезло і прийшлося тяґнути... а заусєнців скільки
!!! )
Всі з’єнання робив не на халтурних скрутках а поспаював, всьо як проложено.
Ітого потративши цілий вечір зтим всім я зато тепер маю нарешті робочий провід від баку до приборки :)
+ ще була зроблена кнопка "СТАРТ" для пуску двигуна, як в усіх інших нормальних машинах.

Це зайняло немало часу (десь весь вечір) із розборкою і доступом до тої шини+ требабуло визначити який провід куда підключається (провсяк випадок. авось там валяється мій вільний/ запасний провід? но як все неповезло і прийшлося тяґнути... а заусєнців скільки

Всі з’єнання робив не на халтурних скрутках а поспаював, всьо як проложено.

Ітого потративши цілий вечір зтим всім я зато тепер маю нарешті робочий провід від баку до приборки :)
+ ще була зроблена кнопка "СТАРТ" для пуску двигуна, як в усіх інших нормальних машинах.
- Вкладення
-
- зроблена кнопка "СТАРТ" для пуску двигуна.
- 100_6351-400.jpg (36.9Кіб)Переглянуто 3061 разів
-
- нарешті є робочий провід від баку до приборки ...
- 100_6352-.jpg (28.73Кіб)Переглянуто 3060 разів
Якщо у вас телефон НОВКІА --> то це кінець вашого тюнінґу...
Тоді чого ви тут tuning.lviv.ua?
Тоді чого ви тут tuning.lviv.ua?
- qamaster
- Повідомлень:201
- З нами з:П'ят, 30 січня 2009, 17:11
- Ім'я:Степан
- Стать:чоловік
- Авто:Renault Scenic Conquest
- Звідки:Львів
- Дякував (ла): 0
- Подякували: 0
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
Перечитав від початку на одному диханні. Молодець! Як закінчиш постав на конвеєр, від клієнтів відбою не буде. Успіху!
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
iwanes, розкажи як ти зробив кнопку старт а ліпше напиши свій тел
Re: Цифровий спідометр 88 самотушки (+вся приборна панель...)
iwanes это не тюнинг...это полное издевательство над....да над всем
...идея же мне очень интересна...очень...так что если будет первый готовый продукт, пройдет нормальныю проверку я готов профинансировать дальнейшее изготовнения таких панелей....но как говорится всему есть свой предел. Так что Ванька неспеша продолжай в том же направлении. Вопрос..а почему на таврооргии я невидет подобной темы??..я думаю заинтересованых появилось бы поболее... вот и был бы тебе "левый" заработок :).
п.с. Я твоим последним постом вынес себе весь мозк... пытался чтото вспомнить из электроники 10 летней давности и прости но все уж забыто
...
п.с.2. да вот еще по поводу показометра уровня топлива - красный это что "фулл" бак??...1 лампы сигнализирующей о слишком малой заправке и 2-3 о том что скоро будет малый остаток топлива в баке вполне как по мне достаточно, остальное зелененьким. Красный очень "дрючит" глаза.

п.с. Я твоим последним постом вынес себе весь мозк... пытался чтото вспомнить из электроники 10 летней давности и прости но все уж забыто

п.с.2. да вот еще по поводу показометра уровня топлива - красный это что "фулл" бак??...1 лампы сигнализирующей о слишком малой заправке и 2-3 о том что скоро будет малый остаток топлива в баке вполне как по мне достаточно, остальное зелененьким. Красный очень "дрючит" глаза.
Хто зараз онлайн
Зараз переглядають цей форум: Немає зареєстрованих користувачів і 6 гостей