logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

PIC16F877A - nie dziala z przerwaniem (HiTech PICC)

Bigfoot 17 Wrz 2007 14:38 1479 9
REKLAMA
  • #1 4292312
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    Napisalem prosty kod by pokazac, ze mimo iz przerwania sa wylaczone rzeczywisty uklad nie dziala (symulacja natomiast tak).

    
    #include <pic.h>
    #include "init.h"	
    #include "delay.h"
    
    __CONFIG(HS & WDTDIS & PWRTEN & BOREN & LVPDIS & WRTEN & DEBUGDIS & DUNPROT & UNPROTECT);
    
    void interrupt uuu(void)
    {
           asm("NOP");
    }
    
    
    
    void init(void)
    { 
      STATUS = 0;
      PCLATH = 0;
      INTCON = 0b00000000;
    //I/O configuration
      TRISA = 0b11111111;
      TRISB = 0b00000000;
      TRISC = 0b00000001;
      TRISD = 0b00000000;
      TRISE = 0b00000000;
      
    //ADC configuration
      ADCON0 = 0b11000001;    							// power on AD
      ADCON1 = 0b11000100;  					// right justified, AN0 AN1 AN3 - analog inputs, Vref = Vcc
      
    //RS configuration  
      SYNC = 0;
      SPEN = 1;
      SPBRG = 23; // 9600bps:  23->3.686400MHz      129->20MHz
      BRGH =  1;
      TXEN = 1;
      CREN = 1;
    
    // interrupt configuration	
      RBIE = 0;          
      TXIE = 0;
      RCIE = 0;
    
    // ei();              // Global interrupts DISABLED
      PEIE = 0;
      GIE = 0;		   
    
      OPTION = 0b00000111;	// set prescaler and timer source
      TMR0IE = 1;			// en/dis-able Timer0 interrput
    
    }
    
    
    void main(void)		
    { 
    init();
    while(1)
    {
        PORTD = 255;
        PORTC = 255;
        PORTE = 255;
    	  delay_ms(100);
        PORTD = 0;
        PORTC = 0;
        PORTE = 0;
    	  delay_ms(100);
     
    
    }
    
    }
    
    


    Program powinien naprzemienne wlaczac i wylaczac trzy porty - niestety tak sie nie dzieje. Natomiast gdy wyrzuce z powyzszego listingu to:

    
    void interrupt uuu(void)
    {
           asm("NOP");
    }
    


    to wszystko dziala poprawnie. Dlaczego? Przeciez przerwania sa wylaczone?! Dlaczego obecnosc tego kawalka wszystko burzy? Uzywam kompilatora HiTech PICC z interfejsem MPLab (przesiadlem sie na niego niedawno - moze on wymaga jakichs ustawien?).

    BF
  • REKLAMA
  • #2 4292498
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Hej
    Chyba jednak gdzieś włączasz przerwania w swoim programie.

    Z funkcja obslugi przerwan program zachowuje sie tak ze wchodzi do przerwania caly czas poniewaz jest zalaczona jakas flaga przerwania ktora nie jest kasowana. Program nie wykonuje glownej petli poniewaz caly czas wskakuje do obslugi przerwania.

    Jesli masz sprzetowy debugger to sprawdz rejestry odpowiedzialne za przerwania.

    Pozdrawiam
  • REKLAMA
  • #3 4292568
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    Piti - caly listing zalaczylem - nigdzie nie wlaczam przerwania co widac zreszta na symulacj - dziala poprawnie. Jaka flaga moze byc wlaczona skoro globalne zezwolenie jest wylaczone?

    PEIE = 0;
    GIE = 0;

    BF

    Dodano po 2 [minuty]:

    PS: Nie mam niestety sprzetowego debuggera.
  • REKLAMA
  • #4 4292667
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Tak symulacja dziala poprawnie.

    Debuggera sprzetowego nie masz ale masz port szeregowy :) odpal najpierw konsole i sprawdz w kilku miejscach jaka jest wartosc GIE;

    W przerwaniu rowniez dodaj linie:
    {
    while(TRMT);
    TXREG = 'A';
    }
  • #5 4292714
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    Zrobilem juz tak wczesniej i niestety zadna literka (w Twoim przypadku 'A') nie przychodzi do konsoli. NIGDZIE nie zmieniam GIE a ono samo tez nie ma prawa sie zmienic. Cokolwiek wsadze do przerwania - program wisi.

    BF
  • #6 4292825
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Dziwne zachowanie, zmien przerwanie na taka linie:

    void interrupt uuu(void) @ 0x04

    pewnie nie pomoze bo linker sam powinien wiedziec gdzie jest wektor przerwania.
  • REKLAMA
  • #7 4292902
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    Przerwanie jest umieszczane pod 0x04 (sprawdzilem plik *.lst).

    Czy problemem moze byc brak inicjalizacji plikiem startup.as? Wczesniej pracowalem w srodowisku Eclipse i tam dodawal sie on automatycznie - pod MPLabem chyba nie jest on dodawany - w kazdym razie nie widze tego :(

    BF
  • #8 4292931
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Nie wiem niestety, w PICC pisałem jedynie na 16F628 i 16F688 wszystko wtedy pracowało normalnie. Aktualnie pisze na PICe 18'ki w C18 Microchipa. Może załóż projekt od nowa różne rzeczy sie zdarzają i może coś się "uszkodziło".
  • #9 4382106
    kjkj
    Poziom 12  
    Posty: 33
    Pomógł: 1
    Ocena: 1
    Moim zdanie problem jest taki ,że na końcu przerwania nie ustawiacz flagi INTF=0; a jest to koniecznie do ponownego wywołania przerwania , innymi słowy wchodzi w przerwanie ale tylko raz.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu z obsługą przerwań w mikrokontrolerze PIC16F877A programowanym w kompilatorze HiTech PICC. Autor zgłasza, że mimo wyłączonych globalnych przerwań (GIE=0, PEIE=0) układ nie działa poprawnie w rzeczywistości, choć symulacja przebiega bez problemów. Wskazano, że program może ciągle wchodzić do procedury przerwania z powodu niezerowanej flagi przerwania, co blokuje główną pętlę programu. Sugerowano sprawdzenie rejestrów przerwań oraz dodanie transmisji znaków przez port szeregowy w procedurze przerwania w celu diagnostyki. Autor potwierdził, że nie ma sprzętowego debuggera, a GIE nie jest zmieniane w kodzie. Zasugerowano również poprawne umieszczenie procedury przerwania pod adresem 0x04 oraz rozważenie problemów z plikiem startup.as, który może nie być automatycznie dołączany w MPLAB. Wskazano, że brak zerowania flagi INTF w procedurze przerwania uniemożliwia jej ponowne wywołanie. Ostatecznie problem okazał się mieć podłoże sprzętowe, co zostało potwierdzone przez link do innego wątku opisującego usterkę sprzętową.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA