|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 7:58 pm
Проблеми със състоянието на PORTD при PIC16F874A
| Автор |
Съобщение |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
 Проблеми със състоянието на PORTD при PIC16F874A
Колеги,съгласен съм с критиките които прочетох по адрес на PIC-овете,даже и в момента работя по един проект който ми взе здравето.Ползваm PIC16f874A.На D0 и D1 имам закачено софтуерно i2c. Другите изводи на PORTD управляват светодиоди за индикация на разни състояния. Програмата я писах на MikroC.Състоянието на диодите се опреснява на всяко завъртане на програмата,като преди това се чете от DS1307 по i2c.Проблема е ,че диодите ми светят постоянно ,даже и когато не трябва.Когато забраня четенето от часовника,всичко си е наред и диодите си работят както трябва.Опитах се да съхранявам PORTD и TRISD във временни клетки преди да чета часовника по i2c и след четенето да ги възстановя но нищо не се получава.Знам че ако има входове и изходи на един PORT при тези контролери има големи проблеми,но аз нямам избор защото ми е натоварен процесора.Имате ли идеи как да се справя с този проблем.
|
| Пон Май 29, 2006 10:01 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Странен ми се вижда този проблем. Почти никога не съм имал проблем с входове и изходи на един и същи порт, а преди PIC16F874(A) дълго време съм използвал и PIC16C74(A), та се учудвам че едни светодиоди могат да създадат проблем. По логично ми се вижда грешката да е в твоят програма, но без сорс не може да се коментира.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пон Май 29, 2006 11:30 am |
|
 |
|
milenjs
Ранг: Форумен бог
Регистриран на: Сря Мар 08, 2006 2:12 pm Мнения: 2017 Местоположение: Котел
|
Или в компилатора... - огледай асм кода за да видиж какво прави с портовете. Аз лично винаги търся грешката първо в програмата си, процесора си е железен едва ли той ти образува нерви...
|
| Пон Май 29, 2006 12:07 pm |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
Постни малко код и най-вече тази част, която се обръща към PORTD. Софтуерното i2c сам ли си го писал или използваш библиотеката на MikroC-то?
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Пон Май 29, 2006 1:25 pm |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Ползвам готова библиотека на МикроС и много ме съмнява че тя ми порти цялата работа.Иначе 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 2:19 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Не можеш ли от листинга на асемблера нещо да постнеш ? Така не става ясно какво бърника I2C кода на MikroC .
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пон Май 29, 2006 4:09 pm |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
Библиотеките са им компилирани предварително и асемблерския код мисля не може да се види! Но на мен повече ми прилича на омазана комуникация между часовника и процесора. Не се разбират, а не виждам проверки за акнолидж.
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Пон Май 29, 2006 4:26 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Нее... единственото хубаво нещо в тоя компилатор е че произвежда доста четим асемблерски код. Верно че библиотеките са компилирани, но той прави и asm.
|
| Пон Май 29, 2006 4:46 pm |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Не бих казал че асемблера на този компилатор е четим.Много особени подходи има за готовите библиотеки.Опитах се да го погледна но такава каша е генерирало, че се омотах тотално,въпреки че 5 години съм писал на асемблер и то доста по-сложни програми от тази.Веднъж имах подобен проблем с 16F84 .Бях закачил на порта анодите на динамична индикация и в същото време на порта имаше входове.Винаги когато се четеше вход ми нулираше изходите и индикацията гаснеше.Бях намерил писано по този въпрос,но сега не успях да открия това което четох.Не си и спомням как реших проблема тогава,но се сещам че бях се преборил с този проблем и то доста по сложен начин.Сега се обръщам към вас ако някой е патил от това и е намерил по оригинално решение да сподели опита си.
|
| Пон Май 29, 2006 5:56 pm |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
@setoy, хайде ако не те затруднява, постни асемблерския код на Soft_I2C_Config например!
@ugeen, проблема за който говориш произтича от read performing write метода на обслужване на портовете. Има го описан в дейташийта на всеки процесор. Изразява се в това, че при задаване на ново състояние на порта, процесора първо прочита текущото състояние и ако имаш закачен нискоомен товар (например светодиоди) въпреки, че си задал състоянието на пиновете например "1", той ги прочита като "0" заради светодиодите и по този начин ги гаси. Проблема е решен при 18-та серия с въвеждане на LATH регистри за всеки порт. Но при теб не е това, тъй като по този начин щеше да ти гаси светодиодите, а ти твърдиш, че ги пали.
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Вто Май 30, 2006 8:43 am |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
 |  |  |  | Код: ; ASM code generated by mikroVirtualMachine for PIC - V. 5.0.0.2 ; Date/Time: 30.5.2006 ã. 09:07:06 ; Info: http://www.mikroelektronika.co.yu
; ADDRESS OPCODE ASM ; ---------------------------------------------- $0000 $28BD GOTO _main $0004 $ _Delay_1us: ;delays.c,2 :: void Delay_1us() { ;delays.c,3 :: Delay_us(1); $0004 $0000 NOP $0005 $0000 NOP ;delays.c,4 :: } $0006 $0008 RETURN $0007 $ _Soft_I2C_Start: $0007 $1303 BCF STATUS, RP1 $0008 $1283 BCF STATUS, RP0 $0009 $0820 MOVF ___porti2c, 0 $000A $0084 MOVWF FSR $000B $1383 BCF STATUS, 7 $000C $1680 BSF INDF, ____sdai2c $000D $2004 CALL _Delay_1us $000E $1700 BSF INDF, ____scli2c $000F $2004 CALL _Delay_1us $0010 $1280 BCF INDF, ____sdai2c $0011 $2004 CALL _Delay_1us $0012 $1300 BCF INDF, ____scli2c $0013 $0008 RETURN $0014 $ _Soft_I2C_Write: $0014 $3008 MOVLW 8 $0015 $1303 BCF STATUS, RP1 $0016 $1283 BCF STATUS, RP0 $0017 $00A4 MOVWF Soft_I2C_Write_temp_L0 $0018 $01A5 CLRF Soft_I2C_Write_r_L0, 1 $0019 $0820 MOVF ___porti2c, 0 $001A $0084 MOVWF FSR $001B $1383 BCF STATUS, 7 $001C $ L_Soft_I2C_Write_0: $001C $0824 MOVF Soft_I2C_Write_temp_L0, 0 $001D $1903 BTFSC STATUS, Z $001E $2834 GOTO L_Soft_I2C_Write_1 $001F $2004 CALL _Delay_1us $0020 $2004 CALL _Delay_1us $0021 $1300 BCF INDF, ____scli2c $0022 $2004 CALL _Delay_1us $0023 $0DA3 RLF FARG_soft_i2c_write+0, F $0024 $1C03 BTFSS STATUS, 0 $0025 $2829 GOTO l_018 $0026 $1784 BSF FSR, 7 $0027 $1680 BSF INDF, ____sdai2c $0028 $282B GOTO l_01C $0029 $ l_018: $0029 $1784 BSF FSR, 7 $002A $1280 BCF INDF, ____sdai2c $002B $ l_01C: $002B $0000 NOP $002C $2004 CALL _Delay_1us $002D $1700 BSF INDF, ____scli2c $002E $1384 BCF FSR, 7 $002F $1F00 BTFSS INDF, ____scli2c $0030 $282F GOTO $-1 $0031 $1784 BSF FSR, 7 $0032 $03A4 DECF Soft_I2C_Write_temp_L0, 1 $0033 $281C GOTO L_Soft_I2C_Write_0 $0034 $ L_Soft_I2C_Write_1: $0034 $01A5 CLRF Soft_I2C_Write_r_L0, 1 $0035 $2004 CALL _Delay_1us $0036 $0000 NOP $0037 $1300 BCF INDF, ____scli2c $0038 $2004 CALL _Delay_1us $0039 $1680 BSF INDF, ____sdai2c $003A $2004 CALL _Delay_1us $003B $2004 CALL _Delay_1us $003C $1700 BSF INDF, ____scli2c $003D $1384 BCF FSR, 7 $003E $1F00 BTFSS INDF, ____scli2c $003F $283E GOTO $-1 $0040 $01A5 CLRF FLOC_soft_i2c_write+1 $0041 $2004 CALL _Delay_1us $0042 $1384 BCF FSR, 7 $0043 $1A80 BTFSC INDF, ____sdai2c $0044 $1425 BSF FLOC_soft_i2c_write+1, 0 $0045 $2004 CALL _Delay_1us $0046 $2004 CALL _Delay_1us $0047 $2004 CALL _Delay_1us $0048 $2004 CALL _Delay_1us $0049 $2004 CALL _Delay_1us $004A $2004 CALL _Delay_1us $004B $2004 CALL _Delay_1us $004C $2004 CALL _Delay_1us $004D $1784 BSF FSR, 7 $004E $1300 BCF INDF, ____scli2c $004F $1280 BCF INDF, ____sdai2c $0050 $0825 MOVF Soft_I2C_Write_r_L0, 0 $0051 $00F0 MOVWF STACK_0 $0052 $0008 RETURN $0053 $ _Soft_I2C_Read: $0053 $3008 MOVLW 8 $0054 $1303 BCF STATUS, RP1 $0055 $1283 BCF STATUS, RP0 $0056 $00A4 MOVWF Soft_I2C_Read_temp_L0 $0057 $01A5 CLRF Soft_I2C_Read_r_L0, 1 $0058 $0820 MOVF ___porti2c, 0 $0059 $0084 MOVWF FSR $005A $1383 BCF STATUS, 7 $005B $ L_Soft_I2C_Read_2: $005B $0824 MOVF Soft_I2C_Read_temp_L0, 0 $005C $3C00 SUBLW 0 $005D $1803 BTFSC STATUS, C $005E $2871 GOTO L_Soft_I2C_Read_3 $005F $2004 CALL _Delay_1us $0060 $0000 NOP $0061 $1680 BSF INDF, ____sdai2c $0062 $2004 CALL _Delay_1us $0063 $1700 BSF INDF, ____scli2c $0064 $1384 BCF FSR, 7 $0065 $1F00 BTFSS INDF, ____scli2c $0066 $2865 GOTO $-1 $0067 $1A80 BTFSC INDF, ____sdai2c $0068 $1403 BSF STATUS, C $0069 $1E80 BTFSS INDF, ____sdai2c $006A $1003 BCF STATUS, C $006B $0DA5 RLF FLOC_soft_i2c_read+1, F $006C $2004 CALL _Delay_1us $006D $1784 BSF FSR, 7 $006E $1300 BCF INDF, ____scli2c $006F $03A4 DECF Soft_I2C_Read_temp_L0, 1 $0070 $285B GOTO L_Soft_I2C_Read_2 $0071 $ L_Soft_I2C_Read_3: $0071 $1680 BSF INDF, ____sdai2c $0072 $2004 CALL _Delay_1us $0073 $0823 MOVF FARG_soft_i2c_read+0, W $0074 $1903 BTFSC STATUS, 2 $0075 $2877 GOTO L_07C $0076 $1280 BCF INDF, ____sdai2c $0077 $ L_07C: $0077 $0000 NOP $0078 $2004 CALL _Delay_1us $0079 $1700 BSF INDF, ____scli2c $007A $1384 BCF FSR, 7 $007B $1F00 BTFSS INDF, ____scli2c $007C $287B GOTO $-1 $007D $1784 BSF FSR, 7 $007E $2004 CALL _Delay_1us $007F $1300 BCF INDF, ____scli2c $0080 $0000 NOP $0081 $1280 BCF INDF, ____sdai2c $0082 $0825 MOVF Soft_I2C_Read_r_L0, 0 $0083 $00F0 MOVWF STACK_0 $0084 $0008 RETURN $0085 $ _Soft_I2C_Stop: $0085 $1303 BCF STATUS, RP1 $0086 $1283 BCF STATUS, RP0 $0087 $0820 MOVF ___porti2c, 0 $0088 $0084 MOVWF FSR $0089 $1383 BCF STATUS, 7 $008A $1280 BCF INDF, ____sdai2c $008B $2004 CALL _Delay_1us $008C $1700 BSF INDF, ____scli2c $008D $1384 BCF FSR, 7 $008E $1F00 BTFSS INDF, ____scli2c $008F $288E GOTO $-1 $0090 $1784 BSF fsr, 7 $0091 $2004 CALL _Delay_1us $0092 $2004 CALL _Delay_1us $0093 $2004 CALL _Delay_1us $0094 $2004 CALL _Delay_1us $0095 $1680 BSF INDF, ____sdai2c $0096 $2004 CALL _Delay_1us $0097 $0008 RETURN $0098 $ _Soft_I2C_Init: $0098 $1303 BCF STATUS, RP1 $0099 $1283 BCF STATUS, RP0 $009A $0823 MOVF FARG_Soft_I2C_Init+0, 0 $009B $0084 MOVWF FSR $009C $0180 CLRF INDF, 1 $009D $1784 BSF FSR, 7 $009E $0804 MOVF FSR, 0 $009F $00A0 MOVWF ___porti2c $00A0 $1680 BSF INDF, ____sdai2c $00A1 $1700 BSF INDF, ____scli2c $00A2 $1384 BCF FSR, 7 $00A3 $1F00 BTFSS INDF, ____scli2c $00A4 $28A3 GOTO $-1 $00A5 $0008 RETURN $00A6 $ _READ_RTC: ;i2c.c,4 :: void READ_RTC(void) ;i2c.c,6 :: Soft_I2C_Config(&PORTD, 5, 6); $00A6 $3008 MOVLW PORTD $00A7 $1303 BCF STATUS, RP1 $00A8 $1283 BCF STATUS, RP0 $00A9 $00A3 MOVWF FARG_Soft_I2C_Init+0 $00AA $2098 CALL _Soft_I2C_Init ;i2c.c,7 :: Soft_I2C_Start(); $00AB $2007 CALL _Soft_I2C_Start ;i2c.c,8 :: Soft_I2C_Write(0xd0); $00AC $30D0 MOVLW 208 $00AD $00A3 MOVWF FARG_Soft_I2C_Write+0 $00AE $2014 CALL _Soft_I2C_Write ;i2c.c,9 :: Soft_I2C_Write(0xa1); $00AF $30A1 MOVLW 161 $00B0 $00A3 MOVWF FARG_Soft_I2C_Write+0 $00B1 $2014 CALL _Soft_I2C_Write ;i2c.c,10 :: Soft_I2C_Start(); $00B2 $2007 CALL _Soft_I2C_Start ;i2c.c,11 :: Soft_I2C_Write(0xd1); $00B3 $30D1 MOVLW 209 $00B4 $00A3 MOVWF FARG_Soft_I2C_Write+0 $00B5 $2014 CALL _Soft_I2C_Write ;i2c.c,12 :: Data=Soft_I2C_Read(0); $00B6 $01A3 CLRF FARG_Soft_I2C_Read+0, 1 $00B7 $2053 CALL _Soft_I2C_Read $00B8 $0870 MOVF STACK_0, 0 $00B9 $00A1 MOVWF _Data $00BA $01A2 CLRF _Data+1 ;i2c.c,13 :: Soft_I2C_Stop(); $00BB $2085 CALL _Soft_I2C_Stop ;i2c.c,14 :: } $00BC $0008 RETURN $00BD $ _main: ;i2c.c,27 :: void main(void) ;i2c.c,29 :: PORTA=0x00; $00BD $1303 BCF STATUS, RP1 $00BE $1283 BCF STATUS, RP0 $00BF $0185 CLRF PORTA, 1 ;i2c.c,30 :: TRISA=0x00; $00C0 $1683 BSF STATUS, RP0 $00C1 $0185 CLRF TRISA, 1 ;i2c.c,31 :: PORTB=0x00; $00C2 $1283 BCF STATUS, RP0 $00C3 $0186 CLRF PORTB, 1 ;i2c.c,32 :: TRISB=0x80; $00C4 $3080 MOVLW 128 $00C5 $1683 BSF STATUS, RP0 $00C6 $0086 MOVWF TRISB ;i2c.c,33 :: PORTC=0xff; $00C7 $30FF MOVLW 255 $00C8 $1283 BCF STATUS, RP0 $00C9 $0087 MOVWF PORTC ;i2c.c,34 :: TRISC=0x00; $00CA $1683 BSF STATUS, RP0 $00CB $0187 CLRF TRISC, 1 ;i2c.c,35 :: TRISD=0xe0; $00CC $30E0 MOVLW 224 $00CD $0088 MOVWF TRISD ;i2c.c,36 :: PORTD=0x00; $00CE $1283 BCF STATUS, RP0 $00CF $0188 CLRF PORTD, 1 ;i2c.c,37 :: PORTE=0x00; $00D0 $0189 CLRF PORTE, 1 ;i2c.c,38 :: TRISE=0x00; $00D1 $1683 BSF STATUS, RP0 $00D2 $0189 CLRF TRISE, 1 ;i2c.c,39 :: READ_RTC(); $00D3 $20A6 CALL _READ_RTC ;i2c.c,42 :: while (1) $00D4 $ L_main_0: ;i2c.c,43 :: {} $00D4 $28D4 GOTO L_main_0 ;i2c.c,44 :: } $00D5 $28D5 GOTO $
|  |  |  |  |
Да добавя само - аз този компилатор не го ползвам. Качих го за проба и забравих да го махна;) И като казвам четим asm код, имам предвид точно четим - не разбираем, още по-малко пък оптимален  Но поне регистрите ги означава с имената им, а не с адресите.[/quote]
|
| Вто Май 30, 2006 9:14 am |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
... Значи имам някакъв смътен спомен за подобен проблем. Проблема идваше точно от bsf, bcf инструкциите. Ако не се лъжа, тогава смених bsf portb,5 с {movlw 0010000; iorwf portb) и bcf portb,5 с{movlw 11011111; andwf portb) и се оправи. Тъпото в твоя случай е че това значи да си пишеш собствени софтуерни И2Ц функции  Ако изровя отнякъде онзи код, мога да ти кажа по-подробно...
Аде успех!
|
| Вто Май 30, 2006 9:26 am |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
@setoy, благодаря за кода! Но така като го гледам си е читав отсекъде. Но при него не мисля, че е RPW проблема!
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Вто Май 30, 2006 11:41 am |
|
 |
|
bobyk
Ранг: Ориентиран
Регистриран на: Пон Яну 09, 2006 11:32 am Мнения: 276 Местоположение: Kozloduy
|
Абе какво се занимавате с тея Mikro...
Боклук от всякъде, и аз ги ползвах малко и се си общавах че ще ги разкарам от всякъде дето съм ги записал.
Пробвай нещо друго...
Успех.
|
| Сря Май 31, 2006 2:15 pm |
|
 |
|
perro_iv
Ранг: Новодошъл
Регистриран на: Вто Авг 23, 2005 10:36 am Мнения: 156 Местоположение: Казанлък
|
Проверил ли си хардуерно, дали всичко е наред.
В смисъл, тези диоди и часовника на същата платка ли са, и ако не на какво разстояние и каква е връзката между устройствата.
А пък тва да се оплюват пиковете е напълно излишно.
Прилича малко на приказката за ракетата и космоса или разни други такива подобни ...
|
| Сря Май 31, 2006 11:13 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|