www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PIC16F877 prekinitve

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
jerny
Član
Član



Pridružen-a: Čet 17 Apr 2008 11:27
Prispevkov: 414
Aktiv.: 1.98
Kraj: Dravograd

PrispevekObjavljeno: Sob Mar 23, 2013 8:39 pm    Naslov sporočila:  PIC16F877 prekinitve Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.44

PrispevekObjavljeno: Sob Mar 23, 2013 11:48 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
delay_ms (20); //debounce

Tole nima kaj iskat v prekinitvi...

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
jerny
Član
Član



Pridružen-a: Čet 17 Apr 2008 11:27
Prispevkov: 414
Aktiv.: 1.98
Kraj: Dravograd

PrispevekObjavljeno: Ned Mar 24, 2013 11:55 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.03

PrispevekObjavljeno: Ned Mar 24, 2013 12:49 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
jerny
Član
Član



Pridružen-a: Čet 17 Apr 2008 11:27
Prispevkov: 414
Aktiv.: 1.98
Kraj: Dravograd

PrispevekObjavljeno: Čet Mar 28, 2013 4:10 pm    Naslov sporočila:   Odgovori s citatom

@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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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