PIC-styrd LED-matris

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: PIC-styrd LED-matris

Inlägg av E85 »

Jag hoppade över att lära mig assembler och gick direkt på C (som jag använt lite i windows tidigare). Det har jag inte ångrat en sekund kan jag säga! Din elfalänk pekar fel. Antar att det är den här: 73-344-18 ? Det där PICC Lite som följer med (och är gratis) har jag inte provat eftersom jag kört med PIC18 men det är säkert roligare än att tugga assembler.
Lenrick
Inlägg: 16
Blev medlem: 9 juni 2009, 15:32:18

Re: PIC-styrd LED-matris

Inlägg av Lenrick »

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
Lenrick
Inlägg: 16
Blev medlem: 9 juni 2009, 15:32:18

Re: PIC-styrd LED-matris

Inlägg av Lenrick »

Ursäkta om tabbar och annat i koden blev lite fult, det hände en del oväntade saker när jag klippte in koden från Anteckningar. Hoppas den går att följa ändå.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: PIC-styrd LED-matris

Inlägg av vfr »

Allegro har kombinerade skiftergister och drivare. Typ gamla UCN58xx-kretsar i modern variant.

Om du har en koppling som är beroende på parallellkopplade LED med lika spänningsfall, så är det felkopplat. Varje LED (eller kedja med seriekopplade LED) skall ha eget förkopplingsmotstånd. Då påverkar inte små variationer i spänningfall. Stora variationer (t.ex olika färger som alltid har olika spänningsfall) kan man kompensera för med olika motstånd.
Användarvisningsbild
Glenn
Inlägg: 36773
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: PIC-styrd LED-matris

Inlägg av Glenn »

Ang drivningen, Själv använde jag mej av ULN2004, fast jag byggde ju bara i "ett plan", men det gjorde ju dessutom att jag kunde tända valfri lysdiod genom att lägga rätt pinnar höga på både X och Y-led istället för en låg och en hög. ..Det stora felet med ULN200x är ju att den bara har SJU drivstek *suck* vad var det för mufflon som kom på den brighta iden ? ..så då får man ta två kretsar, och ha sex steg över :(

Ang pinnarna skulle jag valt en större pic, 16F877A är den jag använder absolut mest själv, nu är den iofs "ersatt" av 16F887 som är bättre på allt(?), men jag har en massa 877A liggandes så jag kör vidare på den.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: PIC-styrd LED-matris

Inlägg av vfr »

Då kan man använda ULN2804 istället. 8 drivare isf 7. UCN-drivarna är ungefär samma sak fast med möjlighet till serieingång modell skiftregister.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-styrd LED-matris

Inlägg av sodjan »

> Om jag fattat rätt så kan min PIC få ut ca 25 mA.

Det är normalt max för *EN* pinne.
Sedan finns det max för en hel port samt för hela kretsen. RTFM !

> men jag hittar inga röda som har samma "Forward Voltage" som de blå och gröna.

Självklart gör du inte det. Det finns inte.

> 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?

Lite svårt att tolka din fråga, men en tokning är att du har gjort en riktig ful-koppling.
Olika Vf brukar "bara" göra att man får ha olika strömbegränsning eller olika pulslängder.
Det låter lite som om de är parallellkopplade...
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: PIC-styrd LED-matris

Inlägg av v-g »

Egentligen är framspänningsfallet på dioden rätt ointressant en LED är styrd av strömmen och inget annat, framspänningsfallet finns angivet för att man ska kunna räkna enklare.

Har man ett labbagg. med variabel utspänning kan man med en multimeter med strömmätning enkelt kolla spänningsfallet genom att dra upp spänningen tills strömmen är 20mA eller vad nu dioden har. Det går även med en potentiometer men där får man vara öfrsiktig då spänningen snabbt ökar.
Lenrick
Inlägg: 16
Blev medlem: 9 juni 2009, 15:32:18

Re: PIC-styrd LED-matris

Inlägg av Lenrick »

sodjan skrev:> Det är normalt max för *EN* pinne.
Sedan finns det max för en hel port samt för hela kretsen. RTFM !
Read The Fucking Manual!...Läs i manualen för helvete!

Menar du databladet, eller finns det en manual som jag missat? I databladet står det:
"Maximum output current sourced by any I/O pin ........................... 25 mA". Eftersom jag inte kan det här så bra så säger mig inte texten speciellt mycket.
sodjan skrev:>Självklart gör du inte det. Det finns inte.
Jag kunde tänka mig att det var på det sättet. Visst kan jag en del om våglängd, energi och bandgap och sådana LEDs borde inte finnas, men jag blir förvånad över olika saker och ting varje dag. Exempelvis så forskas det en hel del på LED som bygger på punktdefekter (här är en länk till första artikeln jag hittade på området Point defect engineered Si sub-bandgap light-emitting diode, titeln säger ju en del men jag har faktiskt ingen aning om hur en sådan LED fungerar eller om de finns på marknaden.) Så så självklart tycker jag inte att det är.
sodjan skrev:Lite svårt att tolka din fråga, men en tokning är att du har gjort en riktig ful-koppling.
Olika Vf brukar "bara" göra att man får ha olika strömbegränsning eller olika pulslängder.
Det låter lite som om de är parallellkopplade...
Ful-koppling...ful koppling. Definiera ful-koppling...eller nej, gör inte det förresten.

Sodjan: Jag får inte ut så mycket från dina svar och du vekar mest störa dig på mina otydliga och dumma frågor. Jag är tacksam att du försökt hjälpa till, men du behöver inte fortsätta om du inte vill.


/Filip
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: PIC-styrd LED-matris

Inlägg av v-g »

Du har hittat rätt i manualen ja:
Maximum output current sunk by any I/O pin....................................................................................................25 mA
Maximum output current sourced by any I/O pin..............................................................................................25 mA
Maximum current sunk by PORTA, PORTB and PORTC (combined)............................................................200 mA
Maximum current sourced PORTA, PORTB and PORTC (combined)............................................................200 mA
Du har ju 24 pinnar totalt och med 25mA/st så kommer du då totalt upp i 600 mA men kretsen tål bara 200mA totalt. Betänk också att detta är listat under Absolute Maximum Ratings dvs det är inte lämpligt att köra "enligt" dessa.

Fotnoten under säger nämligen:
NOTICE: Stresses above those listed under “Absolute Maximum Ratings” may cause permanent damage to the
device. This is a stress rating only and functional operation of the device at those or any other conditions above those
indicated in the operation listings of this specification is not implied. Exposure to maximum rating conditions for
extended periods may affect device reliability.
Sodjan menar inget illa så du kan ta det lugnt. Det han däremot menar är att läsa manualen noga under de punkter som kan tänkas vara intressanta, det är liksom inget roligt för vare sig han, mig eller någon annan att leta i manualen efter rena RTFM frågor. Däremot är det tillåtet att fråga om man inte hittar vad man söker. Sen kan man ju skriva det hela på olika snälla sätt också :?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-styrd LED-matris

Inlägg av sodjan »

Japp, i detta fall är "manualen" = databladet. :-)

Nu är jag lite osäker på vilken processor du har, men om jag kollar i databladet för en
vanlig modell (16F690) så står allt det du frågar om under "Absolute Maximum Ratings"
i kapitel 17. Lite onödigt att kopiera texten här i forumet, men jag gör det i alla fall.
Total power dissipation(1) .......................................................................................800 mW
Maximum current out of VSS pin .............................................................................. 300 mA
Maximum current into VDD pin ................................................................................. 250 mA
Input clamp current, IIK (VI < 0 or VI > VDD).............................................................± 20 mA
Output clamp current, IOK (Vo < 0 or Vo >VDD)..........................................................± 20 mA
Maximum output current sunk by any I/O pin............................................................... 25 mA
Maximum output current sourced by any I/O pin .......................................................... 25 mA
Maximum current sunk by PORTA, PORTB and PORTC (combined) ................................... 200 mA
Maximum current sourced PORTA, PORTB and PORTC (combined).................................... 200 mA
Notera speciellt där det står "(combined)" ovan ! Lätt att missa...

Det är även viktigt att notera vad som står på samma sida direkt under värderna :
NOTICE: Stresses above those listed under “Absolute Maximum Ratings” may cause permanent
damage to the device. This is a stress rating only and functional operation of the device at those
or any other conditions above those indicated in the operation listings of this specification is not
implied. Exposure to maximum rating conditions for extended periods may affect device reliability.
Med andra ord, det är *inte* värden som ska användas som design-värden !
Det är bara de gränser där Microchip garanterar att processorn inte tar *permanent* skada.
Det finns alltå ingen garanti att processorn *fungerar* för övrigt om man ligger på (eller överskrider) dessa nivåer !
Så är det alltid med "Absolute Maximum Ratings" oasvett vilken leverantör det handlar om...

För normalt bruk finns det en massa värden i resten av "ELECTRICAL SPECIFICATIONS".

Om man ligger och designar med/mot dessa gränsvärden så har man sannolikt tänkt fel från början.
Backa tillbaka lite och gör om designen så att du har bättre marginaler.

En "ful-koppling" med LEDs är t.ex att koppla flera LEDs parallellt med gemensamt
strömbegränsningsmotstånd. Med olika typer av LEDs (med olika Vf) så är det ju
uppenbart att det inte går, men det är inte att rekomendera även med "likadana"
LEDs heller, de är aldrig exekt lika. Seriekopplade LEDs är en helt annan sak.

Det var så jag tolkade det när du skrev "Om inte frammåtspänningen matchar så kommer
väl bara de röda LEDarna lysa". Du kan ju förtydliga vad du menar med det annars. Varför
skulle bara de röda lysa ??
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: PIC-styrd LED-matris

Inlägg av v-g »

Jag länkade rätt manual i mitt inlägg, kikade under include i den postade koden ;)
Lenrick
Inlägg: 16
Blev medlem: 9 juni 2009, 15:32:18

Re: PIC-styrd LED-matris

Inlägg av Lenrick »

sodjan skrev:En "ful-koppling" med LEDs är t.ex att koppla flera LEDs parallellt med gemensamt
strömbegränsningsmotstånd. Med olika typer av LEDs (med olika Vf) så är det ju
uppenbart att det inte går, men det är inte att rekomendera även med "likadana"
LEDs heller, de är aldrig exekt lika. Seriekopplade LEDs är en helt annan sak.
Just nu är min prototyp "ful-kopplad" då jag varit tvungen att blanda lysdioder hej vilt. Men prototypen är bara byggd för att jag ska ha något att öva programmering på. Till den slutgiltiga strukturen kan jag köpa vilka LEDs jag vill. I mitt nuvarande program lyser jag upp ett plan i taget (i 255 klockcykler) i detta plan delar alla LEDarna anod, vilken är kopplad till exempelvis port C0, men deras katoder är kopplade till var sin pinne (säg några A och B -portar). Ofta är det inte mer än 2-5 st lysdioder i varje plan som ingår i ett visst mönster och därmed lyser. Porten som är kopplad till planet i fråga (anod) är hög medan bara vissa A och B -portar (katoder) är låga och därmed lyser bara några LEDs i det planet upp. Men med lite mer kod kan jag lysa upp varje LED var för sig genom att bara ha en katod-port låg åt gången.

Alla LEDar delar katod med andra LEDar i planen över och under sig (men två LEDar i samma plan delar aldrig katod). Strömledarna i min struktur består av kraftig ståltråd som är bockad i ett siksak-mönster och symboliserar bindningarna mellan atomerna i strukturen. Jag kan omöjligt ha olika motstånd till varje LED, jag kan heller inte ha olika motstånd de röda och blå lysdioderna. Det är därför jag nu tänker ha blåa och gröna (med så gott som identiska värden) LEDs istället. Den ena färgen symboliserar atomslag 1 och den andra färgen atomslag 2 i min zinkbländestruktur (se den på wiki)
sodjan skrev:Det var så jag tolkade det när du skrev "Om inte frammåtspänningen matchar så kommer väl bara de röda LEDarna lysa". Du kan ju förtydliga vad du menar med det annars. Varför
skulle bara de röda lysa ??
Så som jag tänkte var att röda lysdioder har en lägre tröskelspänning än de blå. Om jag nu parallellkopplar röda och blå lysdioder. Lägger en låg spänning över dioderna. Ökar spänningen till jag når de röda dioderna tröskelspänning. De börjar att lysa. Eftersom lysdiodernas ström-spänningskarakteristik ser ut som den gör så når jag aldrig upp till ett spänningsfall som gör att de blåa dioderna börjar lysa (även om jag vrider mer på ratten på spänningskuben), eftersom det är mycket lågt spänningsfall över de lysande röda dioderna. Det låga spänningsfallet gör att vi knappast kommer få högre spänningsfall än de röda diodernas tröskelspänning.

Det var så här jag tänkte, men jag är inte så haj på det här och det var länge sedan jag läste en kurs om dioder och p/n-övergågnar.

Om jag nu ändrar koden så att jag "tilltalar" en LED i taget. Jag måste ha identiska motstånd alla LEDar, jag har två olika typer av LEDar, och varje LED kan endast kopplas till två portat (en port till anod och en till katod). Det lät på dig innan som om det fanns utrymme i mjukvara för att kompensera för de identiska motstånden så att båda typerna av lysdioder lyser bra. Förstod jag rätt?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC-styrd LED-matris

Inlägg av sodjan »

> ...i detta plan delar alla LEDarna anod, vilken är kopplad till exempelvis port C0, men deras katoder
> är kopplade till var sin pinne (säg några A och B -portar).

Var sitter strömbegränsningsmotstånden ?
Av ovanstående kan man tro att de saknas helt.

> ...Om jag nu parallellkopplar röda och blå lysdioder....

Gör inte det. I alla fall inte om de ska lysa samtidigt. Det fungerar inte.
Om de inte har individuella motstånd i varje "ben" i kopplingen. När jag
skriver "parallellkopplar" så menar jag att lysdioderna är direkt kopplade
till samma matning utan andra komponenter inblandade.

> Det lät på dig innan som om det fanns utrymme i mjukvara för att kompensera
> för de identiska motstånden så att båda typerna av lysdioder lyser bra.

Ja, förrutsatt att de inte är kopplade parallellt (alltså har gemensam
anslutning i båda ändar), utan har separata anslutningar.
Lenrick
Inlägg: 16
Blev medlem: 9 juni 2009, 15:32:18

Re: PIC-styrd LED-matris

Inlägg av Lenrick »

sodjan skrev:> Var sitter strömbegränsningsmotstånden ?
Av ovanstående kan man tro att de saknas helt.
Just nu sitter motstånden mellan porten och sladden som kontakterar ståltråden som alla anoder (i ett visst plan) är fästa i.
sodjan skrev: Om de inte har individuella motstånd i varje "ben" i kopplingen.
Att ha ett motstånd mellan den kraftiga ståltråden och anod-benet på lysdioden är en lösning. Det skulle faktiskt vara möjligt att göra på det sättet, men att löda det vet jag inte om jag klarar av. Jag ska se om jag kan hitta någon som är lite mer praktiskt lagd än jag.


sodjan skrev:Ja, förrutsatt att de inte är kopplade parallellt (alltså har gemensam
anslutning i båda ändar), utan har separata anslutningar.


Nu kommer de ha gemensam anslutning i ena änden men inte i andra. Jag förstår inte riktigt vad mjukvaran skulle kunna göra (det finns ju bara två lägen på en out-put pinne). Hjälper det med olika långa "pulser", alltså att jag skulle tända blå dioder i x klockcykler och röda i y klockcykler?
Skriv svar