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.