 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
jerny Član


Pridružen-a: Čet 17 Apr 2008 11:27 Prispevkov: 414 Aktiv.: 1.98 Kraj: Dravograd
|
Objavljeno: Sob Mar 23, 2013 8:39 pm Naslov sporočila: PIC16F877 prekinitve |
|
|
Pozdravljeni!
Izdelujem GSM komunikacijo v MPLAB-u (CCS compiler), pojavi se problem ko vlkjučim prekinitev za branje tipk (#INT_EXT ). Takrat mi uP ne bere več iz predpolnilnika za UART povezavo (#INT_RDA), mogoče kdo ve kje tiči težava?
Koda: |
#include <16F877.h>
#include <stdlib.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOPUT
//#fuses HS, NOWDT
#use delay(clock=20000000) //10MHz
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=GSM,bits=8)
#include <flex_lcd.c>
#include <sht75.c>
//#device HIGH_INTS=TRUE
volatile char niz[90];
volatile int StevecBranja=0;
volatile int StevecIskanja=0;
volatile int Zadetek=0;
volatile int savna=0;
unsigned int counter = 0;
static long zastavica,stevec;
#INT_RDA
void SerialInt()
{
niz[StevecBranja]=getchar();
StevecBranja++;
if(StevecBranja==89)StevecBranja=0;
}
#INT_RTCC
void TIMER_INTERRUPT(){
if (stevec++==900){ // ena sekunda
stevec=0;
output_low(PIN_D1);
}
set_timer0 (39);
}
#INT_EXT
void button_isr() {
delay_ms (20); //debounce
if(!input(PIN_B4)){
output_high(PIN_D1);
disable_interrupts (INT_RTCC);
}
if(!input(PIN_B5))
output_low(PIN_D1);
}
int Preveri(){
int i=0;
printf("AT"); //AT ukaz
putchar(0x0D); //enter
delay_ms(300);
//printf(lcd_putc, "%d", StevecBranja);
for(i;i<StevecBranja;i++){
if((niz[i]=='O')&&(niz[i+1]=='K'))
return (1);
}
return (0);
}
int PrejetiSMS(){
{
const char StrCMTI[]={"+CMTI"};
StevecBranja=0;
Delay_ms(500);
StevecIskanja=2;
Zadetek=0;
while((Zadetek!=5)&&(StevecIskanja<8))
{
if(niz[StevecIskanja]==StrCMTI[StevecIskanja-2])
Zadetek++;
StevecIskanja++;
}
if(Zadetek==0x05)
Return(1);
else return(0);
}
}
int BeriSMS(){
int i=72;
int a=0;
printf("AT+CMGR=1"); //AT ukaz
putchar(0x0D); //enter
delay_ms(1000);
lcd_putc("\f");
//printf(lcd_putc, "%d", StevecBranja);
for(i;i<StevecBranja;i++){
//lcd_putc(niz[i]);
//delay_ms(1000);
//lcd_putc("\f");
if((niz[i]=='F')&&(niz[i+1]=='I')&&(niz[i+2]=='N')){
lcd_putc("Finska savna!");
delay_ms(5000);
return (1);
}
if((niz[i]=='T')&&(niz[i+1]=='U')&&(niz[i+2]=='R')){
lcd_putc("Turska savna!");
delay_ms(5000);
return (2);
}
}
}
int BrisiSMS(){
int i=0;
printf("AT+CMGD=1"); //AT ukaz
putchar(0x0D); //enter
delay_ms(300);
//printf(lcd_putc, "%d", StevecBranja);
for(i;i<StevecBranja;i++){
if((niz[i]=='O')&&(niz[i+1]=='K'))
return (1);
}
return (0);
}
void SMSkomunikacija()
{
setup_timer_0 ( RTCC_INTERNAL | RTCC_8_BIT | RTCC_DIV_256 ); /* timer increments every 11.10 ms */
enable_interrupts (INT_RTCC);
enable_interrupts (INT_EXT);
enable_interrupts (GLOBAL);
if(PrejetiSMS()){
lcd_putc("\f");
lcd_putc("Prejet sms!");
if(BeriSMS()==1){
set_timer0 (39);
output_high(PIN_D1);
if(counter==10)
output_low(PIN_D1);
}
if(BrisiSMS())
lcd_putc("SMS izbrisan!");
}
}
void main(void){
lcd_init();
sht_init();
float restemp, truehumid;
int i=0;
enable_interrupts(INT_RDA); // enable RDA interrupts
enable_interrupts(GLOBAL); // enable global ints
if(Preveri())
lcd_putc("Stima!");
delay_ms(1000);
while(1)
{
sht_rd (restemp, truehumid);
lcd_gotoxy(1,1);
printf(lcd_putc, "Temp : %3.1f %cC ", restemp, 223);
printf(lcd_putc, "\nVlaga : %3.1f %% ", truehumid);
delay_ms(500); //delay 500 ms between reading to prevent self heating of sensor
if(StevecBranja>0)
SMSkomunikacija();
}
/*
if(Preveri())
{
lcd_putc("Stima");
if(PrejetiSMS()){
lcd_putc("\f");
lcd_putc("Prejet sms!");
BeriSMS();
if(BrisiSMS())
lcd_putc("SMS izbrisan!");
}
}
*/
}
/*
#INT_RB
void button_isr() {
delay_ms (20); //debounce
if(!input(PIN_B4)){
output_high(PIN_D1);
disable_interrupts (INT_RTCC);
}
if(!input(PIN_B5))
output_low(PIN_D1);
}*/ |
_________________ Če smrdi je kemija, če kadi pa elektronika! |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.44
|
Objavljeno: Sob Mar 23, 2013 11:48 pm Naslov sporočila: |
|
|
Citiram: |
delay_ms (20); //debounce |
Tole nima kaj iskat v prekinitvi... _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
jerny Član


Pridružen-a: Čet 17 Apr 2008 11:27 Prispevkov: 414 Aktiv.: 1.98 Kraj: Dravograd
|
Objavljeno: Ned Mar 24, 2013 11:55 am Naslov sporočila: |
|
|
Ne morem verjet, da je bila samo taka mala napaka!
Mogoče kdo ve zakaj moram tipko držati kar nekaj časa da jo prepozna (na enkraten pritisk ne reagira). _________________ Če smrdi je kemija, če kadi pa elektronika! |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.03
|
Objavljeno: Ned Mar 24, 2013 12:49 pm Naslov sporočila: |
|
|
jerny je napisal/a: |
Mogoče kdo ve zakaj moram tipko držati kar nekaj časa da jo prepozna (na enkraten pritisk ne reagira). |
Kaj počnejo 5000ms pavze?
Predelaj podprogram za pavzo, da se bo prekinila ob postavljenem bitu v neki spremenljivki. Zakasnitvena zanka bo torej vsebovala še vrstici
Koda: |
BTFSC Zastavice,_ ; bit za izhod iz pavze
GOTO DelayV ; ven
pred izhodom pa še
DelayV
BCF Zastavice,_ ; pavza končana, pobriše bit
RETURN |
Ko boš pritisnil tipko, se bo v prekinitvi postavil bit BSF Zastavice,_ . Če se bo program iz prekinitve vrnil v pavzo, se bo le-ta predčasno končala. Seveda moraš v zakasnitveni zanki nekje odvzeti 2 NOP cikla.
V programu lahko uporabiš več kontrolnih bitov, pa tudi v drugih podprogramih dostikrat pridejo prav. Pač predelaš vse predpripravljene programe, ki niso občutljivi na predčasne prekinitve.
Prilepi vse sestavne dele funkcije Delay_ms(). Če se le da, naj bo sestavljena iz zbirniških ukazov. Tam se bo videlo, kaj se da kam vriniti. Program prevedeš v .hex, nato pa nazaj v Zbirnik in vidiš zaporedje .asm ukazov, ki je nastalo. Potem dobljeno zaporedje predelaš in ga vstaviš v .c program kot .asm vstavek.
Lahko pa narediš osnovno "do - while" zanko da bo ves čas krožila z 20ms ciklom. V klicanih daljših podprogramih ob vsakem prehodu zmanjšuj števce in sproti odklepaj/zaklepaj posamezne odseke podprograma. S tem dobiš "realtime multitasking" delovanje celotnega programa. _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
jerny Član


Pridružen-a: Čet 17 Apr 2008 11:27 Prispevkov: 414 Aktiv.: 1.98 Kraj: Dravograd
|
Objavljeno: Čet Mar 28, 2013 4:10 pm Naslov sporočila: |
|
|
@igo, hvala!
Ta problem sem rešil.
Zdaj me pa jezi še samo timer, nekako ne dela prav tako kot imam jaz napisano (čas je vedno različen).
Potrebujem samo, da mi Ledica sveti določen čas, katerega bi pač nastavil.
Kje delam narobe? _________________ Če smrdi je kemija, če kadi pa elektronika! |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 485 dni
Powered by phpBB © 2001, 2005 phpBB Group
|