PIC programmering i C og interface til Windows (PC som hardware dims)

Tags:    c++ grafik

Ved en blød start kan det lige skrives at PIC er en microprocesser (kontroller), dvs. en CPU. Denne enheder kan programmers til et utal af forskellige ting. Som vi alle ved er det jo sådan en tingest der sidder i vores PC, blot en intel-ting og ikke en PIC.

Først et par ting omkring PIC - processoren :
PIC processoren er en RISK - processor hvilket blot siger noget om hastigheden den afvikler kommandoer på, samt hvordan den er opbygget inde i.

Fordelen ved en PIC iforhold til en intel CPU, er at PIC en har relativt få kommandoer og at den kan trække strøm på alle portene. Der kan trækkes omkring 10 mA på hver ben på PICen, dvs der kan sættes dioder på alle bene uden transistore (husk formodstand på omkring 220 ohm).

Først anskaffes en brænder til PIC - kredsen. Her kan jeg anbefale PIC-start plus, men der kan også findes et print som man kan lave billigt på internettet på adr : www.beyondlogic.org . Men herved kan der opstå problemmer med at overføre data til sin PIC, men prøv jere lidt frem. Har selv en PIC start plus, den koster omkring 1200 kr, men så kan den ofså brænde alle PIC, og viker i Windows uden problemmer.

Efter denne brænder er anskaffet downloades et kompilerings program f.eks. Mplab. Når dettte er gjordt findes en C++ kompiler. Her anbefaler jeg mplabc.exe. Denne kompiler installeres i mplab, således at programmet kan kompileres C++ filer til PIC - kredesen. Dette er desvære forskelligt fra hver version af mplab, men se evt en hjælpe file i mplab, eller prøv denne opskrift :
Åben mplab
Under menuen "edit" findes menu-feltet install lang, vælg denne. Her i vælges mplabc1 og under gemmense vælges den exe fil der hedder mplabc.exe. Hvis dette findes virker det også, mend lidt held.

Efter dette er gjordt skal der oprettes et projekt. Når dette er gjordt oprettes en "node" (en file.c). Når noden er oprettet vælges egenskaber og der vælges det rigtige hex format (der er kun 3 mulighder) og c-filen kompileres. Her er det en god ide at have en c file man er helt sikker på virker, f.eks.
"
void main()
{
}
"

(Folkens dette er kun en beskrivelse, og jeg kan desværre ikke hjælpe særlig meget hvis I ikke kan overføre et almindeligt program til en PIC. Vil helst bruge energi på selve programmeringen !!!)

Nu starter selve programeringen ....

På en PIC - kredes findes porte, dvs man deler udgange/indgange på kredsen op i 8 bits porte (kaldet I/O). Disse porte er der mulighed for at sætte retningen på. Dvs. læsses der på porten eller skrives der til porten. Dette gøres via. en variabel kaldet "TRISB" (register til PORT B). F.kes
"
void main()
{
TRISB=0; //Helle PORTB sættes til en udgang. Dvs RB0 til RB7 (se evt datablad på PIC16F84)
PORTB=255; //Alle bit på PORTB sættes høje. Alle ben på PORTB er 5 volt
}
"

Hvis vi derimod vil sætte en port til en indgang skrives dette således :
"
void main()
{
TRISB=255; //Helle PORTB sættes til en indgang. Dvs RB0 til RB7
char a=0; //Opretter 8 bit variabel og sætter den til 0
a=PORTB; //Gemmer værdien fra PORTB i a
TRISC=0; //Helle PORTC sættes til en udgang. For at kunne få et resultat
PORTC=a; //Overføre værdien fra a til PORTC
}
"
(Husk at include den file der høre til PIC - kredsen før main funktionen)


Ud af dette har vi lært kort om :
TRISX : Sætter retning på port
PORTX : Selve den port der læses/skrives fra
char : variabel type

For at gøre det nemmere at skrive og læse fra en port er der indført at PORTA.0 betyder RA0.
"
char a=0;
TRISB=255;
a=PORTB.0; //Læser IKKE hele porten, men kun bit 0 (RA0)
"

I skrive måder til PIC - kredsen kan også nævnes at :
Ved bin bruges
0b0000000 : eks. "TRISB=0b00000000;"

Ved HEX bruges
0x11111111 : eks "TRISB=0xff;"


Hvis man nu vil bevæge sig lidt længere og gå i gang med seriel kommunikation så findes der en header ser14.h der åbner muligheder for dette det sammen gælder for interrupt.

Hvor angår PC - programmet kunne dette f.kes. starte med at skrive og læse fra printerporten. På denne port kan sættes 8 lysdioder eller kontakter (husk modtande ikke under 300 ohm).

Lad os starte let og simpelt i dos (TC eller hvad den nu hedder) (skal være ren dos ikke win 2000)
Her bruges kommandoen outportb til at skrive ud med.
inportb bruges til at læse porten
f.eks

"
#include<dos.h>
void main()
{
outportb(0x3f8,255); // Slå kommandoen op hvis der er problemmer udskriver tegn til lpt1 - port
delay(1000); // Holder pause
outportb(0x3f8,0); // Udskriver 0 til LPT1
delay(1000); // Holder pasuse
}

"
Dette program blinker med alle bene på lpt1 porten (printerporten). For at finde en fortegnelse over LPT - porten se www.beyondlogic.org. Ben 25 er gound og fra ben 2 til ben 9 er der data....

I Windows bruges kommandoen "outb" og "inb" istedet for "outpotb" og "inportb". Der findes også en kommando kaldet "poke" og "peek" som gør det sammen. Denne virker f.eks. i qbasic. I Delphi råder jeg folk til at bruge en driver wizard, eller se om der ikke findes et api-kald.

Hvis der ønskes seriel kommunikation via. Windows i C, bruges "CreateFile" til at skabe adgang til porten. Søg om det på nettet ellers kan det være jeg skriver om det en anden dag. ("CreateFile" er et API - kald hvis jeg husker rigtigt og kan derfor bruges i alle programmerings sprog i Windows)

Dette var min første korte lektion i PIC - programmering i C++

(Held og lykke med PIC - programmeringen)


Ups det skulle have være 50 UP, men kan ikke ændre det....

Ok, nedlæg tråden så snart den kan den kom ikke ind det rigtige sted som Thomas så rigtigt fortæller mig....



[Redigeret d. 05/06-02 02:19:23 af Janus S. Andersen][Redigeret d. 05/06-02 14:15:55 af Janus S. Andersen]



4 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Ved en blød start kan det lige skrives at PIC er en microprocesser (kontroller), dvs. en CPU. Denne enheder kan programmers til et utal af forskellige ting. Som vi alle ved er det jo sådan en tingest der sidder i vores PC, blot en intel-ting og ikke en PIC.

Først et par ting omkring PIC - processoren :
PIC processoren er en RISK - processor hvilket blot siger noget om hastigheden den afvikler kommandoer på, samt hvordan den er opbygget inde i.

Fordelen ved en PIC iforhold til en intel CPU, er at PIC en har relativt få kommandoer og at den kan trække strøm på alle portene. Der kan trækkes omkring 10 mA på hver ben på PICen, dvs der kan sættes dioder på alle bene uden transistore (husk formodstand på omkring 220 ohm).

Først anskaffes en brænder til PIC - kredsen. Her kan jeg anbefale PIC-start plus, men der kan også findes et print som man kan lave billigt på internettet på adr : www.beyondlogic.org . Men herved kan der opstå problemmer med at overføre data til sin PIC, men prøv jere lidt frem. Har selv en PIC start plus, den koster omkring 1200 kr, men så kan den ofså brænde alle PIC, og viker i Windows uden problemmer.

Efter denne brænder er anskaffet downloades et kompilerings program f.eks. Mplab. Når dettte er gjordt findes en C++ kompiler. Her anbefaler jeg mplabc.exe. Denne kompiler installeres i mplab, således at programmet kan kompileres C++ filer til PIC - kredesen. Dette er desvære forskelligt fra hver version af mplab, men se evt en hjælpe file i mplab, eller prøv denne opskrift :
Åben mplab
Under menuen "edit" findes menu-feltet install lang, vælg denne. Her i vælges mplabc1 og under gemmense vælges den exe fil der hedder mplabc.exe. Hvis dette findes virker det også, mend lidt held.

Efter dette er gjordt skal der oprettes et projekt. Når dette er gjordt oprettes en "node" (en file.c). Når noden er oprettet vælges egenskaber og der vælges det rigtige hex format (der er kun 3 mulighder) og c-filen kompileres. Her er det en god ide at have en c file man er helt sikker på virker, f.eks.
"
void main()
{
}
"

(Folkens dette er kun en beskrivelse, og jeg kan desværre ikke hjælpe særlig meget hvis I ikke kan overføre et almindeligt program til en PIC. Vil helst bruge energi på selve programmeringen !!!)

Nu starter selve programeringen ....

På en PIC - kredes findes porte, dvs man deler udgange/indgange på kredsen op i 8 bits porte (kaldet I/O). Disse porte er der mulighed for at sætte retningen på. Dvs. læsses der på porten eller skrives der til porten. Dette gøres via. en variabel kaldet "TRISB" (register til PORT B). F.kes
"
void main()
{
TRISB=0; //Helle PORTB sættes til en udgang. Dvs RB0 til RB7 (se evt datablad på PIC16F84)
PORTB=255; //Alle bit på PORTB sættes høje. Alle ben på PORTB er 5 volt
}
"

Hvis vi derimod vil sætte en port til en indgang skrives dette således :
"
void main()
{
TRISB=255; //Helle PORTB sættes til en indgang. Dvs RB0 til RB7
char a=0; //Opretter 8 bit variabel og sætter den til 0
a=PORTB; //Gemmer værdien fra PORTB i a
TRISC=0; //Helle PORTC sættes til en udgang. For at kunne få et resultat
PORTC=a; //Overføre værdien fra a til PORTC
}
"
(Husk at include den file der høre til PIC - kredsen før main funktionen)


Ud af dette har vi lært kort om :
TRISX : Sætter retning på port
PORTX : Selve den port der læses/skrives fra
char : variabel type

For at gøre det nemmere at skrive og læse fra en port er der indført at PORTA.0 betyder RA0.
"
char a=0;
TRISB=255;
a=PORTB.0; //Læser IKKE hele porten, men kun bit 0 (RA0)
"

I skrive måder til PIC - kredsen kan også nævnes at :
Ved bin bruges
0b0000000 : eks. "TRISB=0b00000000;"

Ved HEX bruges
0x11111111 : eks "TRISB=0xff;"


Hvis man nu vil bevæge sig lidt længere og gå i gang med seriel kommunikation så findes der en header ser14.h der åbner muligheder for dette det sammen gælder for interrupt.

Hvor angår PC - programmet kunne dette f.kes. starte med at skrive og læse fra printerporten. På denne port kan sættes 8 lysdioder eller kontakter (husk modtande ikke under 300 ohm).

Lad os starte let og simpelt i dos (TC eller hvad den nu hedder) (skal være ren dos ikke win 2000)
Her bruges kommandoen outportb til at skrive ud med.
inportb bruges til at læse porten
f.eks

"
#include<dos.h>
void main()
{
outportb(0x3f8,255); // Slå kommandoen op hvis der er problemmer udskriver tegn til lpt1 - port
delay(1000); // Holder pause
outportb(0x3f8,0); // Udskriver 0 til LPT1
delay(1000); // Holder pasuse
}

"
Dette program blinker med alle bene på lpt1 porten (printerporten). For at finde en fortegnelse over LPT - porten se www.beyondlogic.org. Ben 25 er gound og fra ben 2 til ben 9 er der data....

I Windows bruges kommandoen "outb" og "inb" istedet for "outpotb" og "inportb". Der findes også en kommando kaldet "poke" og "peek" som gør det sammen. Denne virker f.eks. i qbasic. I Delphi råder jeg folk til at bruge en driver wizard, eller se om der ikke findes et api-kald.

Hvis der ønskes seriel kommunikation via. Windows i C, bruges "CreateFile" til at skabe adgang til porten. Søg om det på nettet ellers kan det være jeg skriver om det en anden dag. ("CreateFile" er et API - kald hvis jeg husker rigtigt og kan derfor bruges i alle programmerings sprog i Windows)

Dette var min første korte lektion i PIC - programmering i C++

(Held og lykke med PIC - programmeringen)


Ups det skulle have være 50 UP, men kan ikke ændre det....











[Redigeret d. 05/06-02 02:19:23 af Janus S. Andersen]


Er det bare mig eller er dette ikke en artikel?
jeg kan ikke finde pørgsmålet!

mvh.
Thomas Christensen




Hmmm kan ikke lukke tråden.... Skriv evt. hvordan jeg lukker tråden....[Redigeret d. 10/06-02 00:17:47 af Janus S. Andersen]



Ved en blød start kan det lige skrives at PIC er en microprocesser (kontroller), dvs. en CPU. Denne enheder kan programmers til et utal af forskellige ting. Som vi alle ved er det jo sådan en tingest der sidder i vores PC, blot en intel-ting og ikke en PIC.


Hej
Fint med noget processer artikler, men.... skal man ikke være lidt forsigtig med at sammenligne PIC'en med en Intel processer. Idag bruges de fleste PIC'er vel til embedded, pga af deres pris og relativ begrænset funktionalitet. Det er jo heller ikke alle PIC processer der kan lave floating point beregninger, hvilkeret jo begrænser brugeren meget!!. Jeg har arbejdet lidt med PIC 16F84, men pga. af dens få antal IO, og den funktionalitet iforh. til 80C51 kernen gik jeg tilbage til uP igen. Men til nogle aplikationer er PIC'en da helt iorden.
Uden at kunne sige det 100% vil jeg da tro at de fleste bruger en "alm" processer til lidt mere komplikerede system idag. For en PIC med samme funktioner og hastighed som en Inte, Atmel osv processer koster vel næsten det samme?

Lige et forslag til din artikel.
Måske skulle du fortæller lidt om der normale while løkke. Ellers skal man jo resette ens PIC for at se den ny programmerede funktion hele tiden.

Med venlig hilsen
Thomas Vanting



Hej Thomas Vanting !!!
Tak for dit svar....

Nej du har ret det er ikke sådan en der sidder i en computer, ved ikke hvorfor jeg skrev det (måske blot en måde at forklare hvad en CPU er). Hvad angår PIC - kredsen og floating - point problmmet er det rigtigt i 8 bits versionen. Jeg har også selv programmeret 8051, og jo den er bedre til nogen ting. Men set i forhold til prisen er PICen nok lidt billigere.

Der findes 16 bit PIC de hedder PIC17Fxx, der arbejder med floating - point, men der er jeg nok af samme tro som dig, hvorfor så ikke tage en anden processer. PICs er gode til relative små systemer. De fleste PICs sidder i smart-chip kort. (se evt danmønt, sattelit kort og andre kort)

Kender ikke til PIC med Emb-systemer, da disse køre RISK, hvike giver en dårlig opbygning til emb. til normale styresystmer. Men det kan da godt være de også bruges således. Hvis du nu syntes PIC - kredese er noget lort, så prøv at se på AVR. Det er en anden type af samme kredse. de koster vist lidt mindre.

Efter jeg først udviklet et system med en 80535 og derefter med en PIC16F84, og udviklings tiden varv meget kortere med PIC. Men igen det kommer anpå hvad den skal bruges til. (det var en hældings måler til et skib, når dette lastes)

På Teknikum har vi udviklet, lidt forskelligt med 8055/8088 og 80535 og jeg vil nok råde dig til at prøve en 80535, hvis du ikke er til en CPU hvor der er porte på. (kortra busser)

Du skrev noget om det manglende antal IO, jeg havde også problemmet da jeg startede med PIC16C84, men prøv lige at se PIC16F74 (den har 33 IO). Man skal også vende sig lidt til at der ikke er nogen adresse bus.....

Personligt syntes jeg blot der er sjovt at se hvad der er. For tiden er det FPGA og PLD´er der optager min tid. Sidst var det signal processore (DSP´er) og lad os nu se hvad fremtiden byder......


P.s Skriver nok a..... i sommerferien

Pp.S ved ikke hvordan jeg lukker tråden. Kan ikke blot give mig selv de 500 UPs



[Redigeret d. 18/06-02 01:43:43 af Janus S. Andersen]



t