Presentation laddar. Vänta.

Presentation laddar. Vänta.

Microprocessor / Microcontroller

Liknande presentationer


En presentation över ämnet: "Microprocessor / Microcontroller"— Presentationens avskrift:

1 Microprocessor / Microcontroller

2 Varför? Billiga Innehåller bara det nödvändigaste
Kräver få kringkomponenter Enkla att programmera

3 PIC16F887

4 PIC16F887

5

6 In- och utgångar Saknas något?

7 Pinnar på PIC16F887

8 Exempel: pinne RA1 In / Ut väljs med TRIS Digital / Analog
väljs med ANSEL Komparatoringång

9 Timer

10 Timer med prescaler

11 Timeravbrott

12 Avbrott

13 Avbrottsregister

14 Avbrottsregister GIE - Global Interrupt Enable bit
PEIE - Peripheral Interrupt Enable bit T0IE - TMR0 Overflow Interrupt Enable bit INTE - RB0/INT External Interrupt Enable bit RBIE - RB Port Change Interrupt Enable bit. T0IF - TMR0 Overflow Interrupt Flag bit INTF - RB0/INT External Interrupt Flag bit RBIF - RB Port Change Interrupt Flag bit

15 Timer0

16 Port B Pull up Enable bit
Interrupt Edge Select bit TMR0 Clock Source Select bit TMR0 Source Edge Select bit Prescaler Assignment bit Prescaler Rate Select bits

17

18 Generera avbrott varje ms med Timer0
//Fosc = 4 MHz static void interrupt isr(void){ if(T0IF){ // TIMER0 interrupt flag TMR0 = 6; // Ladda nytt värde till TMR0 isr_cnt++; T0IF = 0; // Nollställ TIMER0 interrupt flag } void main(void){ ... PSA = 0; // Prescaler till timer0 PS2 = 0; // 1:4 prescaler PS1 = 0; PS0 = 1; T0CS = 0; // välj Fosc/4 som insignal TMR0 = 6; // Timer värde för avbrott efter 1 ms T0IE = 1; // Enable timer0 avbrott GIE = 1; // Enable Global interrupt while(1){ if(isr_cnt > 0){ isr_cnt = 0; T0IF=1 256 TMR0 6

19 Timer1

20 Timer som pulsräknare T0IF=1 256 TMR0 6 puls_cnt TMR1H&L
static void interrupt isr(void){ if(TMR0IF){ TMR0 = 6; timer1H = TMR1H; timer1L = TMR1L; TMR1H = 0; TMR1L = 0; puls_cnt = (timer1H<<8)+timer1L; isr_cnt++; TMR0IF = 0; } void main(void) { ... while(1){ if(isr_cnt>0){ lcd_putint(puls_cnt,5); isr_cnt = 0; T0IF=1 256 TMR0 6 puls_cnt TMR1H&L

21 Timer för tidtagning static void interrupt isr(void){ if(CCP1IF){
capture_time = ((CCPR1H<<8)+CCPR1L) - capture_old; capture_old = (CCPR1H<<8)+CCPR1L; isr_cnt++; CCP1IF = 0; } void main(void){ ... if(isr_cnt>0){ lcd_putlong(capture_time,6); isr_cnt = 0; 65536 capture_time capture_old CCP1IF=1 CCP1IF=1

22 PWM PR2 CCPR TMR2

23 PWM

24 A/D omvandlare

25 Oscillator

26 #include <htc.h>
#include "lcd.h" #pragma config IESO=ON, FCMEN=ON,OSC=INTIO7 #pragma config BOREN=SBORDIS, BORV=0, PWRT=OFF, WDT=OFF #pragma config CCP2MX=PORTC, PBADEN=OFF, LPT1OSC=ON, MCLRE=ON #pragma config DEBUG=OFF, STVREN=ON, XINST=OFF, LVP=OFF #pragma config CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF, CPD=OFF, CPB=OFF #pragma config WRT0=OFF, WRT1=OFF, WRT2=OFF, WRT3=OFF, WRTB=OFF, WRTC=OFF,WRTD=OFF #pragma config EBTR0=OFF, EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF char avbrott = 0; //Globala variabler unsigned int counter = 0; static void interrupt isr(void) { ... } void main(void) OSCCON = 0x70; // Välj 8 Mhz intern klocka TRISA = 0x3D; // PORTA: RA1 utgång, resten ingångar TRISB = 0xFF; // PORTB: ingångar TRISC = 0xF7; // PORTC: RC3 utgång, resten in TRISD = 0xF0; // PORTD: RD0-3 utgångar, resten in TRISE = 0x04; // PORTE: RE0-1 utgångar ADCON1 = 0x0E; // AN0 (RA0) analog ingång isr_init(); // Initiera avbrott while(1)

27 Några datatyper i C char tecken, 8 bitar int heltal, 16 bitar
(float reella tal ) (double reella tal med dubbel precision) signed med tecken unsigned utan tecken void uttrycket saknar typ

28 Några operatorer i C a++ a = a+1 a-- a = a-1 !a inte a ~ bitvis invers
== lika med != inte lika med && OCH || ELLER & bitvis OCH | bitvis ELLER

29 Ändra enstaka bitar i ett register
b = a | 0b ; // bitvis ELLER // b = b = a & 0b ; // bitvis OCH // b =

30 Använd så mycket som möjligt!
Skift a = 0x ; b = a<<2 // multiplikation med 4 //b = b = a>>1 // division med 2 //b = Använd så mycket som möjligt!

31 Olika sätt att skriva samma sak
a = 23 // decimalt a = 0b // binärt b = 0x17 // hexadecimalt

32 ”men Arduino är ju mycket roligare”
Jaså…

33 Arduino eller PIC? Inte så mycket svårare! int led = 13;
void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); #include <htc.h> __CONFIG(PWRTDIS & UNPROTECT & BORDIS & WDTDIS & INTIO); void main(void){ OSCCON=0x70; TRISC=0b ; while(1){ RC0=1; __delay_ms(100); RC0=0; } Inte så mycket svårare!

34 några rader extra men FULL KONTROLL OCH FULL FRIHET!
Arduino eller PIC? int ledPin = 9; void setup() { pinMode(ledPin, OUTPUT); } void loop() { ... analogWrite(ledPin, 123); #include <htc.h> __CONFIG(PWRTDIS & UNPROTECT & BORDIS & WDTDIS & INTIO); void main(void){ OSCCON=0x70; TRISC=0b ; //PWM setup CCP1CON=0b ; T2CON=0b ; PR2=0xFF; //Välj PWM frekvens while(1){ ... CCPR1L = 123; } några rader extra men FULL KONTROLL OCH FULL FRIHET!

35 och vem har gjort bilderna då?
om man vill meta mer? Bates - Programming 8-bit PIC Microcontrollers in C LUBsearch Verle - PIC Microcontrollers - Programming in C


Ladda ner ppt "Microprocessor / Microcontroller"

Liknande presentationer


Google-annonser