Jag kopplade upp en 628A på brödplattan, kopplade in två switchar ("load" och "save"), en 3-DIP-switch och tre lysdioder. Med DIP-switchen ställer jag in talet 0-7, med save-switchen sparar jag detta värde på EEPROM-adress 0, och med "load"-switchen hämtas värdet och skickas till lysdioderna.
Med andra ord ett totalt meningslöst bygge, men det duger för laboration.
Koden blev den här:
Kod: Markera allt
#include <p16f628a.inc>
errorlevel -302
__config _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_OFF & _INTOSC_OSC_NOCLKOUT
reset_v code 0x0
goto start
main code
start
banksel OPTION_REG
clrf OPTION_REG ; Enable pullups on PORTB
clrf VRCON ; Disable VRef-module
clrf EECON1
clrf INTCON ; Disable interrupts
movlw b'11010000' ; PORTA - 4: DIP0, 7: DIP1, 6: DIP2
movwf TRISA
movlw b'00011000' ; PORTB - 0-2: LEDs
movwf TRISB ; 3: Load (switch), 4: Save (switch)
banksel CMCON
movlw 7
movwf CMCON ; Disable comparators
clrf PORTA ; Clear ports from junk
clrf PORTB
loop
btfss PORTB, 3
goto load_from_eeprom
btfss PORTB, 4
goto save_to_eeprom
goto loop
load_from_eeprom
banksel EEADR
clrf EEADR ; Address to read
bsf EECON1, RD ; Initiate EEPROM-read
movfw EEDATA
banksel PORTB
movwf PORTB
debounce_rb3
btfss PORTB, 3
goto debounce_rb3
goto loop
save_to_eeprom
clrw ; W contains EEPROM-data to be written
; Fetch the status of the DIP-switch
btfsc PORTA, 4 ; RA4 - DIP0, RA7 - DIP1, RA6 - DIP2
iorlw 1 ; W = xxxxxxx1
btfsc PORTA, 7
iorlw 2 ; W = xxxxxx1x
btfsc PORTA, 6
iorlw 4 ; W = xxxxx1xx
banksel EECON1
movwf EEDATA ; Store the data to save
bsf EECON1, WREN ; Write enable
movlw h'55' ; Write unlock sequence
movwf EECON2
movlw h'AA'
movwf EECON2
bsf EECON1, WR ; Write!
bcf EECON1, WREN ; Disable write enable
banksel PORTB
clrf PORTB
debounce_rb4
btfss PORTB, 4
goto debounce_rb4
goto loop
end
Sen råkade det bli så att jag laddade ner en utvärderingsversion av Hi-Tech PIC C-compiler (www.htsoft.com) och fick för mig att testa C-programmering. PIC-assembler har jag programmerat i över ett år nu, och vågar påstå att jag kan det rätt bra. Därför när jag ändå hade ett sånt här litet projekt igång så var det lika bra att prova vidare.
C-koden för samma projekt blev den här:
Kod: Markera allt
#include <htc.h>
#include <pic16f62xa.h>
__CONFIG(UNPROTECT & LVPDIS & BORDIS & MCLREN & WDTDIS & PWRTDIS & INTIO);
#define bitset(var,bitno) ((var) |= 1UL << (bitno))
void main() {
OPTION = 0;
VRCON = 0;
EECON1 = 0;
TRISA = 0b11010100;
TRISB = 0b00011000;
CMCON = 0x7;
INTCON = 0;
PORTA = 0;
PORTB = 0;
while (1) {
if (!(RB3)) {
PORTB = eeprom_read(0);
while (!(RB3)) { /* Debounce switch */ }
}
if (!(RB4)) {
unsigned char data = 0;
if (RA4) bitset(data, 0);
if (RA7) bitset(data, 1);
if (RA6) bitset(data, 2);
eeprom_write(0, data);
PORTB = 0;
while (!(RB4)) { /* Debounce switch */ }
}
}
}
Slutsatsen för mig blir att C är trevligt även för PIC-processorer. Enda trista är att PICC är så sablans dyr, annars hade jag gärna införskaffat en licens.