62
Efteruddannelse Embedded C Modul 2 (Tirsdag den 12/1-2010) 07.01.2010

Efteruddannelse Embedded C

  • Upload
    sakina

  • View
    30

  • Download
    0

Embed Size (px)

DESCRIPTION

Efteruddannelse Embedded C. Modul 2 (Tirsdag den 12/1-2010). 07.01.2010. Modul 1. Indhold: Debugning Standart I/O i C PIC18F’s porte Display Driver til OLED display C assigenment , logiske operatorer løkker, betingelser PIC18F A/D-Converter Opsamling på dagens opgaver. - PowerPoint PPT Presentation

Citation preview

Page 1: Efteruddannelse Embedded  C

EfteruddannelseEmbedded CModul 2 (Tirsdag den 12/1-2010)

07.01.2010

Page 2: Efteruddannelse Embedded  C

Modul 1

Indhold:1) Debugning2) Standart I/O i C3) PIC18F’s porte4) Display5) Driver til OLED display6) C assigenment, logiske operatorer løkker,

betingelser7) PIC18F A/D-Converter8) Opsamling på dagens opgaver.

Page 3: Efteruddannelse Embedded  C

Demo af debugger

Debuggning af applikation

Page 4: Efteruddannelse Embedded  C

Øvelse

• Med udgangspunkt i jeres HelloWorld applikation, skal i selv prøve, at downloade hex fil via debugger (flyt usb stik til debuggerens usb).

• Prøv dels at singel steppe gennem jeres program• Prøv også at indsætte et breakepoint

Page 5: Efteruddannelse Embedded  C

Standart I/O

Internt i en computer repræsenteres alle tal og karakterer som bit, en byte er i den forbindelse en serie af bit hvor den enkelte bit er vægtet binært. Fil begreber repræsentere en ”samling” af relaterede tal eller karakterer. I C behandles en fil som en serie af byte (dvs. den mindste enhed er en byte altså 8 bit) ofte anvendes der betegnelsen stream om en sådant serie af byte. I C er en fil ikke kun ”noget” der ligger på en harddisk, men er faktisk betegnelsen for data der modtages i form af en strøm byte. F. eks : input fra tastatur, output til printer, filer fra HD etc.

Page 6: Efteruddannelse Embedded  C

Pre definerede filer stream i C

stdin - Standart input stdout - Standart outputstderr - Standart til udskrift af fejl meddelelser

På en PC’er er disse tre typisk forbundet til tastatur og skærm, men på andre typer af systemer kan de være forbundet til andre input/output enheder

Page 7: Efteruddannelse Embedded  C

getc funktionen • getc() læser den næste karakter fra en fil stream og returnere den i form af en

integer.• Funktionen getc findes i stdio.h derfor skal denne inkluderes for at bruge

funktionen.• Syntaks for getc er : int getc(FILE *stream);

#include <stdio.h>void main(){

int kar;printf("Tryk paa en tast !\n");kar = getc(stdin);printf("Du trykkede på : %c\n",kar);

}

Page 8: Efteruddannelse Embedded  C

getchar funktionen

• Funktionen getchar findes i stdio.h og denne skal derfor inkluderes.

• getchar er identisk med getc(stdin), dvs. at man med getchar anvende en ”fast” file stream, nemmerlig stdin.

Page 9: Efteruddannelse Embedded  C

Funktionen putc

• Når der skal udskrives karakterer på en specifik file stream anvendes funktionen putc.

• putc findes i stdio.h• Syntaks : int putc(int c, FILE *stream);

#include <stdio.h>void main(){

int kar = 145;putc(kar, stdout);getchar();

}

Page 10: Efteruddannelse Embedded  C

Funktionen putchar

• Findes i stdio.h• Har en funktion tilsvarende putc(c, stdout)• Udskriver på stdout, man kan altså ikke vælge hvor

karakterer skal sendes hen.• getchar og putchar er egentligt bare special udgaver af

getc og putc, normalt vil de også være lavet med getc og putc funktionerne hvor file stream er sat til standart i/o enheder.

Page 11: Efteruddannelse Embedded  C

Funktionen printf

Vi har allerede brugt denne funktion, men printf er egentligt en omfattende funktion med mange egenskaber. Printf funktionen udskriver på stdio og for at bruge printf skal stdio.h inkluderes.

printf kan bruges til at udskrive en konstant tekst streng:printf(”Hello World”);

printf kan også udskrive indhold af variabel:int x = 10;printf(”x indeholder vaerdien %d”,x);

Page 12: Efteruddannelse Embedded  C

Tilretning af ”printf” til dedikeret hardware

• I MPLAB C18 er det muligt på en relativt simpel måde at til rette hvor Printf som standart skriver ud til, dette gøres ved, at sætte stdout som vist nedenfor:

stdout = _H_USER; • Herefter vil printf anvende funktionenint _user_putc (char c);• For hver karakter der skal udskrives foretager

printf nu et kald til funktionen og da vi selv skriver funktione kan vi sende karakterene til det device vi ønsker.

Page 13: Efteruddannelse Embedded  C

Format specifikatorer for printf

Page 14: Efteruddannelse Embedded  C

Hexa decimale tal

• Alle tal og karakterer er internt i en computer gemt som binærer værdier altså en serie af bits der kan antage værdien 0 eller 1.

• En binær værdi er normalt ikke særlig interessant for en normal bruger, derfor kan man i C vælge mellem nogle forskellige talformater når man udskriver værdier med printf. Et af disse talformater er hexa decimale tal (16 symboler i modsætning til det decimales 10)

Page 15: Efteruddannelse Embedded  C

Udskrift af talværdi som en hexadecimal værdi

• Med printf kan variables indhold udskrives hexadecimalt med %x eller %X

#include <stdio.h>void main(){

int tal = 7913;printf("Den hexadecimalvaerdi er

%x",tal) ;getchar();

}

Page 16: Efteruddannelse Embedded  C

Det octale talformat

• Indeholder 8 symboler• Bruger de samme symboler som det decimale

talformat

Page 17: Efteruddannelse Embedded  C

Justering af output

• Der er med printf muligt at justere udskrift af tal.• Ved at angive et tal mellem % og d (eks. %4d) justeres

tal således at der afsættes 4 pladser til udskrift af tal har tallet så kun 2 cifre bliver tallet højre stillet.

• Angives et negativt tal vil tallet blive venstre justeret, med det antal pladser der angives.

• Eks %-4d

Page 18: Efteruddannelse Embedded  C

Program eksempel

#include <stdio.h>void main(){

int tal1 = 1, tal2 = 12, tal3 = 123, tal4 = 1234, tal5 = 12345;printf("%6d %-6d \n",tal1, tal1);printf("%6d %-6d \n",tal2, tal2);printf("%6d %-6d \n",tal3, tal3);printf("%6d %-6d \n",tal4, tal4);printf("%6d %-6d \n",tal5, tal5);getchar();

}

Page 19: Efteruddannelse Embedded  C

Generel opbygning af porte i PIC18F

extern volatile near union { struct { unsigned TRISA0:1; unsigned TRISA1:1; unsigned TRISA2:1; unsigned TRISA3:1; unsigned :1; unsigned TRISA5:1; unsigned TRISA6:1; unsigned TRISA7:1; }; struct { unsigned TRISA:8; };} TRISAbits;

extern volatile near union { struct { unsigned LATA0:1; unsigned LATA1:1; unsigned LATA2:1; unsigned LATA3:1; unsigned :1; unsigned LATA5:1; unsigned LATA6:1; unsigned LATA7:1; }; struct { unsigned LATA:8; };} LATAbits;

Page 20: Efteruddannelse Embedded  C

Fysisk interface mellem PIC og OLED

Page 21: Efteruddannelse Embedded  C

Definition af interface mellem pic og OLED

#define oledWR LATEbits.LATE1#define oledWR_TRIS TRISEbits.TRISE1#define oledRD LATEbits.LATE0#define oledRD_TRIS TRISEbits.TRISE0#define oledCS LATEbits.LATE2#define oledCS_TRIS TRISEbits.TRISE2#define oledRESET LATDbits.LATD1#define oledRESET_TRIS TRISDbits.TRISD1#define oledD_C LATBbits.LATB5 #define oledD_C_TRIS TRISBbits.TRISB5

Page 22: Efteruddannelse Embedded  C

Skrivning til OLED

Page 23: Efteruddannelse Embedded  C

Læsning fra OLED

Page 24: Efteruddannelse Embedded  C

Kontrolsignaler

Page 25: Efteruddannelse Embedded  C

Læsning fra OLED

Page 26: Efteruddannelse Embedded  C

GDDRAM layout

Page 27: Efteruddannelse Embedded  C

Pixel map

Page 28: Efteruddannelse Embedded  C

Commando registre

Page 29: Efteruddannelse Embedded  C

Commando registre

Page 30: Efteruddannelse Embedded  C

Commando registre

Page 31: Efteruddannelse Embedded  C

Commando registre

Page 32: Efteruddannelse Embedded  C

Commando registre

Page 33: Efteruddannelse Embedded  C

Commando registre

Page 34: Efteruddannelse Embedded  C

Commando registre

Page 35: Efteruddannelse Embedded  C

Commando registre

Page 36: Efteruddannelse Embedded  C

Eksempel fra driver til OLED

void WriteCommand(BYTE cmd){ TRISD = 0x00; LATD = cmd; oledRD = 1; oledWR = 1; oledD_C = 0; oledCS = 0; oledWR = 0; oledWR = 1; oledCS = 1; TRISD = 0xFF;}

Sender kommando til OLED

Page 37: Efteruddannelse Embedded  C

Øvelse

• Lav øvelsen i lab2.docx

Page 38: Efteruddannelse Embedded  C

Opbygning af en driver

• Når der skal opbygges en driver eller et lib. til et stykke hw er det et godt design kriterie at opbygge det lagdelt, herved bliver det betydelig lettere at overskue og det vil også være væsentligt lettere at debugge samt teste koden.

• Når vi laver ”procedurale” programmer er en god måde at beskrive strukturen at koden på via Hierakiske diagrammer, i filen ”hd The structure chart.pdf” er disse beskrevet.

Page 39: Efteruddannelse Embedded  C

Gennemgang af OLED

• Hvilke funktioner findes i filen ?• Hvordan hænger de sammen ?• Er der anvendt en lagdelt arkitektur ?• Er der noget af koden der ikke anvendes, efter vi

har rettet/ændret i koden ?• Kunne opdelingen af kode være lavet mere

hensigtsmæssigt ?

Page 40: Efteruddannelse Embedded  C

Assignment operatoren (=)

• Tilskrivning (assignment) = ”flytter” en værdi fra højreside til et adresse objekt på venstre side.

Eks. x = 10+20;

• Venstre side skal referere til et objekt som der kan ”skrives” til og højreside skal kunnet beregnes til en værdi.

Eks.x=y=z=5;

• Er lovlig og vil sætte x,y,z til værdien 5.

Page 41: Efteruddannelse Embedded  C

Kombinations operatorer

Operator Betydning vist ved eksempel

+= x+=10 x=x+10

-= x-=z+10 x=x-(z+10)

*= x*=20 x=x*20

/= x/=2 x=x/2

%= x%=7 x=x%7

!! Udregning på højre side foregår først

Page 42: Efteruddannelse Embedded  C

Increment og decrement

• Symbolet for increment er ++ (!!ingen mellemrum!!)• Symbolet for decrement er – (igen ingen mellemrum)• Increment og decrement kan anvendes som pre- eller post

operator.• Ved post vil værdi først blive tilskrevet efter statement er

færdig beregnet.Eks.

z = x++; z=++x;

Page 43: Efteruddannelse Embedded  C

Fortegns operatorer

- skifter fortegn af konstanter eller variable hvis de placeres før konstantudtryk eller variable.

Eks.-x Hvis x har værdien 10 vil udtrykket ovenfor altså have værdien -10.r = x - - y Er lig medr = x – (-y) (Husk mellemrum mellem - -)

Page 44: Efteruddannelse Embedded  C

Relations operatorer

• Der findes i C nogel operatorer der anvendes til at sammenligne med, nogle af operatorene består af to tegn og disse skal stå ved siden af hinanden (altså uden mellemrum).

Operator Betydning

== Lig med

!= Forskellig fra

> Større end

< Mindre end

>= Større end eller ligmed

<= Mindre end eller ligmed

Page 45: Efteruddannelse Embedded  C

Cast operator

• Anvendes når man selv vil styre data typen som skal anvendes.

• Syntaksen for cast operatoren er (datatype) x

• Anvend type casting når du ønsker en bestemt datatype som resultat af beregning.

Page 46: Efteruddannelse Embedded  C

Sizeof operatoren

• Anvendes til at ”måle” størrelsen af en datatype, da C standarten ikke fastsætter en konkret størrelse for de simple datatyper, må man anvende sizeof for at få oplyst størrelse af en datatype. Sizeof returnere et tal der angiver størrelse i antal byte.

Syntaks:sizeof(expression)

Page 47: Efteruddannelse Embedded  C

Logiske operatorer

• C indeholder 3 logiske operatorer, som anvendes når vi ønsker at kombinere udtryk.

Symbol

Betydning

&& Logisk AND

|| Logisk OR

! Negation

Page 48: Efteruddannelse Embedded  C

Bitvise operatorer

• Bitvise operatorer virker på de enkelte bit i modsætning til de logiske.

Symbol

Betydning

& Bitvis AND

| Bitvis OR

^ Bitvis XOR

~ Komplimenter

>> Skift bit til højre

<< Skift bit til venstre

Page 49: Efteruddannelse Embedded  C

x?y:z Underlige konstruktioner i C

• Denne operator kaldes betingelses operatoren og bør absolut anvendes med omtanke, hvis man anvender den bliver koden let svær at læse.

Eksempelk = x > 10 ? ’L’ : ’S’;k bliver satlig med karakteren hvis x > 10 ellers bliver k sat til karakteren S.

Page 50: Efteruddannelse Embedded  C

Løkker

• Hvis vores kode ikke blot skal afvikles, som en fast række af instruktioner, man der er dele af vores kode vi ønsker at gentage anvendes løkker.

• I C findes i alt 3 løkke strukturer: while do-while for• Mange ting kan udføres med en hvilken som helst

af de tre løkker, men ofte er der fordele ved, at vælge den ”rette”

Page 51: Efteruddannelse Embedded  C

while løkke

• Udfører en statement så længe udtryk er sandwhile(expression) statement;

• Struktur:

Page 52: Efteruddannelse Embedded  C

do – while løkke

• Virker som en while løkke der vender på hovedet, altså hvor men slutter med at undersøge om løkke skal kører igen.

Syntaksdo {…} while (expression);

Page 53: Efteruddannelse Embedded  C

for løkke

• Indeholder tre dele :• Initialisering (Køres kun første gang løkke køres)• Betingelse (Afgør om løkke skal kører igen)• Post udtryk (Udføres efter hver kørsel af løkke)Syntaks :

for(i=0; i<10; i++){…}

Page 54: Efteruddannelse Embedded  C

Uendelige løkker

Pas på hvis der utilsigtet optræder en uendeligløkke vil program afvikling ”hænge” her.

Eksempler på uendelige løkker:

while(1==1){….}

do {…..} while (x=1);

for(;;){……}

Page 55: Efteruddannelse Embedded  C

Pic18F46J50’s A/D konverter

..\..\Datasheet\39931c.pdf

Page 56: Efteruddannelse Embedded  C

Array

• Med et array kan man i C lave en samling af variable af samme type.

• I et array skal alle elementer have samme data typer.

Eksempel:int dag[365];float x[100];

Page 57: Efteruddannelse Embedded  C

Indeks

• De enkelte elementer i et array er i C nummereret fra 0 og op efter har vi erklæret et array :

int y[10];• Vil det første element i array et have nummer 0

og det sidste 9• Man kan godt indeksere et array med en

heltals variabel.

Page 58: Efteruddannelse Embedded  C

Initialisering af array

• Et array kan initialiseres på flere måder her et eksempler:

int dag[7];dag[0] = 1;dag[1]= 2;….int prim[5]={2,3,5,7,9}

Page 59: Efteruddannelse Embedded  C

Arrays af flere dimmensioner

• Et array i C kan godt have flere dimmensioner int tabel[2] [3];• Størrelsen på dette array er 2*6 integer variable• Ønsker man at få oplyst størrelse på et array kan sizeof

anvendes.• Når man skal referere til en celle i array af flere

dimmensioner gøres det som vist nedenfor:int tabel[2][3];tabel[0] [0] = 20;tabel[1][2] = 50;

Page 60: Efteruddannelse Embedded  C

Unsized array

• Angiver man ikke størrelse på array vil compilerer udregne hvor stor array skal være.

Eksempel:int sum[] = { 1,2,3,5,8,13,21,33};Arrayet vil få størrelsen 8

Page 61: Efteruddannelse Embedded  C

Øvelse

Lav øvelsen i ”Lab3.docx”

Page 62: Efteruddannelse Embedded  C

Opsummering på dagen

• Kommentarer• Tak for i dag