Sida 1 av 1
pic16
Postat: 20 september 2021, 21:08:09
av Chaf
Hej
Skulle behöva hjälp att programmera en pic16 för 7 segments 8st
tid & år har pickit 3 men fixar inte.
M.v.h
Christer
Re: pic16
Postat: 20 september 2021, 22:13:14
av Icecap
Menar du hjälp som i hur gör man eller kan du inte få PICkit att programmera kretsen?
Är det hjälp med hur programmet ska fungera eller något helt annat?
Re: pic16
Postat: 20 september 2021, 22:32:59
av Chaf
Hej
Hoppas på hjälp att programmera den
M.v.h
Christer
Re: pic16
Postat: 20 september 2021, 22:37:20
av Chaf
Hej
Hoppas på hjälp att programmera den finns cod för 4 segment
M.v.h
Christer
Re: pic16
Postat: 21 september 2021, 00:59:22
av JimmyAndersson
Du skriver lite för kortfattat för att vi ska kunna förstå.
” Skulle behöva hjälp att programmera en pic16 för 7 segments 8st”
” finns cod för 4 segment”
Jag tolkar det som att det finns kod för att styra 4st segment, men du vill ha hjälp med att skriva om koden så att din PIC16 kan styra 8st vanliga 7-segments LED-display.
Tolkat jag det rätt?
Isåfall behöver vi veta:
1) Hur det är kopplat, så att rätt utgång kan styra rätt segment.
2) Om displayerna har gemensam anod eller katod.
3) Troligen ska ju något göra att vissa specifika siffror visas, t.ex tiden. Finns den delen av koden?
4) Vilket programmeringsspråk är den nuvarande koden skriven i?
Av nyfikenhet: Vilken PIC16 är det?
Re: pic16
Postat: 21 september 2021, 01:01:47
av sodjan
"PIC16" är en hel familj av processorer av väldigt olika typ och modell.
Vilken PIC16 gäller det? Har du redan processorn?
Har du länk till det som ska "programmeras" i den?
EDIT: Personligen gissar jag att "4 segment" var ett stavfel. Men vem vet...
Re: pic16
Postat: 21 september 2021, 01:03:53
av JimmyAndersson
Ha! Jag lade till den frågan innan jag såg ditt inlägg.

Re: pic16
Postat: 21 september 2021, 08:59:07
av rvl
Har du testat den nämnda koden med fyra siffror? Fungerar i såfall allt som det ska då?
Re: pic16
Postat: 21 september 2021, 12:22:47
av Icecap
Och jag kom på lite problem med att styra 8 siffror: Intensitet kontra ström.
Tar vi en 40-pin PIC16F873A (jepp, gammal modell) har den en maximal ström"genomgång" på ung. 200mA om jag inte minns fel. Med ett pincount på 56 vid direktdrivning kan man som bäst multiplexa 1:2 vid att ha 4 siffror åt gången tända.
Detta ger att en medelström per segment på 6,7mA, detta är ganska synbart i vardagsrumsbelysning men BARA med högeffektiva LED.
Kör man med 1:8 multiplexing blir det en toppström per segment på 20mA (max. per utgång) och 2,5mA i medel. Detta är än mindre synbart.
Planering behövs i detta skede alltså.
Sedan var det tiden...
Ska tiden hållas med extern RTC med batteri-back-up kan det vara värd att välja en med bra tidshållning och 1 sek puls ut.
Vid uppstart läser man tiden och kastar in i intern minne (yyyy, mt, dy, hr, mi, se) för vidare arbete.
Då behöver man bara att stega upp sekunderna med 1 per steg, hålla koll på 60, 60, 24 osv. Jag har en relativ enkel formel för uträkning av skottår som man kan lägga in - och plötsligt har man en klocka som faktisk fungerar utan för mycket tjafs.
Om det alltså inte var för att den blir svår att se pga. låg intensitet.
Re: pic16
Postat: 29 september 2021, 06:00:27
av Marta
Har byggt med 1:8 mux och moderna displayer med bra ljus och det syns jättebra. 8 pinnar för 8 siffror charlieplex utan decimalpunkt. Kräver bara de 8 sedvanliga motstånden till LED, samt en transistor per siffra.
Det enklaste och bästa är att skriva sådant i assembler. Är ju hantering på bitnivåhela tiden. En interruptrutin får scanna displayerna från minnespositioner som lagrar mönstret. Då kan den enkelt och lätt visa alla krumelurer som är möjliga med en 7-segment.
Finns intresse kan jag posta en bit av koden, men det är inte Microchip assembler.
Edit: Här är en bit av koden i all sin fulhet... Kanske mera stjälp än hjälp...
****** TMR0 INTERRUPT ROUTINE, THIS DOES THE DISPLAY CHARLIEPLEXING
*
T0IRQ LOD INTSAV.T0A,A SAVE REGS
SWN A=STATUS
LOD INTSAV.T0STAT,A
LOD A,IADRES
LOD INTSAV.T0IADR,A
CLF BSELA SET BANK0
STZ TMR1L STOP TIMER1 (DISPLAY INTENSITY) FROM INTERRUPT
CLF T0IF CLEAR DISPLAY RELATED INTFLAGS
CLF T1IF
SEF GIE MASTER IRQ ENABLE
* HANDLE RECEIVER RESET TIMEOUTS
CLF GIE STOP RX DURING PARTIAL RESET
SFC RX.RESET TIME TO RESET RECEIVER?
JMP .NORES NO
STZ RX.FLAGS RESET FLAGS
STZ RX.INPNT RESET INPUT POINTER
STZ RX.SHIFT INIT SHIFT TO COUNT BITS
INC RX.SHIFT
STZ RX.CRC RESET CRC
.NORES CLF RX.RESET FLAG RESET NXT TIME IF NO ACTIVITY
SEF GIE
STZ PORTC TURN OFF DISPLAY TO STOP GHOSTING
LOD A,#$04
AND PORTA,A
CLF CY SHIFT DIGIT SCAN BIT
ROR DISPLY.CBIT
TFZ DISPLY.CBIT ALL DIGITS DONE?
SFS Z
JMP .NOINIT NO-DON'T INIT
INC DISPLY.BTIMER INC BLINK TIMER, PLACED HERE TO GET 1/8 PERIOD
LOD A,#DISPLY.START INIT DIGIT POS^
LOD DISPLY.CDIGIT,A
SMB DISPLY.CBIT,7 INIT DIGIT SCAN BIT
.NOINIT DEC DISPLY.CDIGIT NXT DIGIT POS
LOD A,DISPLY.CDIGIT GET DIGIT POS
LOD IADRES,A ADDRESS DIGIT
STZ DISPLY.PORTA INIT BUILD OF PORTA DATA
* GET AND INSERT CHARLIEPLEX BIT
LOD A,DISPLY.CBIT GET CHARLIEPLEX POSITION
AND A,IDATA MASK OUT CHARLIEPLEX BIT
ADD A,#-1 PUT CHARLIEPLEX BIT INTO CY
* INSERT CBIT INTO PORTA BITS AND FINALIZE THEM
ROR DISPLY.PORTA INSERT CHARLIEPLEX BIT FROM CY
ROR DISPLY.PORTA SHIFT IT INTO POSITION
SWN DISPLY.PORTA CHARLIEPLEX BIT INTO BIT3
ROR A=DISPLY.CBIT GET CBIT ONE TO THE RIGHT
AND A,#$60 MASK OUT FOR DIGITS WITH ANODE IN PORTA
ORR DISPLY.PORTA,A OR IN INTO PORTA BITS
ROR DISPLY.PORTA PORTA BITS ARE NOW READY
* SET TRIS REGISTERS
SEF BSELA BANK1
LOD A,DISPLY.CBIT GET CBIT..
EOR A,#-1 ..INVERTED
AND A,IDATA GET DISPLAY DATA WITH CHARLIEPLEX BIT CLEARED
LOD TRISC,A SET TRISC, UPPER 2 BITS ARE DONT CARE
LOD DISPLY.PAD,A PUT BITS HERE FOR SHIFT
ROR DISPLY.PAD PUT THEM INTO POSITION
ROR A=DISPLY.PAD
AND A,#$30 MASK OUT
ORR A,#$0C THOSE BITS ARE INPUTS = TRIS BITS ALWAYS SET
LOD TRISA,A SET TRISA, JUST BITS 5,6 CONTAINS DATA
CLF BSELA BANK0
* DO BLINK
LOD A,DISPLY.CBIT GET DIGIT MASK
AND A,DISPLY.BFLAGS BLINK THIS DIGIT?
SFS Z
JMP .NOBLK NO-ALWAYS TURN ON
LOD A,DISPLY.BTIMER GET BLINK TIMER
AND A,#$30 ASYMMETRICAL BLINK
SFC Z
JMP .BLKOFF NO TURNON FOR BLINK DARK PERIOD
* TURN ON DISPLAY BY SETTING DATA BITS
.NOBLK LOD A,DISPLY.PORTA GET PREPARED PORTA DATA
LOD PORTA,A SET THIS FIRST TO AVOID CHARLIEPLEX BIT GHOSTING
LOD A,DISPLY.CBIT CBIT IS PORTC DATA
LOD PORTC,A
* DO INTENSITY CONTROL
.BLKOFF LOD A,#-1 SET INTENSITY TIMER
LOD TMR1H,A
LOD A,DISPLY.INTENS
LOD TMR1L,A
.DONE LOD A,INTSAV.T0IADR RESTORE REGS
LOD IADRES,A
SWN A=INTSAV.T0STAT
LOD STATUS,A
SWN INTSAV.T0A
SWN A=INTSAV.T0A
RTI IRQRTN DONE
*** TIMER 1 INTERRUPT, INTENSITY CONTROL
*
T1IRQ LOD INTSAV.T1A,A SAVE REGS
SWN A=STATUS
LOD INTSAV.T1STAT,A
CLF BSELA SET BANK0
CLF T1IF
LOD A,DISPLY.CBIT GET CHARLIEPLEX BIT
AND A,#$3F NO GHOSTING, ANODE BIT IN PORTC?
SFS Z
STZ PORTC YES-TURN OFF THIS FIRST
STZ PORTA TURN OFF DISPLAY
STZ PORTC
SWN A=INTSAV.T1STAT RESTORE REGS
LOD STATUS,A
SWN INTSAV.T1A
SWN A=INTSAV.T1A
RTI IRQRTN DONE