Så nu har jag fått ihop ett program som fungerar. Kanske inte så elegant kod men den gör det den ska. Jag snyggade till koden lite för att den skulle bli enklare att följa, det kan ha smugit sig in några fel,(exempelvis så insåg jag plötsligt att "end" stod mitt i koden någonstans).
Kod: Markera allt
radix hex
include "P16F690.INC"
__config _CP_OFF & _WDT_OFF & _BOR_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF
errorlevel -302
org 0 ;Här börjar programmet
goto INITIAL
org 4 ;Hit kommer man om falggan är "triggad"
goto INTERRUPT
;----------Lite variabler-------------------------------------------------------------------------------------
;Variablernas ändelser a,b och c står för portarna på PIC'en. Det är 7 anoder (7 plan) och 14 katoder (pelare).
;Port C 0-6 styr de sju planen (anoderna) och överiga portar styr pelarna (katoderna). Tänk på att LED-strukturen
;inte är kubisk utan har Zinkbände-struktur http://en.wikipedia.org/wiki/Sphalerite (med röda och icke-röda LEDs)
;-----------------------------------------------------------------------------------------------------------------
INITIAL
count equ 20 ;variabler till delay-looparna
count2 equ 21
plan1a equ 22 ;Här kommar alla bitar ställas så att rätt A-portar är höga när plan 1 ska blinka till
plan2a equ 23 ;Här kommar alla bitar ställas så att rätt A-portar är höga när plan 2 ska blinka till
plan3a equ 24 ;etc...
plan4a equ 25
plan5a equ 26
plan6a equ 27
plan7a equ 28
plan1b equ 29 ;Här kommar alla bitar ställas så att rätt B-portar är höga när plan 1 ska blinka till
plan2b equ 2A ;etc...
plan3b equ 2B
plan4b equ 2C
plan5b equ 2D
plan6b equ 2E
plan7b equ 2F
plan1c equ 30
plan2c equ 31
plan3c equ 32
plan4c equ 33
plan5c equ 34
plan6c equ 35
plan7c equ 36
sreg equ 37 ;Har koll på hur många gågner använder tryckt på knappen
;--------Rensar lite minne---------------------------------------------------
clrf PORTA
clrf PORTB
clrf PORTC
clrf sreg
clrf plan
clrf plan2
clrf plan1a
clrf plan1b
clrf plan1c
clrf plan2a
clrf plan2b
clrf plan2c
clrf plan3a
clrf plan3b
clrf plan3c
clrf plan4a
clrf plan4b
clrf plan4c
clrf plan5a
clrf plan5b
clrf plan5c
clrf plan6a
clrf plan6b
clrf plan6c
clrf plan7a
clrf plan7b
movlw b'00000001'
movwf plan7c ;Någon LED ska slysa när PIC'en startas
;-------------Sätter Special function register-------------------------------------------------
bsf STATUS,RP1 ;Bank 2
clrf ANSEL ;digital I/O
clrf ANSELH ;digital I/O
bsf STATUS,RP0
bcf STATUS,RP1 ;Bank 1
bcf INTCON,RABIF ;Interrupt-flaggan är nere
bsf INTCON,GIE ;"Enable all unmasked interrupts"
bsf INTCON,RABIE ;"Enable RB port change interrupt"
bsf IOCA,3 ;"Detect interrupts on port RA3", denna port går att jorda genom att tycka på en knapp
clrf TRISA
clrf TRISB
clrf TRISC ;alla portar är output utom RA3 som inte går att ändra
bcf STATUS,RP0 ;Bank 0
bsf STATUS,C ;Sätter carryn
goto MAINLLOP
;---------------------Programmet----------------------------------------------------------------
;Sju delar, där varje del lyser upp (blinkar) rätt LEDs i ett plan. Det finns totalt sju plan.
;SHORTDELAY räknar ner från 255 för att uppehålla blinkningen i lika många klockcykler (trycknappen fungerade bättre då).
;----------------------------------------------------------------------------------------------------
MAINLOOP
movf plan1a,0 ;in med bitarna från plan1a i arbetsminnet
movwf PORTA ;sätt rätt pinnar i port A
call SHORTDELAY ;vänta lite
movf plan1b,0 ;gör samma sak för port B
movwf PORTB
call SHORTDELAY ;vänta
movf plan1c,0
movwf PORTC ;och för port C, här bestämms vilken plan som kan lysa då alla anoder (plan) finns i port C
call SHORTDELAY
clrf PORTC ;sätt alla pinnar i port C låga, detta släckar alla LEDs då alla anoder finns i port C
call SHORTDELAY
movf plan2a,0 ;gör likadant för nästa plan i LED-stukturen...
movwf PORTA
call SHORTDELAY
movf plan2b,0
movwf PORTB
call SHORTDELAY
movf plan2c,0
movwf PORTC ;plan 2
call SHORTDELAY
clrf PORTC
call SHORTDELAY
movf plan3a,0 ;och nästa plan...
movwf PORTA
call SHORTDELAY
movf plan3b,0
movwf PORTB
call SHORTDELAY
movf plan3c,0
movwf PORTC ;plan 3
call SHORTDELAY
clrf PORTC
call SHORTDELAY
movf plan4a,0
movwf PORTA
call SHORTDELAY
movf plan4b,0
movwf PORTB
call SHORTDELAY
movf plan4c,0
movwf PORTC ;plan 4
call SHORTDELAY
clrf PORTC
call SHORTDELAY
movf plan5a,0
movwf PORTA
call SHORTDELAY
movf plan5b,0
movwf PORTB
call SHORTDELAY
movf plan5c,0
movwf PORTC ;plan 5
call SHORTDELAY
clrf PORTC
call SHORTDELAY
movf plan6a,0
movwf PORTA
call SHORTDELAY
movf plan6b,0
movwf PORTB
call SHORTDELAY
movf plan6c,0
movwf PORTC ;plan 6
call SHORTDELAY
clrf PORTC
call SHORTDELAY
movf plan7a,0
movwf PORTA
call SHORTDELAY
movf plan7b,0
movwf PORTB
call SHORTDELAY
movf plan7c,0
movwf PORTC ;plan 7
call SHORTDELAY
clrf PORTC
call SHORTDELAY
goto MAINLOOP ;Loopa detta tills någon trycker på knappen och flaggan höjs, då hoppar programmet högst upp till org 4 -> goto INTERRUPT
;---------------När man tycker på knappen---------------------------------------------
INTERRUPT
clrf PORTC ;börjar med att släcka allt genom att ta alla anoder till låg
call DELAY ;lite väntetid så användaren hinner släppa knappen
call DELAY
call DELAY
bsf PORTC,1 ;lite blinkningar i nedersta planet för att visa att något händer och snart kommer en ny mode
bcf PORTA,0
call DELAY
bcf PORTC,1
call DELAY
bsf PORTC,1
call DELAY
bcf PORTC,1
rlf sreg,1 ;flyttar alla bitar i sreg ett steg åt vänster, eftersom carryn är satt så sätts den 0'te biten. Varje gång användaren
;trycker på kanppen så flyttas biten ett steg åt vänster med Wrap around från 7'de biten till 0'te
btfsc sreg,0 ;letar reda på var i sreg biten är satt och skickar till rätt mode
goto MODE0
btfsc sreg,1
goto MODE1
btfsc sreg,2
goto MODE2
btfsc sreg,3
goto MODE3
btfsc sreg,4
goto MODE4
btfsc sreg,5
goto MODE5
btfsc sreg,6
goto MODE6
btfsc sreg,7
goto MODE7
goto INTERRUPT ;efter mode sju kommer INTERUPT gå två varv innan den går till mode0 (pga carry)
;----------------------;Standard Delayloopar, fulhack?!--------------------------------------------------
DELAY
movlw 0xff
movwf count
movwf count2
DELAYLOOP
decfsz count,f
goto DELAYLOOP
decfsz count2,f
goto DELAYLOOP
return
SHORTDELAY
movlw 0xff
movwf count
BOUNCESHORT
decfsz count,f
goto BOUNCESHORT
return
;---------------------------Åtta olika modes för LED-strukturen----------------------------------------
;Varje gång användaren trycker på knappen så byter LED-strukturen till nästa mode. Efter den åttonde (MODE7) moden börjar den om med en första MODE0.
;Koden i alla moder är identiskt, det är bara värderna på variablerna som skijer sig åt. Efter detta så är koden slut, inte så mycket mer att se dvs.
;---------------------------------------------------------------------------------------------------------
MODE0 ;Tänder alla LEDs i stukturen
movlw b'00000000' ;in med en noll i arbets minnet
movwf plan1a ;in med samma nollor i variablen plan1a
movlw b'00000000' ;etc...
movwf plan1b
movlw b'00000010' ;plan 1
movwf plan1c
movlw b'00000000'
movwf plan2a
movlw b'00000000'
movwf plan2b
movlw b'00000100' ;plan 2
movwf plan2c
movlw b'00000000'
movwf plan3a
movlw b'00000000'
movwf plan3b
movlw b'00001000' ;plan 3
movwf plan3c
movlw b'00000000'
movwf plan4a
movlw b'00000000'
movwf plan4b
movlw b'00010000' ;plan 4
movwf plan4c
movlw b'00000000'
movwf plan5a
movlw b'00000000'
movwf plan5b
movlw b'00100000' ;plan 5
movwf plan5c
movlw b'00000000'
movwf plan6a
movlw b'00000000'
movwf plan6b
movlw b'01000000' ;plan 6
movwf plan6c
movlw b'00000000'
movwf plan7a
movlw b'00000000'
movwf plan7b
movlw b'10000000' ;plan 7
movwf plan7c
bcf INTCON,0 ;tar ner flaggan
retfie ;nu är INTERUPT-sekvensen klar, redo för ny flagga, tillbaka till MAINLOOP
MODE1 ;"Nearest neighbours" de två olika slags fyllda tetraedriska hålrum som finns i Zinblende
movlw b'11111111'
movwf plan1a
movlw b'11111111'
movwf plan1b
movlw b'00000011' ;plan 1
movwf plan1c
movlw b'11111111'
movwf plan2a
movlw b'01111111'
movwf plan2b
movlw b'00000101' ;plan 2
movwf plan2c
movlw b'11111111'
movwf plan3a
movlw b'00111111'
movwf plan3b
movlw b'00001000' ;plan 3
movwf plan3c
movlw b'11111111'
movwf plan4a
movlw b'01111111'
movwf plan4b
movlw b'00010001' ;plan 4
movwf plan4c
movlw b'11111111'
movwf plan5a
movlw b'11011111'
movwf plan5b
movlw b'00100001' ;plan 5
movwf plan5c
movlw b'11111010'
movwf plan6a
movlw b'11011111'
movwf plan6b
movlw b'01000001' ;plan 6
movwf plan6c
movlw b'11111111'
movwf plan7a
movlw b'11011111'
movwf plan7b
movlw b'10000001' ;plan 7
movwf plan7c
bcf INTCON,0
retfie
MODE2 ;Miller index (001)A -plan (röda LEDs)
movlw b'11111111'
movwf plan1a
movlw b'11111111'
movwf plan1b
movlw b'00000011' ;plan 1
movwf plan1c
movlw b'11111111'
movwf plan2a
movlw b'11111111'
movwf plan2b
movlw b'00000101' ;plan 2
movwf plan2c
movlw b'11011111'
movwf plan3a
movlw b'11111111'
movwf plan3b
movlw b'00001000' ;plan 3
movwf plan3c
movlw b'11111111'
movwf plan4a
movlw b'01111111'
movwf plan4b
movlw b'00010001' ;plan 4
movwf plan4c
movlw b'11111011'
movwf plan5a
movlw b'10111111'
movwf plan5b
movlw b'00100001' ;plan 5
movwf plan5c
movlw b'11111111'
movwf plan6a
movlw b'11011111'
movwf plan6b
movlw b'01000001' ;plan 6
movwf plan6c
movlw b'11111110'
movwf plan7a
movlw b'11101111'
movwf plan7b
movlw b'10000001' ;plan 7
movwf plan7c
bcf INTCON,0
retfie
MODE3 ;Miller index (111)A -plan (röda LEDs)
movlw b'11111111'
movwf plan1a
movlw b'11111111'
movwf plan1b
movlw b'00000011' ;plan 1
movwf plan1c
movlw b'11111111'
movwf plan2a
movlw b'11111111'
movwf plan2b
movlw b'00000101' ;plan 2
movwf plan2c
movlw b'11111111'
movwf plan3a
movlw b'10101111'
movwf plan3b
movlw b'00001000' ;plan 3
movwf plan3c
movlw b'11111111'
movwf plan4a
movlw b'01011111'
movwf plan4b
movlw b'00010001' ;plan 4
movwf plan4c
movlw b'11011010'
movwf plan5a
movlw b'11111111'
movwf plan5b
movlw b'00100001' ;plan 5
movwf plan5c
movlw b'11111111'
movwf plan6a
movlw b'11111111'
movwf plan6b
movlw b'01000001' ;plan 6
movwf plan6c
movlw b'11111111'
movwf plan7a
movlw b'11111111'
movwf plan7b
movlw b'10000001' ;plan 7
movwf plan7c
bcf INTCON,0
retfie
MODE4 ;Miller index (111)B plane (icke-röda LEDs)
movlw b'11111111'
movwf plan1a
movlw b'11111111'
movwf plan1b
movlw b'00000011' ;plan 1
movwf plan1c
movlw b'11111111'
movwf plan2a
movlw b'11111111'
movwf plan2b
movlw b'00000101' ;plan 2
movwf plan2c
movlw b'11111111'
movwf plan3a
movlw b'01011111'
movwf plan3b
movlw b'00001001' ;plan 3
movwf plan3c
movlw b'11011010'
movwf plan4a
movlw b'11111111'
movwf plan4b
movlw b'00010001' ;plan 4
movwf plan4c
movlw b'11101101'
movwf plan5a
movlw b'11111111'
movwf plan5b
movlw b'00100001' ;plan 5
movwf plan5c
movlw b'11111111'
movwf plan6a
movlw b'11111111'
movwf plan6b
movlw b'01000001' ;plan 6
movwf plan6c
movlw b'11111111'
movwf plan7a
movlw b'11111111'
movwf plan7b
movlw b'10000001' ;plan 7
movwf plan7c
bcf INTCON,0
retfie
MODE5 ;FCC enhetscell cell, röda LEDs
movlw b'11111111'
movwf plan1a
movlw b'11111111'
movwf plan1b
movlw b'00000011' ;plan 1
movwf plan1c
movlw b'11111111'
movwf plan2a
movlw b'11111111'
movwf plan2b
movlw b'00000101' ;plan 2
movwf plan2c
movlw b'11111011'
movwf plan3a
movlw b'10111111'
movwf plan3b
movlw b'00001001' ;plan 3
movwf plan3c
movlw b'11111111'
movwf plan4a
movlw b'01011111'
movwf plan4b
movlw b'00010001' ;plan 4
movwf plan4c
movlw b'11011010'
movwf plan5a
movlw b'10101111'
movwf plan5b
movlw b'00100000' ;plan 5
movwf plan5c
movlw b'11111111'
movwf plan6a
movlw b'01011111'
movwf plan6b
movlw b'01000001' ;plan 6
movwf plan6c
movlw b'11111011'
movwf plan7a
movlw b'10111111'
movwf plan7b
movlw b'10000001' ;plan 7
movwf plan7c
bcf INTCON,0
retfie
MODE6 ;Miller index (110) plan
movlw b'11111111'
movwf plan1a
movlw b'11111111'
movwf plan1b
movlw b'00000011' ;plan 1
movwf plan1c
movlw b'11111111'
movwf plan2a
movlw b'11111111'
movwf plan2b
movlw b'00000101' ;plan 2
movwf plan2c
movlw b'11111111'
movwf plan3a
movlw b'11111111'
movwf plan3b
movlw b'00001001' ;plan 3
movwf plan3c
movlw b'11111111'
movwf plan4a
movlw b'11111111'
movwf plan4b
movlw b'00010001' ;plan 4
movwf plan4c
movlw b'00000000'
movwf plan5a
movlw b'00000000'
movwf plan5b
movlw b'00100000' ;plan 5
movwf plan5c
movlw b'11111111'
movwf plan6a
movlw b'11111111'
movwf plan6b
movlw b'01000001' ;plan 6
movwf plan6c
movlw b'11111111'
movwf plan7a
movlw b'11111111'
movwf plan7b
movlw b'10000001' ;plan 7
movwf plan7c
bcf INTCON,0
retfie
MODE7 ;Alla icke-röda LEDs
movlw b'11101101'
movwf plan1a
movlw b'01011111'
movwf plan1b
movlw b'00000011' ;plan 1
movwf plan1c
movlw b'11011010'
movwf plan2a
movlw b'11111111'
movwf plan2b
movlw b'00000101' ;plan 2
movwf plan2c
movlw b'11101101'
movwf plan3a
movlw b'01011111'
movwf plan3b
movlw b'00001001' ;plan 3
movwf plan3c
movlw b'11011010'
movwf plan4a
movlw b'11111111'
movwf plan4b
movlw b'00010001' ;plan 4
movwf plan4c
movlw b'11101101'
movwf plan5a
movlw b'01011111'
movwf plan5b
movlw b'00100001' ;plan 5
movwf plan5c
movlw b'11011010'
movwf plan6a
movlw b'11111111'
movwf plan6b
movlw b'01000000' ;plan 6
movwf plan6c
movlw b'11101101'
movwf plan7a
movlw b'01011111'
movwf plan7b
movlw b'10000001' ;plan 7
movwf plan7c
bcf INTCON,0
retfie
end
Ett par problem återstår dock. Den PIC jag använt (16F690) har bara 17 st output-pinnar, och jag vill nog styra en större matris än den klarar av på egen hand. Som jag förstått det så finns två alternativ:
1) En annan PIC med fler output-pinnar
2) Skiftesregister
Vad säger ni? Jag antar att jag inte kan använda något av min nuvarande kod om jag ska köra med skiftesregister. Men det oroar mig inte så mycket då jag nästan är säker på att få mer tid och pengar till projektet nu när jag kan visa min chef vad som är möjligt.
Ett annat problem är att jag behöver mer ström till mina lysdioder. Har ni något bra tips på hur jag kan få PICen att istället för att själv lysa upp LEDarna, styra vilka LED's som får ström från en extern källa. (Om jag fattat rätt så kan min PIC få ut ca 25 mA. Jag får inte ut så mycket ur min, kan tänka mig att det beror på flera anledningar, men även om det gjorde det så måste strömmen många gånger fördela sig på ett stort antal dioder som alla vill ha 20 mA var.)
En tredje grej. Av flera olika anledningar kan jag inte använda vilka LEDs som helst. De jag provat som fungerar bäst och jag med största sannolikhet kommer att använda i min färdiga produkt är någon av dessa tre:
Grön 1200mcd 70°,
Blå 2000mcd 40° eller
Blå 600mcd 70°
Jag behöver alltså ljusstarka LEDs med hög strålningsvinkel. Jag hade gärna blandat röda och blåa (eller gröna) LEDs men jag hittar inga röda som har samma "Forward Voltage" som de blå och gröna. Om inte frammåtspänningen matchar så kommer väl bara de röda LEDarna lysa om det det är både röda och blå i ett plan som ska lysa? Tips?
Tack
/Filip