Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

На асемблер работи на С не?
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=2231
Страница 1 от 2

Автор:  elmi [ Вто Апр 18, 2006 9:12 pm ]
Заглавие:  На асемблер работи на С не?

Досега съм писал само на асемблер и реших да започна да уча С за PIC. Намерих си PCW-C Compiler написах една програмка за проба. Ето я и нея
Код:
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=3686400)


int i;
void main() {
i=0;

while(TRUE)
{
output_high(PIN_C5);
   if(i==0)
   {
      i=1;
      output_high(PIN_C4);
      delay_ms(1000);
   }
   else
   {
      i=0;
      output_low(PIN_C4);
      delay_ms(1000);
   }


}

}

Програмката работи без проблеми докато на включа кабела за RS232 към платката. Платката е направена така че RC6 и RC7 минават през MAX232 за връзка с RS232. От PCто нищо не пускам по RSа. Когато кабела не е включен PICa работи добре като го включа се скапва. Написах същото на асемблер тогава PICа работи и с включен и с изключен кабел. А връзките по МАХа са наред защото съм правил комуникация с тази платка.
Има ли някой представа от какво може да е?

Автор:  Predator_MF [ Вто Апр 18, 2006 11:19 pm ]
Заглавие: 

Забрани всички прекъсвания и ще стане...никъде не се вижда и инит-кода ти....

Автор:  Gogo [ Сря Апр 19, 2006 7:50 am ]
Заглавие: 

...както е написал по-горе Predator_MF и провери (забрани) LVP в CONFIGURATION WORD.

Автор:  Dimiter [ Сря Апр 19, 2006 6:49 pm ]
Заглавие: 

тъй ,тъй явно се мета у прекъсване като му зашумоли нещо по RX-a
и отива у тиквите.
Ако искаш да видиш верно ли е това тури и тоя ред:

#INT_RDA
void On_rx(void)
{
getch();
}

ама горе ,преди main() 8)

Автор:  Dimiter [ Сря Апр 19, 2006 6:55 pm ]
Заглавие: 

ето и една малка оптимизацийка:

#include <бъра-бъра.h>

int1 flag;

main()
{
while(1)
{
if(flag){output_high(pin_c5);}else{output_low(pin_c5);}
delay_ms(1000);
flag=!flag;
}

}

Автор:  elmi [ Сря Апр 19, 2006 10:38 pm ]
Заглавие: 

пробвах със следното
void main() {
disable_interrupts(GLOBAL);
disable_interrupts(INT_RDA);
........
и забраних LVP ама няма никаква промяна PICа се държи по същия начин :(
Пробвах и с това което предложи Dimiter ама пак няма промян.
Иначе оптимизацията заема наистина много по малко памет благодаря ти :)

Автор:  nickich [ Чет Апр 20, 2006 9:30 am ]
Заглавие: 

Ползваш ли bootloader за да си налееш кода в ПИК-а? Ако ДА, какъв?

Автор:  setoy [ Чет Апр 20, 2006 1:06 pm ]
Заглавие: 

Дай asm кода да разгледаме...

Автор:  nickich [ Чет Апр 20, 2006 2:12 pm ]
Заглавие: 

...дай и листинга от Ц кода...

Автор:  elmi [ Чет Апр 20, 2006 6:22 pm ]
Заглавие: 

Не полозвам 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

Автор:  elmi [ Чет Апр 20, 2006 6:25 pm ]
Заглавие: 

а ето и листинга от С кода

Код:
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

Автор:  elmi [ Чет Апр 20, 2006 8:10 pm ]
Заглавие: 

Открих че контролера работи когато С5 го свържа трърдо към +5V. С4 иС5 са свързани към хардуерно логическо И.
Преметих входа му от C5 на В7 и пак не работи.
Да не вземе да се окаже нещо хардуерно, ама пък защо само като включакабела за RSа тогава не работи?

Автор:  bobyper [ Чет Апр 20, 2006 9:10 pm ]
Заглавие: 

От листинга на C кода не се вижда да си сложил точно това дето те съветва Dimiter

#INT_RDA
void On_rx(void)
{
getch();
}

Автор:  elmi [ Чет Апр 20, 2006 10:42 pm ]
Заглавие: 

bobyper написа:
От листинга на C кода не се вижда да си сложил точно това дето те съветва Dimiter

#INT_RDA
void On_rx(void)
{
getch();
}

да изпуснал съм #INT_RDA но и с него го пробвах няма промяна

Автор:  bateAz [ Чет Апр 20, 2006 11:21 pm ]
Заглавие: 

А бе пич, не ни тествай ясновидските способности!
Обясни ни какво става : без кабел за RS232 работи, така ли? А като включиш кабела не ще ?
Ами устройството е при теб, ти трябва да провериш какъв е проблемът!
1. Проблем с масите. Проверяваш, като с една червина жица на виолетови шарки свържеш масата на устройството си с масата на компа. Дупе да ти е яко, ако ползваш някой евтин мързелив саморъчен налепен хвърчащ програматор, чиято маса не е същата като масата на процесора. ( щото има такива, както ги има и дребната шарка, и маларията ).
2. Гърчаво захранване, като натовариш RS-а с входа на компа, и то кляка. Мери се с мултиметър. Гладна мечка хоро не играе.
3. Проблем с обработката на прекъсванията от приемането на серийния канал. Познава се по това, че при липса на предаване от компа чудото ти работи, като му пратиш един знак, и заклинва. Смени процесора, ако първата буква от името на производителя е "М", втората трябва да е "О" !

Айде, маай по задачите и пиши какво знамение си видял!

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/