Microprocessor / Microcontroller
Varför? Industrial Electrical Engineering and Automation Billiga Innehåller bara det nödvändigaste Kräver få kringkomponenter Enkla att programmera
PIC16F887
PIC16F887
In- och utgångar Industrial Electrical Engineering and Automation Saknas något?
Pinnar på PIC16F887
Exempel: pinne RA1 Industrial Electrical Engineering and Automation In / Ut väljs med TRIS Digital / Analog väljs med ANSEL Komparatoringång
Timer
Timer med prescaler
Timeravbrott
Avbrott
Avbrottsregister
Avbrottsregister Industrial Electrical Engineering and Automation 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
Timer0
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
Generera avbrott varje ms med Timer0 //Fosc = 4 MHz Industrial Electrical Engineering and Automation static void interrupt isr(void){ if(t0if){ TMR0 = 6; isr_cnt++; T0IF = 0; void main(void){... // TIMER0 interrupt flag // Ladda nytt värde till TMR0 // Nollställ TIMER0 interrupt flag PSA = 0; // Prescaler till timer0 PS2 = 0; // 1:4 prescaler PS1 = 0; PS0 = 1; T0CS = 0; TMR0 = 6; T0IE = 1; // Enable timer0 avbrott GIE = 1; // Enable Global interrupt while(1){ if(isr_cnt > 0){... isr_cnt = 0; 256 6 // välj Fosc/4 som insignal // Timer värde för avbrott efter 1 ms TMR0 T0IF=1
Timer1
Timer som pulsräknare 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; 256 6 puls_cnt TMR0 TMR1H&L T0IF=1
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++; 65536 CCP1IF = 0; capture_time void main(void){... if(isr_cnt>0){ lcd_putlong(capture_time,6); isr_cnt = 0; capture_old CCP1IF=1 CCP1IF=1
PWM PR2 CCPR Industrial Electrical Engineering and Automation TMR2
PWM
A/D omvandlare
Oscillator
#include <htc.h> #include "lcd.h" Industrial Electrical Engineering and Automation #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; unsigned int counter = 0; static void interrupt isr(void) {... void main(void) { OSCCON = 0x70; TRISA = 0x3D; TRISB = 0xFF; TRISC = 0xF7; TRISD = 0xF0; TRISE = 0x04; ADCON1 = 0x0E; isr_init(); //Globala variabler // Välj 8 Mhz intern klocka // PORTA: RA1 utgång, resten ingångar // PORTB: ingångar // PORTC: RC3 utgång, resten in // PORTD: RD0-3 utgångar, resten in // PORTE: RE0-1 utgångar // AN0 (RA0) analog ingång // Initiera avbrott while(1) {...
Några datatyper i C Industrial Electrical Engineering and Automation 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
Några operatorer i C Industrial Electrical Engineering and Automation a++ a = a+1 a-- a = a-1!a inte a ~ bitvis invers == lika med!= inte lika med && OCH ELLER & bitvis OCH bitvis ELLER
Ändra enstaka bitar i ett register Industrial Electrical Engineering and Automation a = 0b00010011; b = a 0b00000100; // bitvis ELLER // b = 00010111 a = 0b00010011; b = a & 0b11111110; // bitvis OCH // b = 00010010
Skift Industrial Electrical Engineering and Automation a = 0x00000011; b = a<<2 // multiplikation med 4 //b = 00001100 b = a>>1 // division med 2 //b = 00000001 Använd så mycket som möjligt!
Olika sätt att skriva samma sak Industrial Electrical Engineering and Automation a = 23 a = 0b00010111 b = 0x17 // decimalt // binärt // hexadecimalt
men Arduino är ju mycket roligare Jaså
Arduino eller PIC? Industrial Electrical Engineering and Automation int led = 13; #include <htc.h> void setup() { CONFIG(PWRTDIS & UNPROTECT & BORDIS & WDTDIS & INTIO); pinmode(led, OUTPUT); void main(void){ OSCCON=0x70; TRISC=0b00000001; void loop() { digitalwrite(led, HIGH); while(1){ RC0=1; delay(100); delay_ms(100); digitalwrite(led, LOW); RC0=0; delay_ms(100); delay(100); Inte så mycket svårare!
Arduino eller PIC? int ledpin = 9; #include <htc.h> Industrial Electrical Engineering and Automation void setup() { pinmode(ledpin, OUTPUT); void loop() {... analogwrite(ledpin, 123); CONFIG(PWRTDIS & UNPROTECT & BORDIS & WDTDIS & INTIO); void main(void){ OSCCON=0x70; TRISC=0b00000001; //PWM setup CCP1CON=0b00001100; T2CON=0b00000100; PR2=0xFF; while(1){... CCPR1L = 123; //Välj PWM frekvens några rader extra men FULL KONTROLL OCH FULL FRIHET!
och vem har gjort bilderna då? Industrial Electrical Engineering and Automation www.microchip.com www.mikroe.com om man vill meta mer? Bates - Programming 8-bit PIC Microcontrollers in C LUBsearch Verle - PIC Microcontrollers - Programming in C http://www.mikroe.com/products/view/285/book-pic-microcontrollers-programming-in-c/