mucim se 5 dana i trazim pomoc al google mi i nenudi nista korisno....
kako da spojim 2-3-4 kom 7segmentna displeja na recimo pic 16f84 mislim znam kako da spojim al me interesuje kako da isprogramiram da na njima bude razlicit broj znaci mene interesuje multiplexiranje signala na PORTA jer su mi tu spojene zajednicke anode-katode
pokusavam nesto da naucim al mi neide od ruke .....
ako neko ima strpljenja da mi objasni........ :)
Moderators: pedja089, stojke369, [eDo], trax
- sindja1204
- Odlično uznapredovao
- Posts: 792
- Joined: 03-05-2009, 11:57
- Location: Beograd
Re: ako neko ima strpljenja da mi objasni........ :)
Za pocetak pogledaj ovaj pedjin kurs...
http://www.elektronika.ba/forum/viewtop ... 9&start=30" onclick="window.open(this.href);return false;
http://www.elektronika.ba/forum/viewtop ... 9&start=30" onclick="window.open(this.href);return false;
Re: ako neko ima strpljenja da mi objasni........ :)
evo da ne mora čitati sve ja ću mu pokušatiu objasniti
dakle bit ti je svega toga da su ti u dislplay-u spojeni svi segmenti zajedno (osim zajedničkih katoda/andoda). i recimo da želiš ispisati broj 123 na display i da su ti zajedničke anode / katode spojene ovako: prvi disp. na PORTA.0, drugi na PORTA.1, a treći na PORTA.2 (pod disp. mislim na znamenke). i sada prvo pustiš struju kroz porta.0 te ispišeš na displayu broj 1 zadim napraviš kraktu zadršku (recimo 5ms),onda prekineš struju kroz porta.0,pustiš stkuju kroz porta.1,ispišeš broj 2,napraviš zadršku,prekineš struju kroz porta.1,pustiš struju kroz porta.2,ispišeš broj 3,napraviš zadršku,prekineš struju kroz porta.0
i da nezaboravi ovo:
ako ti je display sa zajedničkom katodom onda kad želiš upaliti taj disp (tj.pustiti struju kroz njega) tada ti mora biti porta.0 = 0 uprotivnom,ako ti je display sa zajedničkom anodom ide normalno porta.0 = 1
dakle bit ti je svega toga da su ti u dislplay-u spojeni svi segmenti zajedno (osim zajedničkih katoda/andoda). i recimo da želiš ispisati broj 123 na display i da su ti zajedničke anode / katode spojene ovako: prvi disp. na PORTA.0, drugi na PORTA.1, a treći na PORTA.2 (pod disp. mislim na znamenke). i sada prvo pustiš struju kroz porta.0 te ispišeš na displayu broj 1 zadim napraviš kraktu zadršku (recimo 5ms),onda prekineš struju kroz porta.0,pustiš stkuju kroz porta.1,ispišeš broj 2,napraviš zadršku,prekineš struju kroz porta.1,pustiš struju kroz porta.2,ispišeš broj 3,napraviš zadršku,prekineš struju kroz porta.0
i da nezaboravi ovo:
ako ti je display sa zajedničkom katodom onda kad želiš upaliti taj disp (tj.pustiti struju kroz njega) tada ti mora biti porta.0 = 0 uprotivnom,ako ti je display sa zajedničkom anodom ide normalno porta.0 = 1
Re: ako neko ima strpljenja da mi objasni........ :)
e to mene interesuje kojom komandom da dobijem da se na porta smjenjuju stanja
Re: ako neko ima strpljenja da mi objasni........ :)
to ti ovisi o programskom jeziku. ako koristiš PicBasicPRO onda možeš na par načina:
1. sa komandom portx.x = x (recimo portb.1 = 0) - kažeš da li će stanje na pinu biti logička nula ili jedinica
2. trisa/b/c/d/e = %XXXXXXXX (recimo trisb = %10100100)-s ovom komandom kontroliraš cijeli port što znači kontroliraš cijeli portb a ovi x-evi su ti zasebni izlazi (prvi ti je, ako se nevaram,portb.7,i ako želiš da ti on bude na logičkoj jedan onda upisuješ 1 u suprotonm upisuješ nulu
3. komanda toggle porta/b/c/d/e.x - mijenja stanje na pinu, ako je recimo prijašnje stanje na portu bilo jedan nakon korištenja ove komande biti će nula (recimo TOGGLE portb.1)
4. High/low Porta/b/c/d/e.x (recimo High porta.0) - tu je sve jasno,kažeš da li će stanje na pinu biti logička visoka (tj. jedinica) ili niska (tj.nula)
naravno na početku programa obavezno portove koji se koriste kao izlazni definirati (npr. output portb.0). Ali pazi! Ako ti je katoda ledice spojena na port onda moraš ga nazvati ulaznim a to činiš na sljedeći način Input portx.x (recimo portb.0)
nadam se da sam ti pomogao s ovime
1. sa komandom portx.x = x (recimo portb.1 = 0) - kažeš da li će stanje na pinu biti logička nula ili jedinica
2. trisa/b/c/d/e = %XXXXXXXX (recimo trisb = %10100100)-s ovom komandom kontroliraš cijeli port što znači kontroliraš cijeli portb a ovi x-evi su ti zasebni izlazi (prvi ti je, ako se nevaram,portb.7,i ako želiš da ti on bude na logičkoj jedan onda upisuješ 1 u suprotonm upisuješ nulu
3. komanda toggle porta/b/c/d/e.x - mijenja stanje na pinu, ako je recimo prijašnje stanje na portu bilo jedan nakon korištenja ove komande biti će nula (recimo TOGGLE portb.1)
4. High/low Porta/b/c/d/e.x (recimo High porta.0) - tu je sve jasno,kažeš da li će stanje na pinu biti logička visoka (tj. jedinica) ili niska (tj.nula)
naravno na početku programa obavezno portove koji se koriste kao izlazni definirati (npr. output portb.0). Ali pazi! Ako ti je katoda ledice spojena na port onda moraš ga nazvati ulaznim a to činiš na sljedeći način Input portx.x (recimo portb.0)
nadam se da sam ti pomogao s ovime
Re: ako neko ima strpljenja da mi objasni........ :)
Ipak ti je moja preporuka da procitas (i ako je moguce odradis predvidjene vjezbe) iz Pedjinog kursa, vidjet ces da ima jako dobrih stvari a i puno tezih problema koje ces vrlo brzo shvatiti. To ce ti trebati ako budes mislio da se bavis mikrokontrolerima. Jako dobar kurs i obuhvata sustinu rada. Odlicna osnova za dalju nadgradnju.
- Elektronicar
- Pravo uznapredovao :)
- Posts: 467
- Joined: 19-01-2008, 17:05
- Location: Balkan
Re: ako neko ima strpljenja da mi objasni........ :)
Evo ti gotov primer pisan u mikrobasic-u imas na njihovom sajtu jos gomilu drugih primera.
Code: Select all
' *
' * Project name:
' Display7seg (Advanced 7Seg. display example)
' * Copyright:
' (c) mikroElektronika, 2008
' * Revision History:
' 20080225:
' - initial release.
' * Description:
' This code demonstrates displaying number on four 7-segment display (common
' cathode), in multiplex mode. All 7-segment displays are connected to PORTD
' (RD0..RD7, segment A to RD0, segment B to RD1, etc) with refresh via pins
' RA0..RA3 on PORTA. Number is on for 1 second.
' * Test configuration:
' MCU: PIC16F887
' Dev.Board: EasyPIC5
' Oscillator: HS, 08.0000 MHz
' Ext. Modules: -
' SW: mikroBasic v7.1
' * NOTES:
' - make sure you switch on DIS0 - DIS3 switches on SW6. (board specific)
' *
program Display7seg
dim shifter, portd_index as byte
digit, number as word
portd_array as word[4]
sub function mask(dim num as Word) as Word
select case num
case 0 result = $3F
case 1 result = $06
case 2 result = $5B
case 3 result = $4F
case 4 result = $66
case 5 result = $6D
case 6 result = $7D
case 7 result = $07
case 8 result = $7F
case 9 result = $6F
end select 'case end
end sub
sub procedure interrupt
PORTA = 0 ' Turn off all 7seg displays
PORTD = portd_array[portd_index] ' bring appropriate value to PORTD
PORTA = shifter ' turn on appropriate 7seg. display
' move shifter to next digit
shifter = shifter << 1
if (shifter > 8) then
shifter = 1
end if
' increment portd_index
Inc(portd_index)
if (portd_index > 3) then
portd_index = 0 ' turn on 1st, turn off 2nd 7seg.
end if
TMR0 = 0 ' reset TIMER0 value
INTCON = $20 ' Clear T0IF
end sub
main:
ANSEL = 0 ' Set AN pins to Digital I/O
ANSELH = 0
OPTION_REG = $80 ' Timer0 settings
digit = 0
portd_index = 0
shifter = 1
TMR0 = 0
INTCON = $A0 ' Enable GIE, T0IE
PORTA = 0
TRISA = 0 ' Set PORTA as output
PORTD = 0
TRISD = 0 ' Set PORTD as output
number = 6789 ' some initial value
while TRUE
digit = number / 1000 ' extract thousands digit
portd_array[3] = mask(digit) ' and store it to PORTD array
digit = (number / 100) mod 10 ' extract hundreds digit
portd_array[2] = mask(digit) ' and store it to PORTD array
digit = (number / 10) mod 10 ' extract tens digit
portd_array[1] = mask(digit) ' and store it to PORTD array
digit = number mod 10 ' extract ones digit
portd_array[0] = mask(digit) ' and store it to PORTD array
Delay_ms(1000) ' one second delay
Inc(number) ' increment number
if (number > 9999) then
number = 0
end if
wend ' endless loop
end.