| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Проблеми със състоянието на PORTD при PIC16F874A http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=2425 |
Страница 1 от 2 |
| Автор: | Ugeen [ Пон Май 29, 2006 10:01 am ] |
| Заглавие: | Проблеми със състоянието на PORTD при PIC16F874A |
Колеги,съгласен съм с критиките които прочетох по адрес на PIC-овете,даже и в момента работя по един проект който ми взе здравето.Ползваm PIC16f874A.На D0 и D1 имам закачено софтуерно i2c. Другите изводи на PORTD управляват светодиоди за индикация на разни състояния. Програмата я писах на MikroC.Състоянието на диодите се опреснява на всяко завъртане на програмата,като преди това се чете от DS1307 по i2c.Проблема е ,че диодите ми светят постоянно ,даже и когато не трябва.Когато забраня четенето от часовника,всичко си е наред и диодите си работят както трябва.Опитах се да съхранявам PORTD и TRISD във временни клетки преди да чета часовника по i2c и след четенето да ги възстановя но нищо не се получава.Знам че ако има входове и изходи на един PORT при тези контролери има големи проблеми,но аз нямам избор защото ми е натоварен процесора.Имате ли идеи как да се справя с този проблем. |
|
| Автор: | ¶ [ Пон Май 29, 2006 11:30 am ] |
| Заглавие: | |
Странен ми се вижда този проблем. Почти никога не съм имал проблем с входове и изходи на един и същи порт, а преди PIC16F874(A) дълго време съм използвал и PIC16C74(A), та се учудвам че едни светодиоди могат да създадат проблем. По логично ми се вижда грешката да е в твоят програма, но без сорс не може да се коментира. |
|
| Автор: | milenjs [ Пон Май 29, 2006 12:07 pm ] |
| Заглавие: | |
Или в компилатора... - огледай асм кода за да видиж какво прави с портовете. Аз лично винаги търся грешката първо в програмата си, процесора си е железен едва ли той ти образува нерви... |
|
| Автор: | evc [ Пон Май 29, 2006 1:25 pm ] |
| Заглавие: | |
Постни малко код и най-вече тази част, която се обръща към PORTD. Софтуерното i2c сам ли си го писал или използваш библиотеката на MikroC-то? |
|
| Автор: | Ugeen [ Пон Май 29, 2006 2:19 pm ] |
| Заглавие: | |
Ползвам готова библиотека на МикроС и много ме съмнява че тя ми порти цялата работа.Иначе i2c-то работи.Като го забраня всичко се оправя и диодите си светят както трябва,а иначе светят постоянно. този модул е I2C-то.Всъщност I2C-то е на 5 и 6 бит от порта. void READ_RTC(void) { Soft_I2C_Config(&PORTD, 5, 6); Soft_I2C_Start(); Soft_I2C_Write(0xd0); Soft_I2C_Write(Address); Soft_I2C_Start(); Soft_I2C_Write(0xd1); Data=Soft_I2C_Read(0); Soft_I2C_Stop(); } // // // // // Декодира данните от клетка Event_temp в която е записана информация кои диоди да //светят, ако е съвпаднало времето от часовника с предварително зададен масив от //константи с времена и събития void Decode(void) { TRISD=0xe0 ; Current_hour=Event_temp&0x07;//current hour if(PORTB.f7==0) {PORTD.f0=0; PORTD.f1=1; } else {PORTD.f0=1; PORTD.f1=0; } if(Event_temp.f3==0) PORTD.f2=1; else PORTD.f2=0;//second bell if(Event_temp.f4==0) PORTD.f3=1; else PORTD.f3=0;//first bell } // // // void main(void) { PORTA=0x00; TRISA=0x00; PORTB=0x00; TRISB=0x80; PORTC=0xff; TRISC=0x00; TRISD=0xe0; PORTD=0x00; PORTE=0x00; TRISE=0x00; while (1) { Address=0x00; READ_RTC(); Sec=Data; Address++; READ_RTC(); Min=Data; Address++; READ_RTC(); Hour=Data; // Compare();//Сравнява сек.,мин.и час с предварително зададени константи и ако //има съвпадение записва данни в клетка Event_temp.(Работи коректно не нужно да го описвам и него ,че много стана) Decode(); } } Когато не се изпълнява модула READ_RTC(); и задам на клетките Hour Min и Sec твърди стойности диодите си работят съгласно събитието зададено в Event_temp,иначе светят постоянно.Часовника се чете ,бях сложил и седемсегментна индикация ,която показваше времето и всичко си е точно,не мога да разбера какво става. |
|
| Автор: | ¶ [ Пон Май 29, 2006 4:09 pm ] |
| Заглавие: | |
Не можеш ли от листинга на асемблера нещо да постнеш ? Така не става ясно какво бърника I2C кода на MikroC . |
|
| Автор: | evc [ Пон Май 29, 2006 4:26 pm ] |
| Заглавие: | |
Библиотеките са им компилирани предварително и асемблерския код мисля не може да се види! Но на мен повече ми прилича на омазана комуникация между часовника и процесора. Не се разбират, а не виждам проверки за акнолидж. |
|
| Автор: | setoy [ Пон Май 29, 2006 4:46 pm ] |
| Заглавие: | |
Нее... единственото хубаво нещо в тоя компилатор е че произвежда доста четим асемблерски код. Верно че библиотеките са компилирани, но той прави и asm. |
|
| Автор: | Ugeen [ Пон Май 29, 2006 5:56 pm ] |
| Заглавие: | |
Не бих казал че асемблера на този компилатор е четим.Много особени подходи има за готовите библиотеки.Опитах се да го погледна но такава каша е генерирало, че се омотах тотално,въпреки че 5 години съм писал на асемблер и то доста по-сложни програми от тази.Веднъж имах подобен проблем с 16F84 .Бях закачил на порта анодите на динамична индикация и в същото време на порта имаше входове.Винаги когато се четеше вход ми нулираше изходите и индикацията гаснеше.Бях намерил писано по този въпрос,но сега не успях да открия това което четох.Не си и спомням как реших проблема тогава,но се сещам че бях се преборил с този проблем и то доста по сложен начин.Сега се обръщам към вас ако някой е патил от това и е намерил по оригинално решение да сподели опита си. |
|
| Автор: | evc [ Вто Май 30, 2006 8:43 am ] |
| Заглавие: | |
@setoy, хайде ако не те затруднява, постни асемблерския код на Soft_I2C_Config например! @ugeen, проблема за който говориш произтича от read performing write метода на обслужване на портовете. Има го описан в дейташийта на всеки процесор. Изразява се в това, че при задаване на ново състояние на порта, процесора първо прочита текущото състояние и ако имаш закачен нискоомен товар (например светодиоди) въпреки, че си задал състоянието на пиновете например "1", той ги прочита като "0" заради светодиодите и по този начин ги гаси. Проблема е решен при 18-та серия с въвеждане на LATH регистри за всеки порт. Но при теб не е това, тъй като по този начин щеше да ти гаси светодиодите, а ти твърдиш, че ги пали. |
|
| Автор: | setoy [ Вто Май 30, 2006 9:14 am ] | |||||||||
| Заглавие: | ||||||||||
Да добавя само - аз този компилатор не го ползвам. Качих го за проба и забравих да го махна;) И като казвам четим asm код, имам предвид точно четим - не разбираем, още по-малко пък оптимален |
||||||||||
| Автор: | setoy [ Вто Май 30, 2006 9:26 am ] |
| Заглавие: | |
... Значи имам някакъв смътен спомен за подобен проблем. Проблема идваше точно от bsf, bcf инструкциите. Ако не се лъжа, тогава смених bsf portb,5 с {movlw 0010000; iorwf portb) и bcf portb,5 с{movlw 11011111; andwf portb) и се оправи. Тъпото в твоя случай е че това значи да си пишеш собствени софтуерни И2Ц функции Аде успех! |
|
| Автор: | evc [ Вто Май 30, 2006 11:41 am ] |
| Заглавие: | |
@setoy, благодаря за кода! Но така като го гледам си е читав отсекъде. Но при него не мисля, че е RPW проблема! |
|
| Автор: | bobyk [ Сря Май 31, 2006 2:15 pm ] |
| Заглавие: | |
Абе какво се занимавате с тея Mikro... Боклук от всякъде, и аз ги ползвах малко и се си общавах че ще ги разкарам от всякъде дето съм ги записал. Пробвай нещо друго... Успех. |
|
| Автор: | perro_iv [ Сря Май 31, 2006 11:13 pm ] |
| Заглавие: | |
Проверил ли си хардуерно, дали всичко е наред. В смисъл, тези диоди и часовника на същата платка ли са, и ако не на какво разстояние и каква е връзката между устройствата. А пък тва да се оплюват пиковете е напълно излишно. Прилича малко на приказката за ракетата и космоса или разни други такива подобни ... |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|