|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 7:16 pm
На асемблер работи на С не?
| Автор |
Съобщение |
|
elmi
Ранг: Минаващ
Регистриран на: Пон Мар 06, 2006 7:47 pm Мнения: 43 Местоположение: Пловдив
|
 На асемблер работи на С не?
Досега съм писал само на асемблер и реших да започна да уча С за PIC. Намерих си PCW-C Compiler написах една програмка за проба. Ето я и нея
Програмката работи без проблеми докато на включа кабела за RS232 към платката. Платката е направена така че RC6 и RC7 минават през MAX232 за връзка с RS232. От PCто нищо не пускам по RSа. Когато кабела не е включен PICa работи добре като го включа се скапва. Написах същото на асемблер тогава PICа работи и с включен и с изключен кабел. А връзките по МАХа са наред защото съм правил комуникация с тази платка.
Има ли някой представа от какво може да е?
|
| Вто Апр 18, 2006 9:12 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Забрани всички прекъсвания и ще стане...никъде не се вижда и инит-кода ти....
|
| Вто Апр 18, 2006 11:19 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
...както е написал по-горе Predator_MF и провери (забрани) LVP в CONFIGURATION WORD.
|
| Сря Апр 19, 2006 7:50 am |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 04, 2005 3:18 pm Мнения: 309 Местоположение: Sofia
|
тъй ,тъй явно се мета у прекъсване като му зашумоли нещо по RX-a
и отива у тиквите.
Ако искаш да видиш верно ли е това тури и тоя ред:
#INT_RDA
void On_rx(void)
{
getch();
}
ама горе ,преди main() 
|
| Сря Апр 19, 2006 6:49 pm |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 04, 2005 3:18 pm Мнения: 309 Местоположение: Sofia
|
ето и една малка оптимизацийка:
#include <бъра-бъра.h>
int1 flag;
main()
{
while(1)
{
if(flag){output_high(pin_c5);}else{output_low(pin_c5);}
delay_ms(1000);
flag=!flag;
}
}
|
| Сря Апр 19, 2006 6:55 pm |
|
 |
|
elmi
Ранг: Минаващ
Регистриран на: Пон Мар 06, 2006 7:47 pm Мнения: 43 Местоположение: Пловдив
|
пробвах със следното
void main() {
disable_interrupts(GLOBAL);
disable_interrupts(INT_RDA);
........
и забраних LVP ама няма никаква промяна PICа се държи по същия начин
Пробвах и с това което предложи Dimiter ама пак няма промян.
Иначе оптимизацията заема наистина много по малко памет благодаря ти 
|
| Сря Апр 19, 2006 10:38 pm |
|
 |
|
nickich
Ранг: Почетен член
Регистриран на: Вто Ное 01, 2005 10:23 am Мнения: 704 Местоположение: Limerick, Ireland
|
Ползваш ли bootloader за да си налееш кода в ПИК-а? Ако ДА, какъв?
_________________ "640 К са достатъчни на всеки за всичко." Бил Гейтс
|
| Чет Апр 20, 2006 9:30 am |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Дай asm кода да разгледаме...
|
| Чет Апр 20, 2006 1:06 pm |
|
 |
|
nickich
Ранг: Почетен член
Регистриран на: Вто Ное 01, 2005 10:23 am Мнения: 704 Местоположение: Limerick, Ireland
|
...дай и листинга от Ц кода...
_________________ "640 К са достатъчни на всеки за всичко." Бил Гейтс
|
| Чет Апр 20, 2006 2:12 pm |
|
 |
|
elmi
Ранг: Минаващ
Регистриран на: Пон Мар 06, 2006 7:47 pm Мнения: 43 Местоположение: Пловдив
|
Не полозвам bootloader
Ето asm кода
 |  |  |  | Код: list p=16f877 #include <p16f877.inc> #include <banksel.h>
__CONFIG _PWRTE_OFF & _WDT_OFF & _HS_OSC & _BODEN_ON & _LVP_OFF
;definirane na registrite CBLOCK 0x7C Wtemp,STATUStemp,PCLATHtemp,FSRtemp ENDC
org 0x0000
goto start org 0x0004 goto int_service org 0x0005
;Inicializaciq init selbank1 movlw 0x06 movwf ADCON1 movlw 0xfc movwf TRISA movlw 0x0f movwf TRISB movlw 0xc0 movwf TRISC clrf TRISD clrf TRISE selbank0 clrf PORTA clrf PORTB clrf PORTC clrf PORTD clrf PORTE return ;inicializacia na TIMER1 ;chestta 38kHZ -> TMR=ffe8 ;prescaler 1 ;prekysvane ON init_TMR1 movlw 0x30 movwf T1CON movlw 0xC0 movwf INTCON ;enadble GIE ana Periferal interupt selbank1 bsf PIE1,TMR1IE ;enadle interrupt TIMER1 selbank0 bcf PIR1,TMR1IF movlw 0x00 movwf TMR1H movlw 0x00 movwf TMR1L bsf T1CON,TMR1ON ;start timer1 return
int_service movwf Wtemp ; Store W-reg swapf STATUS,W ; Swap status to be saved into W clrf STATUS ; bank 0, Clears IRP,RP1,RP0 movwf STATUStemp ; Save status to bank zero STATUS_TEMP movf PCLATH,W ; pages 1, 2 and/or 3 movwf PCLATHtemp ; Save PCLATH into W clrf PCLATH ; Page zero, regardless of current page movf FSR,W ; Copy FSR to W movwf FSRtemp ; Copy FSR from W to FSR_TEMP ;start na obslujvaneto btfss PIR1,TMR1IF ;proverka prekysvane ot TMR1? goto noTMR1 ;NE ;prekysvane ot TIMER1 ;DA movlw 0x00 ;zarejdane na TMR1 movwf TMR1H movlw 0x00 movwf TMR1L
bcf PIR1,TMR1IF ;nulirane na flaga za prekysvane ot TMR1 btfss i,2 goto off bsf PORTC,5 bcf i,2 goto noTMR1 off bcf PORTC,5 bsf i,2 noTMR1 ;krai na obslujavaneto clrf STATUS ; bank0 movf FSRtemp,W ; Restore FSR register movwf FSR movf PCLATHtemp,W ; Restore PCLATH movwf PCLATH ; Move W into PCLATH swapf STATUStemp,W ; Swap STATUS_TEMP register into W ; (sets bank to original state) movwf STATUS ; Move W into STATUS register swapf Wtemp,F ; Swap W_TEMP swapf Wtemp,W ; Swap W_TEMP into W retfie ; end of interrupt vector
;---------------------------------------
start call init call init_TMR1 movlw 0xff movwf PORTB movlw 0x0f movwf PORTC bsf PORTC,5 goto $ end
|  |  |  |  |
|
| Чет Апр 20, 2006 6:22 pm |
|
 |
|
elmi
Ранг: Минаващ
Регистриран на: Пон Мар 06, 2006 7:47 pm Мнения: 43 Местоположение: Пловдив
|
а ето и листинга от С кода
 |  |  |  | Код: CCS PCM C Compiler, Version 3.227, 16465 19-Àïðèë-06 22:50
Filename: D:\PROJECT\IR_project\IR\proba\ir_pr.LST
ROM used: 91 words (1%) Largest free fragment is 2048 RAM used: 8 (5%) at main() level 9 (5%) worst case Stack: 1 locations
* 0000: MOVLW 00 0001: MOVWF 0A 0002: GOTO 019 0003: NOP .................... #include <16F877.h> .................... //////// Standard Header file for the PIC16F877 device //////////////// .................... #device PIC16F877 .................... #list .................... .................... #fuses HS,NOWDT,NOPROTECT,NOLVP .................... #use delay(clock=3686400) 0004: MOVLW 23 0005: MOVWF 04 0006: MOVF 00,W 0007: BTFSC 03.2 0008: GOTO 018 0009: MOVLW 01 000A: MOVWF 78 000B: CLRF 77 000C: DECFSZ 77,F 000D: GOTO 00C 000E: DECFSZ 78,F 000F: GOTO 00B 0010: MOVLW 30 0011: MOVWF 77 0012: DECFSZ 77,F 0013: GOTO 012 0014: NOP 0015: NOP 0016: DECFSZ 00,F 0017: GOTO 009 0018: RETLW 00 .................... #use RS232(baud=9600, xmit=PIN_C7, rcv=PIN_C6) * 0028: MOVLW FF 0029: MOVWF 20 .................... .................... int i; .................... .................... void On_rx(void) .................... { .................... getch (); .................... } .................... .................... void main() { .................... disable_interrupts(GLOBAL); * 0019: CLRF 04 001A: MOVLW 1F 001B: ANDWF 03,F 001C: BSF 03.5 001D: BSF 1F.0 001E: BSF 1F.1 001F: BSF 1F.2 0020: BCF 1F.3 0021: BCF 03.5 0022: BCF 20.7 0023: MOVF 20,W 0024: BSF 03.5 0025: MOVWF 07 0026: BCF 03.5 0027: BSF 07.7 * 002A: BCF 0B.6 002B: BCF 0B.7 002C: BTFSC 0B.7 002D: GOTO 02B .................... disable_interrupts(INT_RDA); 002E: BSF 03.5 002F: BCF 0C.5 .................... i=0; 0030: BCF 03.5 0031: CLRF 21 .................... .................... while(TRUE) .................... { .................... output_high(PIN_C5); 0032: BCF 20.5 0033: MOVF 20,W 0034: BSF 03.5 0035: MOVWF 07 0036: BCF 03.5 0037: BSF 07.5 .................... if(i==0) 0038: MOVF 21,F 0039: BTFSS 03.2 003A: GOTO 04B .................... { .................... i=1; 003B: MOVLW 01 003C: MOVWF 21 .................... output_high(PIN_C4); 003D: BCF 20.4 003E: MOVF 20,W 003F: BSF 03.5 0040: MOVWF 07 0041: BCF 03.5 0042: BSF 07.4 .................... delay_ms(1000); 0043: MOVLW 04 0044: MOVWF 22 0045: MOVLW FA 0046: MOVWF 23 0047: CALL 004 0048: DECFSZ 22,F 0049: GOTO 045 .................... } .................... else 004A: GOTO 059 .................... { .................... i=0; 004B: CLRF 21 .................... output_low(PIN_C4); 004C: BCF 20.4 004D: MOVF 20,W 004E: BSF 03.5 004F: MOVWF 07 0050: BCF 03.5 0051: BCF 07.4 .................... delay_ms(1000); 0052: MOVLW 04 0053: MOVWF 22 0054: MOVLW FA 0055: MOVWF 23 0056: CALL 004 0057: DECFSZ 22,F 0058: GOTO 054 .................... } .................... .................... .................... } 0059: GOTO 032 .................... .................... } .................... .................... 005A: SLEEP
Configuration Fuses: Word 1: 3F7A HS NOWDT NOPUT NOPROTECT BROWNOUT NOLVP NOCPD NOWRT NODEBUG
|  |  |  |  |
|
| Чет Апр 20, 2006 6:25 pm |
|
 |
|
elmi
Ранг: Минаващ
Регистриран на: Пон Мар 06, 2006 7:47 pm Мнения: 43 Местоположение: Пловдив
|
Открих че контролера работи когато С5 го свържа трърдо към +5V. С4 иС5 са свързани към хардуерно логическо И.
Преметих входа му от C5 на В7 и пак не работи.
Да не вземе да се окаже нещо хардуерно, ама пък защо само като включакабела за RSа тогава не работи?
|
| Чет Апр 20, 2006 8:10 pm |
|
 |
|
bobyper
Ранг: Ориентиран
Регистриран на: Вто Яну 31, 2006 11:11 pm Мнения: 295 Местоположение: София
|
От листинга на C кода не се вижда да си сложил точно това дето те съветва Dimiter
#INT_RDA
void On_rx(void)
{
getch();
}
|
| Чет Апр 20, 2006 9:10 pm |
|
 |
|
elmi
Ранг: Минаващ
Регистриран на: Пон Мар 06, 2006 7:47 pm Мнения: 43 Местоположение: Пловдив
|
да изпуснал съм #INT_RDA но и с него го пробвах няма промяна
|
| Чет Апр 20, 2006 10:42 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
А бе пич, не ни тествай ясновидските способности!
Обясни ни какво става : без кабел за RS232 работи, така ли? А като включиш кабела не ще ?
Ами устройството е при теб, ти трябва да провериш какъв е проблемът!
1. Проблем с масите. Проверяваш, като с една червина жица на виолетови шарки свържеш масата на устройството си с масата на компа. Дупе да ти е яко, ако ползваш някой евтин мързелив саморъчен налепен хвърчащ програматор, чиято маса не е същата като масата на процесора. ( щото има такива, както ги има и дребната шарка, и маларията ).
2. Гърчаво захранване, като натовариш RS-а с входа на компа, и то кляка. Мери се с мултиметър. Гладна мечка хоро не играе.
3. Проблем с обработката на прекъсванията от приемането на серийния канал. Познава се по това, че при липса на предаване от компа чудото ти работи, като му пратиш един знак, и заклинва. Смени процесора, ако първата буква от името на производителя е "М", втората трябва да е "О" !
Айде, маай по задачите и пиши какво знамение си видял!
|
| Чет Апр 20, 2006 11:21 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 5 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|