Radim sa pic16f1827 (pokajao sam se vec 100 puta sto sam izabrao bas njega) u CCS C-u. Zasto bas u CCS C-u? Jer sam nasao primer gde se koristi serijska komunikacija i PWM istovremeno za sta sam mislio da nije moguce zbog MDSRC registra gde se MDMS bitovima bira PWM ili EUSART TX OUTPUT. E sad pitanje. Imam potrebu da u C program ubacim asemblersku rutinu ali ne znam kako da vrednost iz asemblerske rutine prenesem u promenljivu C-a. Kontam ja da varijabla mora da bude globalna a imam i neke primere ali jedan ne radi bas ono sto bih ja hteo a drugi ima u sebi dosta gresaka. Ovo su ti primeri.
Code:
/////////////////////////////////////////////////////////////////////////
//// EX_GLINT.C ////
//// This example shows how to use the global interrupt to execute ////
//// interrupts quickly and efficently. It also shows how to use ////
//// the #asm and #endasm directives. ////
//// ////
//// Configure the CCS prototype card as described below. ////
//// ////
//// This example will work with the PCM and PCH compilers. ////
//// The following conditional compilation lines are used to ////
//// include a valid device for each compiler. Change the device, ////
//// clock and RS232 pins for your hardware if needed. ////
/////////////////////////////////////////////////////////////////////////
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#endif
long counter;
#if defined(__PCM__)
int save_w;
#locate save_w=0x7f
int save_status;
#locate save_status=0x20
#byte status = 3
#bit zero_flag = status.2
#bit t0if = 0xb.2
#elif defined(__PCH__)
int save_w;
#locate save_w=0x80
int save_status;
#locate save_status=0xFF
#byte status = 0xFD8
#bit zero_flag = status.2
#bit t0if = 0xFF2.2
#endif
#INT_GLOBAL
void isr() {
#asm
//store current state of processor
MOVWF save_w
SWAPF status,W
BCF status,5
BCF status,6
MOVWF save_status
// Save anything else your code may change
// You need to do something with PCLATH if you have GOTOs
// remember to check to see what interrupt fired if using more than one!!
// code for isr
BCF t0if
INCF counter,F
BTFSC zero_flag
INCF (&counter+1),F
// restore processor and return from interrupt
SWAPF save_status,W
MOVWF status
SWAPF save_w,F
SWAPF save_w,W
#endasm
}
void main() {
printf("\r\nStarting the counter.\r\n\n");
counter = 0;
setup_counters(RTCC_INTERNAL,RTCC_DIV_32);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
while(TRUE)
{
printf("The counter value is currently: %5lu\r\n", counter);
delay_ms(1000);
}
}
int_ffind_parity(int data){
int count;, result,datal;
data1=data;
#asm
MOV #0x08
MOV WF, count
CLRF result
Loop:
MOVF data1,w
XORWF result, F
RRCF data1,F
DECFSZ count,F
BRA LOOP
MOVLW 0x01
ANDWF resutt, F
#end asm
retturn (result)';
}
/////////////////////////////////////////////////////////////////////////
//// EX_GLINT.C ////
//// This example shows how to use the global interrupt to execute ////
//// interrupts quickly and efficently. It also shows how to use ////
//// the #asm and #endasm directives. ////
//// ////
//// Configure the CCS prototype card as described below. ////
//// ////
//// This example will work with the PCM and PCH compilers. ////
//// The following conditional compilation lines are used to ////
//// include a valid device for each compiler. Change the device, ////
//// clock and RS232 pins for your hardware if needed. ////
/////////////////////////////////////////////////////////////////////////
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#endif
long counter;
#if defined(__PCM__)
int save_w;
#locate save_w=0x7f
int save_status;
#locate save_status=0x20
#byte status = 3
#bit zero_flag = status.2
#bit t0if = 0xb.2
#elif defined(__PCH__)
int save_w;
#locate save_w=0x80
int save_status;
#locate save_status=0xFF
#byte status = 0xFD8
#bit zero_flag = status.2
#bit t0if = 0xFF2.2
#endif
#INT_GLOBAL
void isr() {
#asm
//store current state of processor
MOVWF save_w
SWAPF status,W
BCF status,5
BCF status,6
MOVWF save_status
// Save anything else your code may change
// You need to do something with PCLATH if you have GOTOs
// remember to check to see what interrupt fired if using more than one!!
// code for isr
BCF t0if
INCF counter,F
BTFSC zero_flag
INCF (&counter+1),F
// restore processor and return from interrupt
SWAPF save_status,W
MOVWF status
SWAPF save_w,F
SWAPF save_w,W
#endasm
}
void main() {
printf("\r\nStarting the counter.\r\n\n");
counter = 0;
setup_counters(RTCC_INTERNAL,RTCC_DIV_32);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
while(TRUE)
{
printf("The counter value is currently: %5lu\r\n", counter);
delay_ms(1000);
}
}
int_ffind_parity(int data){
int count;, result,datal;
data1=data;
#asm
MOV #0x08
MOV WF, count
CLRF result
Loop:
MOVF data1,w
XORWF result, F
RRCF data1,F
DECFSZ count,F
BRA LOOP
MOVLW 0x01
ANDWF resutt, F
#end asm
retturn (result)';
}
Da li bi neko mogao da mi to pojasni. Uzgred i misljenje o CCS C-u bi me zanimalo. Hvala.