Det här kan väl egentligen inte kallas för ett projekt, men det kanske kan vara intressant för nån ändå. Det första man brukar göra när man byggt/skaffat en programmerare och installerat mjukvara för densamma brukar vara att göra enklast möjliga program, bara för att se att allt fungerar. Och det brukar vara att blinka med en LED.
Mitt första blinkerprogram skrev jag i MikroPascal för en PIC12F675, en av de mindre kretsarna från Microchip.
De enda komponenter som krävs för en fungerande koppling förutom själva mikrokontrollern är en lysdiod och ett par motstånd samt en kondensator. I den här kopplingen så används den inbyggda oscillatorn, om man vill använda en extern kristall så tillkommer den och ett par kondensatorer. Som synes på schemat härunder så är det en väldigt enkel koppling.
Experimentplatta
Om man monterar kopplingen på en experimentplatta så kan det se ut som nedan. De tre kablarna som försvinner ur bilden går till programmeraren och används bara under programmering.
Veroboard
Om man istället vill montera det hela på ett veroboard så kan man göra så här:
Notera att det totalt är fem avbrott som ska göras i kopparbanorna samt två trådbryggor. Det finns utrymme kvar för pinnar till programmeraren om man vill använda ICSP, men de är inte markerade på kortet.
Kretskort
Om man hellre vill lägga ner tid på att göra ett ”riktigt” kretskort så kan det se ut som nedan. Överst komponentplacering och underst ledningsbanorna. OBS. ledningsbanorna är spegelvända. Klicka här för att ladda ner en PDF med layouten.
För att programmera PICen så finns det en hel massa alternativ. Man kan välja t.ex. BASIC, C, C++, Pascal eller assembler.
// Blinker v1.0
//
// Skrivet i mikroPascal för PIC12F675/12F629
//
// (C)2008 Göran Gustafsson
//
program blinker;
begin
TRISIO := %00000000; // Alla portar till utgångar
CMCON := $07; // Stäng av komparator
repeat
SetBit (GPIO,0); // Stäng av LED...
delay_ms(1000); // ...i en sekund.
ClearBit (GPIO,0); // Tänd LED...
delay_ms(100); // ...i en tiondels sekund,
until true = false;
end.
' Blinker v1.0
'
' Skrivet i Proton Basic för PIC12F675
'
' (C)2008 Göran Gustafsson
'
Device = 12F675 ' Tala om vilken krets vi kör med
XTAL = 4 ' Klocka på 4 MHz
TRISIO=%00000000 ' Sätt alla portar till utgångar
cmcon=$07 ' Stäng av komparator
loop: high GPIO.0 ' Stäng av LED...
delayms 1000 ' ...i en sekund.
low GPIO.0 ' Tänd LED...
delayms 100 ' ...i en tiondels sekund.
goto loop
' Blinker v1.0
'
' Skrivet i mELabs PIC BASIC för PIC12f675/629
'
' (C)2008 Göran Gustafsson
'
TRISIO = %00000000 ' Alla portar till utgångar
CMCON = $07 ' Stäng av komparator
loop: HIGH GPIO.0 ' Stäng av LED...
PAUSE 1000 ' ...i en sekund.
LOW GPIO,0 ' Tänd LED...
PAUSE 100 ' ...i en tiondels sekund,
GOTO loop
; Blinker v1.0
;
; Skrivet i assembler för PIC12F675
;
; (C)2008 Göran Gustafsson
;
list p=12f675
include
__CONFIG _MCLRE_ON & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
main CODE 0x0000
bcf STATUS,RP0 ; Bank 0
clrf GPIO ; Initiera GPIO
movlw 07h ; slå av...
movwf CMCON ; ...komparator
bsf STATUS,RP0 ; Bank 1
clrf ANSEL ; Digital IO
movlw b'00001000' ; Sätt alla bitar ...
movwf TRISIO ; till utgångar
bcf STATUS,RP0 ; Bank 0
loop bsf GPIO,0 ; Släck LED i ~1 sekund
call delay1
bcf GPIO,0 ; Tänd LED i ~en tiondels sekund
call delay2
goto loop ; Fortsätt i evighet
; Variabler som används i fördröjningsrutinerna
variables UDATA_SHR
temp1 RES 1
temp2 RES 1
temp3 RES 1
; Subrutiner för fördröjning. Observera att tiderna
; är "höftade" och stämmer inte på mikrosekunden...
CODE
delay movlw 0xa0
movwf temp1
del_2 movlw 0xff
movwf temp2
del_1 decfsz temp2,f ; Minska temp2
goto del_1 ; Om !=0 gör om,
decfsz temp1 ; annars minska temp1
goto del_2 ; om !=0 gör om,
return ; annars hoppa tillbaka.
; Den här subrutinen fungerar exakt likadant som den ovan
; men använder en variabel till för att få en ännu längre
; fördröjning.
delay2 movlw 0x3a
movwf temp1
dell_3 movlw 0xf7
movwf temp2
dell_2 movlw 0x1b
movwf temp3
dell_1 decfsz temp3,f
goto dell_1
decfsz temp2,f
goto dell_2
decfsz temp1,f
goto dell_3
return
end
Och nu, efter kopplande och programmerande, och efter att det färdiga programmet förts över till kretsen, så har man förhoppningsvis en fungerande blinkkrets.