|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:19 am
| Автор |
Съобщение |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
|
| Вто Юли 27, 2010 12:26 pm |
|
 |
|
zle
Ранг: Минаващ
Регистриран на: Чет Мар 11, 2010 12:24 am Мнения: 92
|
съжелявам за не пълната информация  тръгнах да поствам и сорса, обаче го бях затрил малко( то така като всичко се прави на едно мчсто и за това информацията небеше пълна)
ето това е:
#include <16f690.h>
#include <stdio.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOCPD //Data EEPROM Code Protected
#FUSES NOPROTECT //Code protected from reads
#FUSES NOMCLR //Master Clear pin enabled
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //Reset when brownout detected
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A5,rcv=PIN_A4,bits=8 )
void main()
{
int A=0;
set_tris_c(0x00);
set_tris_a(0xff);
while(true)
{
if(!input(PIN_A3))
{
delay_us(16);
A=!A;
}
if(A!=0)
output_c(0x01);
else
output_c(0x02);
}
}
Има бутон включен към А3 и 2 диода към С0 и С1, които трябва да сае превключват при натискане на бутона, но
не всеки път се превключва порт С при натискане на бутона. Понякога само премигва и като се отпусне бутона пак си свети същият диод и като напомпаш 2 3 4 пъти се превключва др и те така постоянно
@head_up не си чешам пръстите просто съм малко разсеян 
|
| Вто Юли 27, 2010 1:58 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Не те разбрах добре какво искаш:
- при всяко натискане на бутона ВЕДНЪЖ да смениш светодиода
или
- докато е натиснат бутона през 16 микросекунди постоянно да сменяш светодиода ?
Добра практика е от време на време да се замисляш ТИ как би се проявил на мястото на процесора - какво би проверил, какво би си запомнил и т.н. После го напиши на някакъв език за програмиране.
|
| Вто Юли 27, 2010 2:45 pm |
|
 |
|
zle
Ранг: Минаващ
Регистриран на: Чет Мар 11, 2010 12:24 am Мнения: 92
|
когато натисна бутонът ако е светил 1 да светне 2 а 1 да изгасне при повторно натискане и отпуускане да изгасне 2 и да светне 1 и така
ами замислиям се , но явно не достатъчно:)
|
| Вто Юли 27, 2010 2:49 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Това на кой ред от сорса да го търся ?
|
| Вто Юли 27, 2010 2:53 pm |
|
 |
|
zle
Ранг: Минаващ
Регистриран на: Чет Мар 11, 2010 12:24 am Мнения: 92
|
еми идеята беше такава поне аз така ги виждах нещата, когато бутонът се натисне А да инвертира съдържанието си ако е било 0 да стане 1 след това да се проверява дали е 0 и ако е нула да свети 1 ако е 1 да свети 2. Обаче явно нетябва да стане така
|
| Вто Юли 27, 2010 3:03 pm |
|
 |
|
Wise
Ранг: Форумен бог
Регистриран на: Нед Дек 19, 2004 6:26 pm Мнения: 1628 Местоположение: Сливен
|
Батето те подсеща, че никъде не чакаш да се отпусне бутона!
След като хванеш натиснат бутон и правиш нещо си, после или чакаш да
се отпусне, или поне докато не се отпусне просто нищо не правиш.
|
| Вто Юли 27, 2010 3:55 pm |
|
 |
|
zle
Ранг: Минаващ
Регистриран на: Чет Мар 11, 2010 12:24 am Мнения: 92
|
да разбрах  малко късно но разбрах  сядам да копая 
|
| Вто Юли 27, 2010 3:57 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Не копай, а програмирай.
|
| Вто Юли 27, 2010 7:54 pm |
|
 |
|
zle
Ранг: Минаващ
Регистриран на: Чет Мар 11, 2010 12:24 am Мнения: 92
|
void main()
{
int A=0;
set_tris_c(0x00);
set_tris_a(0xff);
output_c(0x00);
while(true)
{
if(!input(PIN_A3))
A=!A;
delay_ms(16);
if(!input(PIN_A3))
if(A!=0)
output_c(0x01);
else
output_c(0x02);
if(input(PIN_A3))
delay_ms(16);
}
}
Имам чувството, че съм много глупав  . Ето какво правя проверявам дали бутонът е натиснат ако е натиснат А се инвертира чака се 16ms (някъде пишеше, че толко трябва за премахване на механичните трептения софтуерно), след това проверявам дали бутонът все още е натиснат ако е натиснат се проверява дали А=1 или А=0 и светва съответният диод след това проверявам дали бутонут е отпуснат ако е отпуснат се чака 16мс и пак почва от начало, отново се проверява дали е натиснат бутона ако А=1 става 0 и тн.. Ефектът е следния: Първоначално не свети нищо след това при пурвото натискане и отпускане светва 1 при повторно натискане обаче понякога вместо да се превключи да свети 2, 1 продължава да свети и само примигва 2 и така примерно 2,3,4...n поредни натискания и после превключва няколко пъти от 1 път и после пак така забозва без да превключва  . Извинявам се, че пълня с такива тъпи неща форума обаче ми се иска да мога поне с такива лесни работи да се оправям.
А и ако задържа бутона натиснат 2та диода мигат. Грешката отново е в мене обаче немога да зацепя къде.
|
| Сря Юли 28, 2010 5:04 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Значи ти трябва да го дебоунснеш и в двете посоки. Когато го засечеш натиснат дебоунсваш и чакаш да се отпусне и пак дебоунс. Ако ти се играе можеш да го докараш като клавиатурите. Ама там е малко по дълго.
Евентуално след като се отпусне, може да изчакаш малко повечко до следващо натискане. Тогава няма нужда от деб. след отпускане. Абе има много начини.
|
| Сря Юли 28, 2010 7:17 pm |
|
 |
|
zle
Ранг: Минаващ
Регистриран на: Чет Мар 11, 2010 12:24 am Мнения: 92
|
мерси  сега ще пробвам 
|
| Сря Юли 28, 2010 7:34 pm |
|
 |
|
dan
Ранг: Форумен бог
Регистриран на: Вто Май 29, 2007 2:23 pm Мнения: 3714 Местоположение: Високо в планината
|
Чувствата понякога лъжат! Не са тъпи нещата. Имаш проблем, не можеш сам да го разрешиш- питаш. Ако не се откажеш, когато хората като дядо Боре, батеАз и т.н. погледнат репичките отдолу , ти ще обясняваш на младежи като теб сега как се прави това и онова. (мисля, че даже има рима, ако нема- удари ма!)
Грешката не е в теб, а в програмата. Просто ти си я направил
После има логическа грешка и в твърдението ти- как хем грешката е в теб, хем не знаеш къде е
Дерзай!
_________________ Хайде де!
|
| Чет Юли 29, 2010 11:50 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Бе покажете му на мочето бре, не го мъчете щото като гледам трудно ще се сети, а и май не ви вдява какво искате да кажете.
Има няколко варианта, това е най-простия, съответно неправилния, но стига за да вдянеш идеята.
if(!Input(PIN_A2))
{
delay_ms(10);
if(!input(PIN_A2))
{
while(input(PIN_A2))
A=!A;
delay_ms(10);
}
}
както казах това е най-неправиния начин, първо щото имаш while и ако е в по сложна програма може да си забиеш в тоя while и второ щото тоя метод гълта доста CPU безсмислено, в смисъл седиш в тия изчаквания. Абстрахирайки се от това какво става, чакаш да стане 0, изчакваш 10 мс и проверяваш дали пак си нула, т.е. дали не е отпуснат бутона, ако си пак 0, изчакваш да стане 1-ца, т.е. бутона да се отпусне при което инвертираш променливата и изчакваш още 10 мс.
Това за да стане аккто трябв аима два начина, прекъсване или стейт машина, пускаш еидн таймер да ти цъка и по него вземаш колко ти е родължил импулса, и дали е импулс или е смущение, и може да решиш какво да правиш, дали при отпускане м-у тия 10 мс да анулираш или пък ако е било само вдигане и пак сваляне да го приемеш за натиснат ....
Разбира се тук праивм уточнението че сигнала се генерира /имам в предвид изпълняваш/ чак при отпускане на бутона, може да се направи и само при натискането, това опитай сам да се сетиш как.
|
| Чет Юли 29, 2010 12:39 pm |
|
 |
|
zle
Ранг: Минаващ
Регистриран на: Чет Мар 11, 2010 12:24 am Мнения: 92
|
Мерси Тони. Прекъсване от таймера или порт Б предполагам, а стейт машина какво ще рече 
|
| Чет Юли 29, 2010 2:05 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 4 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|