Tag: winpicprog

Nigel pocinje svoju seriju tutorijala sa tipicnim “hello world” programom za mikrokontrolere – tj “blinkanjem ledara”.

Za prvi deo ovog tutorijala bice nam potrebna GLAVNA1 plocica sa ledarom. sa J1 postavljenim, ili mozemo koristiti LED plocicu na portu B.

Primer 1.1

Jednostavan program koji sve io portove setuje na na 1 a onda na 0 (pisan u MikroC-u):

void main(){
   CMCON = 0x07;    // TURN COMPARATORS OFF (make it like a 16F84)
   TRISA = 0;       // Set port A all output
   TRISB = 0;       // Set port B all output
   
Loop:
     PORTA = 0xFF;  // Set all port A bits high
     PORTB = 0xFF;  // Set all port B bits high
     asm nop        // The nop's make up the time taken by the goto
     asm nop        // giving square wave output
     PORTA = 0;     // Set all port A bits low
     PORTB = 0;     // Set all port B bits low
     goto Loop;     // go back and do it again
}

Prva linija definise pocetak “glavne” funkcije, druga iskljucuje komparatore, naredne dve setuju “pravac” portova A i B. Na PIC mikrokontrolerima, digitalni IO port moze biti “ulaz” ili “izlaz”, da li je port ulazni ili izlazni podesava se registrom TRISx gde za je svaki bit tog registra vezan za bit porta i 0 predstavlja “output” a 1 “input”.

U petlji dizemo sve bitove oba porta na 1, pravimo pauzu od 2 takta (sa nop sto znaci no operation) spustamo vrednost na 0 i skacemo na pocetak petlje (ovaj skok takodje traje 2 takta tako da nam je izlaz simetrican).

Primer 1.2
Ako ste probali primer 1.1 primetili ste da ne primecujete kako LED trepce. Ne mozete primetiti treptanje posto ledare trepcu velikom brzinom (upaljene su 2-3 mikro sekunde i onda su ugasene 2-3 mikro sekunde ako uzmemo u obzir da mikrokontroler radi na 4MHz) sto je prebrzo da bi bilo detektovane golim okom. Kako bi mogli da “vidimo” promene, ubacicemo pauzu izmedju paljenja i gasenje le dioda.

void main(){
   CMCON = 0x07;    // TURN COMPARATORS OFF (make it like a 16F84)
   TRISA = 0;       // Set port A all output
   TRISB = 0;       // Set port B all output
   
Loop:
     PORTA = 0xFF;  // Set all port A bits high
     PORTB = 0xFF;  // Set all port B bits high
     asm nop        // The nop's make up the time taken by the goto
     asm nop        // giving square wave output
     Delay_ms(500); // Half a second pause
     PORTA = 0;     // Set all port A bits low
     PORTB = 0;     // Set all port B bits low
     Delay_ms(500); // Half a second pause
     goto Loop;     // go back and do it again
}

MikroC compiler koristen u ovom primeru koristi funkciju Delay_ms(x) koja sluzi da pauzira program na X milisekundi. Mi smo dodali Delay_ms(500) sto pravi pauzu od 500ms iliti pola sekunde. MikroC takodje ima funkcije Delay_us() (pauza u mikro sekundama), VDelay_ms() (pauza u mili sekundama koja nije “apsolutno tacna” ali zauzima manje prostora od Delay_us()) kao i Delay_Cyc(x) funkciju koja pravi pauzu u “taktovima”. 1 takt na PIC mikro kontroleru je na svake 4 oscilacije glavnog instrukcijskog oscilatora tako da ako nam je oscilator na 4MHz 1 takt je na svake 4 oscilacije, dakle na 1 mikro sekundu. Neki C kompajleri nude delay funkciju samo na nivou “taktova” tako da sami morate u odnosu na to kolika je brzina procesora da racunate koliko taktova vam je potrebno za vremesku pauzu od X milisekundi.

Primer 1.3
Prethodni primeri menjaju vrednost “svih” pinova jednog porta. Cesto zelimo da menjamo vrednost samo jednog pina. Razliciti C kompajleri nam dozvoljavaju da pristupimo pinovima porta na razlicite nacine. MikroC sintaksa ja PORTx.Fn gde je x – ime porta a n bit dakle, PORTA.F0 je najnizi bit porta A, PORTC.F7 je najvisi bit porta C; neke ceste sintakse su: PORTAbits.RA0, PORTA.A0, PORTA.0 i slicno. Neki kompajleri van daju mogucnost da sami kreirate strukturu i imenujete svaki pin, neki daju mogucnost da setujete pojedinacne pinove kroz funkciju (na primer – output_high(porta, 0); ) i slicno.

Ovaj primer pali i gasi RB7 (PORTB MSB – tj. najvisi bit porta B):

void main(){
   CMCON = 0x07;    // TURN COMPARATORS OFF (make it like a 16F84)
   TRISA = 0;       // Set port A all output
   TRISB = 0;       // Set port B all output
   PORTA = 0;       // Set port A all bits low
   PORTB = 0;       // Set port B all bits low

   
Loop:
     PORTB.F7 = 1;  // Set RB7 high
     asm nop        // The nop's make up the time taken by the goto
     asm nop        // giving square wave output
     Delay_ms(500); // Half a second pause
     PORTB.F7 = 0;  // Set RB7 low
     Delay_ms(500); // Half a second pause
     goto Loop;     // go back and do it again
}

Primer 1.4
Ako zelimo da umesto RB7 iz prethodnog posta palimo i gasimo LED na RB4 moramo da nadjemo svuda gde se spominje PORTB.F7 i promenimo u PORTB.F4 .. C jezik nam daje mogucnost definisanja makro-a tako da na pocetku programa mozemo da definisemo makro LED koji ce kompajler sam zameniti sa PORTB.F7 a mi ako zelimo da promenimo port/pin to cinimo samo na jednom mestu te nam je kasnije mnogo lakse da razumemo i administriramo program:

#define LED PORTB.F7
void main(){
   CMCON = 0x07;    // TURN COMPARATORS OFF (make it like a 16F84)
   TRISA = 0;       // Set port A all output
   TRISB = 0;       // Set port B all output
   PORTA = 0;       // Set port A all bits low
   PORTB = 0;       // Set port B all bits low

   
Loop:
     LED      = 1;  // Set RB7 high
     asm nop        // The nop's make up the time taken by the goto
     asm nop        // giving square wave output
     Delay_ms(500); // Half a second pause
     LED      = 0;  // Set RB7 low
     Delay_ms(500); // Half a second pause
     goto Loop;     // go back and do it again
}

Dakle ako sada u prvoj liniji umesto #define LED PORTB.F7 stavimo #define LED PORTB.F4 LED na RB4 ce se paliti i gasiti.

Primer 1.5
Sada cemo “prosetati” svetlo po redu od 8 ledara na portu B

#define LEDPORT PORTB
#define LEDTRIS TRISB

void main(){
   CMCON = 0x07;    // TURN COMPARATORS OFF (make it like a 16F84)
   LEDTRIS = 0;     // Macro points to right TRIS register, set them to output
   LEDPORT = 0;     // Macro points to right PORT, set it all low
Loop:
     LEDPORT = 0x80;// 10000000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x40;// 01000000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x20;// 00100000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x10;// 00010000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x08;// 00001000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x04;// 00000100
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x02;// 00000010
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x01;// 00000001
     Delay_ms(500); // Half a second pause
     goto Loop;     // go back and do it again
}

Primer 1.6
Vrlo lako mozemo da napravimo da se svetlo “odbija” od krajeve:

#define LEDPORT PORTB
#define LEDTRIS TRISB

void main(){
   CMCON = 0x07;    // TURN COMPARATORS OFF (make it like a 16F84)
   LEDTRIS = 0;     // Macro points to right TRIS register, set them to output
   LEDPORT = 0;     // Macro points to right PORT, set it all low
Loop:
     LEDPORT = 0x80;// 10000000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x40;// 01000000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x20;// 00100000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x10;// 00010000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x08;// 00001000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x04;// 00000100
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x02;// 00000010
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x01;// 00000001
     Delay_ms(500); // Half a second pause


     LEDPORT = 0x02;// 00000010
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x04;// 00000100
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x08;// 00001000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x10;// 00010000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x20;// 00100000
     Delay_ms(500); // Half a second pause
     LEDPORT = 0x40;// 01000000
     Delay_ms(500); // Half a second pause

     goto Loop;     // go back and do it again
}

Tags: , , ,

Keypad Plocica

keypada Keypad Plocica je vrlo jednostavan interface prema 4×4 tastaturi.

keypad - gore

keypad - gore

keypad - dole

keypad - dole

keypad - keypad

keypad - keypad

Tags: , , , ,

Stepper Plocica

stepperStepper Plocica sluzi da pokrece unipolarni stepper motor. Ima 4 tranzistora koji sluze da obezbede potrebnu struju. Tranzistori se napajaju preko 470R otpornika da si limitira bazna struja a 8 dioda sluze da absorbuju EMF posto je stepper induktivni potrosac.

J1 sluzi da odredi kako ce se motori napajati, da li sa 5V ili sa externog napajanja.

Stepper - gore

Stepper - gore

Stepper - dole

Stepper - dole

Tags: , , , ,

RS232 Plocica

serialRS232 Plocica koristi MAX232 5V -> RS232 converter chip. On konvertuje 0-5V TTL nivoe sa pinova mikrokontrolera na +/- 12V nivoe potrebne za RS232. Kao sto je uobicajeno za ovakve chipove, invertuje podatke prilikom shiftovanja nivoa. PIC USART je dizajniran da to kompenzije ali ako pravite seriski port softwerski, morate na to da obratite paznju.

RS232 - gore

RS232 - gore

RS232 - dole

RS232 - dole

Tags: , , , ,

I2C Switch Board

i2csw

I2C Switch Board ne koristi I2C uopste ali je Nigel ovu plocicu nazvao I2C posto je koristi u primerima sa I2C protokolom.

I2C switch board - gore

I2C switch board - gore

I2C switch board - dole

I2C switch board - dole

Tags: , , ,

I2C ADC Pločica

i2c_a2dI2C ADC Pločica koristi Philips PCF8591P, to je I2C chip sa 4 analogna ulaza i 1 analognim izlazom – svi sa osmobinom rezolucijom. Tu je i EEPROM kako bi mogli da snimimo semplove.

I2C ADC - gore

I2C ADC - dole

Tags: , , , , ,

I2C SAT Pločica

i2ctut2

I2C SAT Pločica koristi PCF8583P chip koji pamti i racuna vreme, ima bekap bateriju koja mu daje mogucnost da cuva tacno vreme i kada nije prikljucen na napajanje.

Ova sema je prilicno slicna prethodnoj plocica sa I2C EEPROM chipom sa par dodataka. 32KHz kristal, izlaz za alarm. 12K pull-up otpornik i komponente za bateriju (izolacione diode). Trimer sluzi da se podesi “tacnost sata” a jedna “dugmetara” od 3V bi trebalo da traje oko 5 godina.

I2C RTC gore

I2C RTC gore

I2C RTC dole

I2C RTC dole

Tags: , , , , ,

I2C EEPROM Pločica

i2ctut1I2C EEPROM Pločica koja uz pomoc I2C (ili IIC) bus-a koji je standardan bidirekcioni bus za komunikaciju izmedju chipova.
Ovaj projekat koristi standardni EEPROM. Ima razlicitih I2C EEPROM-a i skoro svi pasuju u isti socket. Dva signala koja su bitna i cine i2c bus su SDA (podaci) i SCL (takt) i oba su open-collector. Kako cemo mi koristiti samo single master komunikaciju R1 nije neophodan, ali je tu da bi zadovoljio i2c standard.

EEPROM chip moze biti bilo koji standardni i2c EEPROM, na primer: 24C02 (256 bytes), 24C04 (512 bytes), 24C08 (1024 bytes) or 24C16 (2048 bytes), to su sve ‘standard addressing’, mozemo koristiti i 24C32 (4096 bytes) ili 24LC64 (8192 bytes) koji koriste ‘extended addressing’ da bi pristupili vecoj memoriji. Na “manjim” chipovima memorija je u 256 bajtnim “stranicama” i sa standardnim adresiranjem mozemo prirstupiti samo na 8 strana. Stranicno adresiranje je takodje povezano sa adresnim linijama A0/A1/A2, 24C02 koristi sve tri linije tako da mozemo okaciti 8 komada na isti bus, dok na primer 24C04 koristi samo 2 adresne linije te samo 4 komada mogu biti na bus-u.

Plocica - gotova - gore

Plocica - gotova - gore

Plocica - gotova - dole

Plocica - gotova - dole

Tags: , , , , ,

IR Pločica

IR Pločica

IR Pločica

IR Pločica

IR pločice nam trebaju dve kako bi mogli da komuniciramo između dve glavne pločice. Sastoji se od IR prijemnika (R1, R2, C1 i prijemnoj IR demodulatora), i IR predajnika (Q1, R3, R4, R5,C2, IR1, i IR2). Ako želite jednosmernu komunikaciju možete napraviti jednu pločicu sa prijemnikom i jednu sa predajnikom.

Prijemni demodulator demodulise 38KHz signal (ovaj na Nigelovoj šemi, postoje i demodulatori za 40KHz i na 36KHz mada je 38KHz standard), R2 i C1 su tu za dekapling / stabilizaciju, i R1 je pull-up otpornik posto je izlaz open-collector.

Predajnik je obican digitalni tranzistorski prekidač, kada RB1 ode na 1 to otvori tranzistor i pusti struju kroz IR ledare. R5 limitira struju kroz IR ledare. Struja kroz ledare je prilicno velika tako da je bitno da se IR ledare pulsiraju i da se ne ostave “upaljene” posto bi ih konstantna struja ove magnitute spržila. C2 služi da isporuči potrebne pikove u zahtevima za strujom bez da to utiče na glavni 5V napon.

IR plocica - gotova - gore

IR plocica - gotova - gore

IR plocica - gotova - dole

IR plocica - gotova - dole

Tags: , , , , , ,

Joystick Pločica

Joystick Pločica

Joystick Pločica

Joystick Pločica

Joystick pločica se koristi da konektujete standardni PC joystick. Koristi 4 pina jednog porta i koristi jednostavni princip punjenja kondenzatora da pročita analognu vrenost otpora ose joystick-a. Šema je jednostavna, R1 i R2 su pull-up otpornici za dva tastera joystick-a (koji spajaju ili pin 2 ili pin 7 15 pinskog D konektora na GND). Analogni ulazi idu su na pinovima 3 i 6, i čine ih 100K potenciometri do pina 1 (5V). Analogne kontrole idu kroz R3 ili R4, i oni služe da setuju minimalni otpor (2.2K) kada je joystick kontrola na minimumu. Struja kroz ove otpornike puni C2 ili C1 i vreme pražnjenja zavisi od potenciomentra (položaja) u joystick-u + R3 (ili R4). Da bi pročitali vrednosti mi ispraznimo kondenzator, resetujemo pin na ulaz i cekamo da se kondenzator napuni dovoljno da na ulazu imamo 1; dok to čekamo merimo vreme 16bitnim brojačem koji nam daje vrednost baziranu na poziciji joystick-a.

Joystick plocica - gotova - gore

Joystick plocica - gotova - gore

Joystick plocica - gotova - dole

Joystick plocica - gotova - dole

Tags: , , , , , ,
« Previous posts Back to top