Jump to content

PiC'e jak zacząć, z czym jeść i po kiego to wogóle


pleses

Recommended Posts

Widząc pewne zainteresowanie tematyką postanowiłem założyć nowy temat. Pomysł z mikrokontrolerami urodził się przy okazji DAF'a, gdzie takowe bedą służyły za sterowanie świateł, ale zastosowań jest mnustwo! Dość powiedzieć, że w najprostszych wykonaniach tych układów masz 2 nóżki układu scalonego zarezerwowane jako zasilanie i masa, a pozostałych 6 możesz prawie dowolnie oprogramować! W sumie to Ty decydujesz co układ bedzie robił, a nie szukasz scalaka do Twojego zastosowania. Od razu mówie, że nie bedę robił za eksperta, bo w temacie siedzę raptem drugi tydzień i wciąż się uczę. Natomiast tą drogę jaką już przeszedłem chętnie opiszę.

 

Niestety należy zacząć od zakupów :-( i to tym większych czym człowiek ma mniej kolegów, od których może cośtam pożyczyć:

 

- na początku miła niespodzianka - oprogramowanie jest za darmo - wspaniały wielemogący program MPLAB (edytor, debugger, emulator i inne bardzo przydatne funkcje) producent PICów (firma MICROCHIP) udostepnia do pobrania na stronie: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002

- programator: jest ich wiele, osobiście zakupiłem JuPIC'a w: http://ajpic.zonk.pl z uwagi na pełną zgodność z MPLABem w tej samej firmie zakupiłem mikrokontrolery 12F675

- płytka uruchomieniowa: zakupiłem dwie (ZL3PIC i ZL4PIC) w:

http://www.kamami.pl/?id_prod=6462 tej drugiej narazie nie miałem okazji użyć i chyba jeszcze długo nie użyję.

- i chyba rzecz najważniejsza - podręcznik: "Mikrokontrolery PIC12Fxxx w praktyce" Autor: Stanisław Pietraszek: http://www.kamami.pl/?id_prod=6534 W książce można znaleźć kilkadziesiąt gotowych modułów aplikacji, opis procesora od A do Z a ponadto polski opis programu MPLAB i płytki uruchomieniowej ZL3PIC :-)

 

Jak już to jest można rzucać się na głęboką wodę - warto postawić na monitorze zegarek - nie wiadomo kiedy uciekają godziny i to stadami :-)

Link to comment
Share on other sites

Książka i darmowy program MPLAB, to całkiem niezły początek programów popiszesz, wirtualnie potestujesz, a zajdzie ochota, to zawsze możesz na początek podesłać do mnie program i Pica, to Ci zaprogramuję i odeślę.

A teraz do rzeczy. Przedstawiam dość użyteczny program, który mierzy długość impulsu z odbiornika RC (w ilości cykli maszynowych) i zapisuje do własnej pamięci EEPROM. Potem wystarczy przeczytać zawartość EEPROMA, wyniki uśrednić i już wiadomo w jakich zakresach porusza się drążek. Ten program może potem stanowić część oprogramowania regulatora bądź miksera. Mierzony kanał podłączyć do wejścia GP3. Jeśli podłączysz diodę do wyjścia GP2, to zaświeci ona gdy pomiar się skończy - trwa około 1,5 sekundy i dostajemy h'3F' wyników w postaci 2 bajtów - wysokiego i niskiego.

 

; konfiguracja procesora

list p=12F675 ;typ procesora

__config _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _WDT_OFF

#include p12f675.inc

 

movlw .07 ;wylaczenie komparatora i A/C

movwf CMCON

bsf STATUS, RP0

clrf ANSEL

bcf STATUS, RP0

clrf GPIO

 

 

; deklaracje IO

#define tx_in GPIO, 3;linia z sygnalem RC

#define led GPIO, 2;linia z dioda

 

; deklaracje rejestrow

cblock h'20'

T1_L, T1_H

TX_OUT, EE_ADR

EE_DATA, LICZ

endc

 

clrf EE_ADR

movlw .63

movwf LICZ

glowna

call pom_czas

bcf STATUS, RP0

movf T1_L, w

movwf EE_DATA ;przeslanie mlodszego bajtu do komórki o adresie 2n

call ee_write ;wyslanie do EE

incf EE_ADR ;nastepny adres EEPROM

movf T1_H, w

movwf EE_DATA ;przeslanie starszego bajtu do komorki o adresie 2n+1

movwf EE_DATA

call ee_write ;wyslanie do EE

incf EEADR ;nastepny adres EEPROM

decfsz LICZ

goto glowna

goto stop

 

pom_czas

bcf STATUS, RP0

bcf INTCON, GIE ;wylacz przerwania

bcf T1CON, TMR1ON ;wylacz licznik1

clrf TMR1L ;zeruj bajt mlodszy licznika

clrf TMR1H ;zeruj bajt starszy licznika

st_0 ;czekaj na 0

btfsc tx_in

goto st_0

st_1 ;czeka na zbocze +

btfss tx_in

goto st_1

bsf T1CON, TMR1ON ;odpal licznik

st_2 ;czeka na zbocze -

btfsc tx_in

goto st_2

bcf T1CON, TMR1ON ;zatrzymaj licznik

movf TMR1L, w

movwf T1_L

movf TMR1H, w

movwf T1_H

return

 

ee_write

bsf STATUS, RP0

movf EE_ADR, w

movwf EEADR

bcf STATUS, RP0

movf EE_DATA, w

bsf STATUS, RP0

movwf EEDATA

bsf EECON1, WREN ;zezwolenie na zapis

bcf INTCON, GIE ;wylaczenie przerwan

movlw h'55'

movwf EECON2

movlw h'aa'

movwf EECON2

bsf EECON1, WR ;rozpoczecie zapisu

btfsc EECON1, WR ;czy zakonczono zapis

goto $-1

bsf INTCON, GIE ;wlaczenie przerwan

bcf EECON1, WREN ;wylaczenie zezwolenia na zapis

bcf STATUS, RP0

return

stop

bsf STATUS, RP0

bcf TRISIO, GP2

bcf STATUS, RP0

bsf GPIO, GP2

end

Link to comment
Share on other sites

Witam,

To mój pierwszy post na forum. Jeżeli chodzi o książkę PIC 12fxxx to faktycznie jest to pozycja godna polecenia wszystkim początkującym. Znam osobiście jej autora - ma on pokój dwa piętra wyżej od mojego. Jest to naprawdę niezły specjalista od mikrokontrolerów firmy Microchip. jeżeli chodzi o programator JuPIC też takiego używam. Według mnie jest on najlepszy z dostępnych u nas. Oprócz programatora JuPIC używam ICD2 na USb oraz ICE 2000 też firmy Microchip. W swojej pracy zawodowej oraz modelarskiej korzystam z bardzo szerokiej gamy mikrokontrolerów:

PIC12F675,12F683,16F88,16F877,18F452 i wielu innych. W swoich projektach wykorzystuję kompilator języka C firmy CCS. Jest to dla mnie ogromna wygoda ponieważ w łatwy sposób mogę przenosić oprogramowanie między mikrokontrolerami. Poniżej pare moich ostatnich dokonań:

 

http://www.epheli.pl/index.php?name=PNphpBB2&file=viewtopic&p=23315#23315

http://www.epheli.pl/index.php?name=PNphpBB2&file=viewtopic&t=1848&highlight=polskie+%BFyro

http://www.rcauto.pl/forum/viewtopic.php?t=12428

Link to comment
Share on other sites

No to następny przydaś. program odejmuje od dwubajtowej liczby (zapisanej w rejestrach LH i LL) dwubajtową liczbę (RH i RL). Wynik obrazuje w postaci zaświecenia się jednej z 3 diod (ale przecież może robić cokolwiek innego). Tym razem podaję już jako sam goły rogram bez deklaracji tego wszystkiego na początku (wyjścia proszę zdefiniować jako "plus", "minus", "rowne"). Po co to? Ano jak zajdzie potrzeba porównania tego co przyjdzie z odbiornika RC z jakimiś konkretnymi ustawieniami na które PIC ma reagować. KJ - proszę się nie śmiać ;-)

 

;==================PROGRAM======================

movlw b'00001000'

movwf LH

movlw b'00001000'

movwf RH

movlw b'00001001'

movwf LL

movlw b'00001000'

movwf RL

 

movf RH, .0

subwf LH

btfss STATUS, C

goto ujemny

btfss STATUS, Z

goto dodatni

movf RL, .0

subwf LL

btfss STATUS, C

goto ujemny

btfss STATUS, Z

goto dodatni

goto zero

 

dodatni

bsf plus

goto koniec

ujemny

bsf minus

goto koniec

zero

bsf rowne

koniec

;============================================

end

 

Link to comment
Share on other sites

To ja może też dam przykładzik ciekawego układu.

Do wejścia RX podłączamy sygnał z aparatury - dowolny kanał. Układ mierzy szerokość takiego impulsu i pozwala w zależności od tego sterować czymkolwiek np. LED'ami. Pomiar szerokości impulsu realizowany jest na przerwaniu od zmiany stanu na pinie RA_5.

//Przełącznik
//        ________
// VDD   -|1    8|- GND
//  Rx   -|2    7|- tu może być LED
// LED   -|3    6|- tu może być LED
// reset -|4    5|- tu może być LED
//        --------
//############################################################################
#include "12f675.h"
#device adc=10
#use delay(clock=4000000)
#fuses INTRC_IO,NOWDT,MCLR,NOPROTECT,NOBROWNOUT,PUT


long timet1;

//############################################################################
// obsługa szerokości impulsu na przerwaniach
#INT_RB
rb_isr()
{   
disable_interrupts(INT_RA5);
if(input(PIN_A5) == 1)            // jeżeli stan wysoki
	set_timer1(0);
if(input(PIN_A5) == 0)            // jeżeli stan niski
	timet1 = get_timer1(); // szerokość impulsu
output_low(PIN_A4);
enable_interrupts(INT_RA5);
}
//############################################################################
void main() 
{
setup_adc_ports(0);
  	setup_adc(ADC_OFF);
setup_comparator(NC_NC_NC_NC); //musi być 
  	setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  	setup_vref(FALSE);
set_tris_a(0b00101000);       // 1 = wejścia : 0 = wyjścia
timet1 = 0;			     // wyzerowanie "czasu"
	enable_interrupts(INT_RA5);
	enable_interrupts(GLOBAL);
output_high(PIN_A4);
  	delay_ms(1500);
  	output_low(PIN_A4);
while(1)
{
	if(timet1 >= 1500)                 //zalącz LED'y
	{
		output_high(PIN_A0);
		output_high(PIN_A1);
		output_high(PIN_A2);
		output_high(PIN_A4);
	}
	else					  //wyłącz LED'y
	{
		output_low(PIN_A0);
		output_low(PIN_A1);
		output_low(PIN_A2);
		output_low(PIN_A4);
	}

}//while
}//main

 

Polecam również mój artykuł w RC Przegląd Modelarski z grudnia 2005 "Układ Fail-Safe". Opisałem tam budowę układu, którego zadaniem jest reakcja w przypadku zaniku sygnału z nadajnika lub w przypadku wystąpienia zakłóceń.

Link to comment
Share on other sites

polecam stronę Olivera Spruta (po niemiecku), który zresztą jest również modelarzem: http://www.sprut.de/

 

można tam znaleźć:

1.opisy typoszeregów z wyjaśnieniem różnic

2.podstawy, omówienie struktury PiCów

3.podstawy programowania w Assemblerze z przykładami; opis poleceń języka

4.projekty programatorów i płytek etstowych

5.bardzo dobre oprogramowanie do programatorów np PBrennerNG (http://www.sprut.de/electronic/soft/pbrenner/pbrenner2.htm)

 

sam popełniłem na podstawie projektów Spruta programator pod LPT na WinXP (Brenner5); działa bez zarzutu, a koszt budowy to mniej niż 10 złotych (no chyba, że ktoś chce sobie kupić specjalną podstawkę pod układ scalony za 40 PLN...); w międzyczasie pojawiła się wersja pod USB (Brenner8)

 

na stronie jest m.in. opis urządzenia zapisującego dane lotu (wysokość w funkcji czasu) i mnóstwo innych ciekawych rzeczy...

 

polecam stronę, warto zajrzeć!

 

pozdrawiam

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.