Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PIC18FXXXX - kilka podstawowych pytań

sennin 25 Mar 2011 08:56 1280 4
  • #1 25 Mar 2011 08:56
    sennin
    Poziom 2  

    Kilka dość podstawowych pytań, jednak ciężko mi znaleźć jakieś odpowiedzi.

    1. Jaka jest różnica pomiędzy podpięciem zewnętrznego oscylatora 16MHz, a ustawieniu wewnętrznego na 4MHz w trybie PLL (4x4=16MHz),
    2. Na liniach RB4:RB7 dochodzi do przerwania podczas zmiany stanów. Ustawiana jest flaga RBIF (oczywiście wszystko to, jeśli RBIE jest ustawione). Jak mogę sprawdzić, która z linii wygenerowała przerwanie (LATB?),
    3. Procesory tej rodziny są self programmable czy to znaczy, że potrafią się przeprogramować? Np. wczytać program z karty pamięci i go używać (wtedy można wygodnie zmieniać oprogramowanie).

    Pozdrawiam serdecznie,

    0 4
  • #2 25 Mar 2011 10:07
    Szara_Myszka
    Poziom 12  

    Jeśli idzie o oscylator zewnętrznny, to zazwyczaj takowe są dokładniejsze.

    0
  • #3 25 Mar 2011 10:30
    nemo07
    Poziom 36  

    Witam.

    sennin napisał:
    1. Jaka jest różnica pomiędzy podpięciem zewnętrznego oscylatora 16MHz, a ustawieniu wewnętrznego na 4MHz w trybie PLL (4x4=16MHz),

    Roznica w tym, ze dokladajac pare elementow zewnetrznych mozesz wybrac dowolna czestotliwosc zegara (a nie pochodna 8 MHz), a ponadto miec lepsza precyzje i stabilnosc niz posiada wewnetrzny (INTOSC).
    sennin napisał:
    2. Na liniach RB4:RB7 dochodzi do przerwania podczas zmiany stanów. Ustawiana jest flaga RBIF (oczywiście wszystko to, jeśli RBIE jest ustawione). Jak mogę sprawdzić, która z linii wygenerowała przerwanie (LATB?).

    Nie, LATB jest buforem wyjsciowym. Program musi pamietac poprzednie stany portu i weryfikowac po przerwaniu. Problem z weryfikacja (ze wzgledu na czas reakcji) moze wystapic, kiedy inne przerwanie, z wyzszym priorytetem jest aktywne i przerwie aktualna obsluge przerwania (z portu).
    sennin napisał:
    3. Procesory tej rodziny są self programmable czy to znaczy, że potrafią się przeprogramować? Np. wczytać program z karty pamięci i go używać (wtedy można wygodnie zmieniać oprogramowanie).

    Potrafia, ale do tego trzeba bootloader wkomponowac w odpowiednia rutyne, zalezna od rozwiazania (UART etc.). Nalezy tez zadbac o wczesniejsze skasowanie pamieci programu oraz weryfikacje po zapisaniu.

    0
  • #4 25 Mar 2011 10:38
    sennin
    Poziom 2  

    Cytat:
    Nie, LATB jest buforem wyjsciowym. Program musi pamietac poprzednie stany portu i weryfikowac po przerwaniu. Problem z weryfikacja (ze wzgledu na czas reakcji) moze wystapic, kiedy inne przerwanie, z wyzszym priorytetem jest aktywne i przerwie aktualna obsluge przerwania (z portu).


    Ok, ale skąd program ma wziąć te poprzednie stany portu? Z rejestru PORTB? W trakcie przerwania sprawdzić poprzedni stan i zapisać aktualny?

    0
  • Pomocny post
    #5 25 Mar 2011 15:41
    nemo07
    Poziom 36  

    sennin napisał:
    Ok, ale skąd program ma wziąć te poprzednie stany portu? Z rejestru PORTB? W trakcie przerwania sprawdzić poprzedni stan i zapisać aktualny?

    Port B nie ma rejestru (wejsciowego), stan jest czytany doraznie.
    W trakcie przerwania byloby troszke za pozno na sprawdzanie poprzedniego stanu, nieprawda?
    Zapamietac stan portu nalezy przed (pierwszym) wlaczeniem przerwan. W rutynie obslugi przerwania z kolei, przed jej opuszczeniem (i przed ponowna aktywacja przerwania!) nalezy zapisac aktualny stan portu.
    Dla zabawy napisalem troche kodu. Komentarz (po znakach ;//) po angielsku, bo tak prosciej i juz taki mam nawyk. Wychodzi troche bigos, bo edytor elektrody nie widzi tabulatorow, ale przy odrobinie woli mozna rozszyfrowac intencje.

    ;// Four of the PORTB pins (RB7:RB4) have an interrupt-on-change feature.
    ;// Only pins configured as inputs can cause this interrupt to occur (i.e., any RB7:RB4 pin
    ;// configured as an output is excluded from the interrupt-on-change comparison).
    ;// The input pins (of RB7:RB4) are compared with the old value latched on the last read of PORTB.
    ;// The “mismatch” outputs of RB7:RB4 are ORed together to generate the RB Port Change
    ;// Interrupt with Flag bit, RBIF (INTCON<0>).
    ;// This flag must be cleared in software.


    ;// PORTB Interrupt-on-Change
    ;// An input change on PORTB<7:4> sets flag bit, RBIF (INTCON<0>).
    ;// The interrupt can be enabled/disabled by setting/clearing enable bit, RBIE (INTCON<3>).
    ;// Interrupt priority for PORTB interrupt-on-change is determined by the value contained in the interrupt
    ;// priority bit, RBIP (INTCON2<0>)

    ;// The interrupt priority feature is enabled by setting the IPEN bit (RCON<7>).
    ;// When interrupt priority is enabled, there are two bits which enable interrupts globally.
    ;// Setting the GIEH bit (INTCON<7>) enables all interrupts that have the priority bit set (high priority).
    ;// Setting the GIEL bit (INTCON<6>) enables all interrupts that have the priority bit cleared (low priority).
    ;*************************************************************************************************************

    INIT

    include PIC18Fxxx.h
    ; ...
    ;// defines for Port B pins 7:4
    equ RB7_RB4_MASK = 0xF0
    equ RB_BIT7_MASK = 0x80
    equ RB_BIT6_MASK = 0x40
    equ RB_BIT5_MASK = 0x20
    equ RB_BIT4_MASK = 0x10
    ; ...
    equ RB7_RB4_Old = ? ;// any general purpose register to remember old values of [RB7:RB4] bits
    equ rb_temp ;// temporary used in RB_Change_Int
    ; ... ;// any code
    ;// END INIT

    MAIN
    ; ...
    ; save the [RB7:RB4] pins states into 'RB7_RB4_Old' before enabling the 'RB Port Change Interrupt'
    MOVF PORTB, W ;// read the pins --> W
    ANDLW RB7_RB4_MASK ;// filter with Hi-nibble mask
    MOVWF W, RB7_RB4_Old ;// save in RB7_RB4_Old
    ; ... ;// any code
    BSF INTCON, RBIE ;// enable 'RB Port Change Interrupt'
    ; ... ;// any code
    ;// END MAIN

    RB_Change_Int: ;// 'RB Port Change Interrupt' service routine
    ; BCF INTCON, GIEH ; (clear hi-priority global interrupts, optional, must execute RETFIE on exit when used)
    ; BCF INTCON, GIEL ; (clear low-priority global interrupts, optional, must execute RETFIE on exit when used)
    BCF INTCON, RBIE ;// disable 'RB Port Change Interrupt' <-- should be executed first!
    MOVF PORTB, W ;// read Port B pins --> W
    ANDLW RB7_RB4_MASK ;// filter with Hi-nibble mask
    MOVWF rb_temp ;// save for later use
    XORWF RB7_RB4_Old, W ;// get the changed bit code --> W[7:4]
    MOVFF rb_temp, RB7_RB4_Old ;// save current port B pins states, free rb_temp
    MOVWF rb_temp ;// hold the changed bit code here for later use
    ANDLW RB_BIT7_MASK ;// bit 7 change?
    BZ Cont_1 ;// not, continue checks
    ; here follows the code for 'bit 7 changed' condition
    Cont_1:
    MOVF rb_temp, W ;//
    ANDLW RB_BIT6_MASK ;// bit 6 change?
    BZ Cont_2 ;// not, continue test
    ; code for 'bit 6 changed' condition
    Cont_2:
    ;// same as above, for bits 5 & 4
    ; ... ;// any code
    BCF INTCON, RBIF ;// clear RB Port Change Interrupt Flag bit <-- don't forget!
    BSF INTCON, RBIE ;// re-enable 'RB Port Change Interrupt'
    ; RETFIE ; (must, when INTCON, <GIEH> and/or <GIEL> have been cleared)
    RETURN
    ;// END RB_Change_Int

    Kod moze zawierac bledy, jest tylko przykladowa propozycja. Rodziny PIC18 nie programowalem.

    0