Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
ATmega168 7-Segmentni Display
Jeli zna neko dali se ima gdje datasheet sa pinovima za ovaj display? Treba mi tocan pinout i broj pina da mogu da nacrtam shemu i da kasnije spojim pinove na MCU...nemogu nigdje da nadjem pdf sa pinoutom...

Reply
Instrument prebacen na diodni opseg, pip-pip i napipa se caskom sve.
Te oznake pisu kako stignu, gubis vreme trazeci DS bar za te "anonimne" proizvodjace. Ovako caskom nadjes i 100% si siguran sta je gde i da je ispravan ako prodjes sve elemente.
Reply
Trebao bi biti ovaj, ili što kaže @mikikg, polako i pješke sa instrumentom.
https://linhkienbandan.com/shop/led-7-th...0-36-inch/
Reply
edit ...
Reply
Ok..hvala za racunanje otpornika koliko sam vidio iz gornjeg linka:

Ucc = 5V (sa pina MCU)
Uled = 2.2V
Iled = 20mA (25mA kaze da je max struja)
-----------------------------------------------------
R = (Ucc - Uled) / Iled = (5V - 2.2V) / 20mA = 140R (dakle stavio bih 150R posto taj je lakse naci u prodavaonici elektronicke opreme)

Struja bi dakle bila sa 150R otpornikom 18,66mA..pa me zanima zastu su naveli da je za normalnu upotrebu na 5V Ucc korisiti 220R otpornike da bude struja kroz ledice cca 13mA?

Normalni LED koje sam dosad upotrebljavau u raznim sklopovima sam postavljao struju na 10mA i to je bilo to...sad posto ce se paliti svaki segment posebno citao sam po raznim projektima za arduino da je struja onda 1/3 cycla pa mora da se ide na vecu vrijednost struje kako bi se brojke vidjele jasno..pa mi to nije bas jasno sto i kako treba...prvi put se susrecem sa ovim 7segmentnim displayem..pa ako moze malo objasnjenja.

Zahvaljujem.
Reply
Postavio sam SPI: (PORTB.3 CS, PORTB.4 SO, PORTB.5 SCK)

; DDRB - Segment Multiplexing Output (0, 1, 2) | MAX6675 CS(MOSI), SCK(SCK) Output, SO(MISO) Input (3 5 4)

ldi R16, (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<5)
out DDRB, R16

; Spi Init - ReadTemperature

ldi R16, (1<<SPE)|(1<<MSTR)|(1<<SPR0) ; Spi Master, Prescaler fck/16
out SPCR, R16

I glavni program koji se vrti u loop i cita temperaturu:

Loop:

   ; Read MAX6675 ThermoCouple Temperature
   cbi PORTB,3 ; CS Low
   out SPDR, R20 ; Start Reading Data
Read_Temp:
   in R20, SPSR ; Read Data
   sbrs R20, SPIF
   rjmp Read_Temp
rjmp Loop


Dakle prema datasheetu:

https://datasheets.maximintegrated.com/e...AX6675.pdf

kako da ocitam iz SO outputa (SPIF registar mi ima tu vrijednost) tih 12-bita temperature i thermocouple input vrijednost? Citao sam da trebam bit shifting left raditi pa mi nije to bas jasno....
Reply
Evo mene posle krace pauze. Vratio se sa duzeg puta, pa da se aktiviram ponovo. Sto se SPI-a tice, moras prvo da vidis koje SPI modove rada podrzava MAX6675 i da u svojoj SPI inicijalizaciji postavis odgovarajuci mod rada.
MAX ti vraca dva bajta. To znaci da moras da posaljes 16 taktova ka njemu. Prvo posaljes 8 tako sto upises bilo sta u SPDR regitar. Upisom u njega, krece siftovanje podatka ka napolje i paralelno sa tim izlazom, MAX krece da salje visi bajt. Bajt si primio kada se SPIF podigne na 1. To znaci da moras prvo njega da ispitujes da vidis da li je 1 i ako jeste, onda procitas SPDR. Ovo ce ujedno da ti resetuje i SPIF flag. Ovako si procitao jedan bajt. Sada ponovis istu proceduru za drugi bajt, tj. posaljes neki bezveze podatak, i cekas SPIF. Tada imas dva bajta. Ostalo je jos da ih siftujes u desno za tri mesta. Vodi racuna da ti MAX ne daje temperaturu na izlazu, vec napon koji moras pomocu matematike da prevedes u temperaturu. Ovo uraditi u ASM-u nije ni malo jednostavno, dok je u C-u jedna linija koda. Zahteva implementaciju floating point matematike.
Reply
(04-09-2018, 02:13 PM)ronovar Wrote: Ok..hvala za racunanje otpornika koliko sam vidio iz gornjeg linka:

Ucc  = 5V (sa pina MCU)
Uled = 2.2V
Iled  = 20mA (25mA kaze da je max struja)
-----------------------------------------------------
R = (Ucc - Uled) / Iled = (5V - 2.2V) / 20mA = 140R (dakle stavio bih 150R posto taj je lakse naci u prodavaonici elektronicke opreme)

Struja bi dakle bila sa 150R otpornikom 18,66mA..pa me zanima zastu su naveli da je za normalnu upotrebu na 5V Ucc korisiti 220R otpornike da bude struja kroz ledice cca 13mA?

Normalni LED koje sam dosad upotrebljavau u raznim sklopovima sam postavljao struju na 10mA i to je bilo to...sad posto ce se paliti svaki segment posebno citao sam po raznim projektima za arduino da je struja onda 1/3 cycla pa mora da se ide na vecu vrijednost struje kako bi se brojke vidjele jasno..pa mi to nije bas jasno sto i kako treba...prvi put se susrecem sa ovim 7segmentnim displayem..pa ako moze malo objasnjenja.

Zahvaljujem.

Razlika izmedju LED i 7-seg. LED displeja ne postoji. Sve je to LED, pri cemu kod displeja imas 8 LED dioda (7 segmenata + tacku ako koristis). Jacina struje koja prolazi kroz LED govori o jacini osvetljaja same LED. Sto je struja veca, veci je osvetljaj, sto je struja manja, manji je osvetljaj, pri cemu ova skala nije linearna, vec logaritamska. posto ljudsko oko (vizuelni korteks) tako percipira promenu jacine svetlosti.
Kada je LED u tzv. direktnom rezimu rada, onda je stvar jasna. Struja koja prolazi kroz nju definise jacinu osvetljaja. Ako npr. kazemo da za zadovoljavajuci osvetljaj treba da propustimo 5mA kroz led, onda vrednost otpornika za ogranicenje struje prema tvojim podacima treba da bude:560R. Ako istu tu LED sada pokrecemo impulsno, frekvencijom od 100Hz i istom vrednoscu otpornika, ta LED ce slabije svetli - oko 50%. To je zbog toga jer je sada LED ukljucena 5ms i iskljucena 5ms. Srednja vrednost struje kroz LED iznosi:
Isr = Ton * Iled * f
Ton - vreme trajanja ukljucene LED - 5ms
Iled - struja kroz led u ukljucenom stanju - 5mA
f - frekvencija ukljucivanja/iskljucivanja LED - 100Hz

Ispada da je srednja struja kroz LED 2,5mA, sto znaci da ce slabije da svetli. Ako zelis istu jacinu osvetljaja i u mux rezimu rada, onda moras da podignes struju kroz LED. U ovom slucaju to je 2 puta, tj. Iled mora da bude 10mA umesto 5mA, sto znaci da vrednost otpornika mora da se prepolovi.
Struju podizes onoliko puta koliko imas cifara u MUX rezimu rada, tj. ako imas 4 cifre, onda je podizes 4 puta struju kroz led 4 puta. Moras takodje da vodis racuna i o MAX vrednostima parametara struje, tj: max average forward current - maximalna srednja vrednost struje - u ovom primeru sa dve led je 5mA i ta vrednost ne sme da predje MAX vrednost definisanu od strane proizvodjaca za izabranu LED. Drugi parametar je peak forward current - impulsna struja. U mux rezimu rada ne smes da predjes ovu vrednost. U nasem primeru ona iznosi 10mA, i ta vrdnpost mora da bude manja od one deklarisane u PDF-u.
Reply
Ok idemo onda redom...dakle prvo treba da postavim na MCU ulazni i izlazne pinove sto sam uradio pomocu ove naredbe:

              ; DDRB - Segment Multiplexing Output (0, 1, 2) | MAX6675 CS(MOSI), SCK(SCK) Output, SO(MISO) Input (3 5 4)

              ldi R16, (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<5)
              out DDRB, R16

Dakle MAX6675 je spojeni na MCU: CS => MOSI, SCK => SCK podeseni kao output i SO => MISO kao ulazni port.

Zatim trebam da omogucim SPI na MCU:

             ; Spi Init - Enable SPI On MCU

             ldi R16, (1<<SPE)|(1<<MSTR)|(1<<SPR0) ; Spi Master, Prescaler fck/16
             out SPCR, R16

Zatim u Loop Glavnom programu postavljam CS LOW (jer tako se enabla MAX da pocinje da prima clockove):

            cbi PORTB,3 ; CS Low

I onda upisujem u registar SPDR 0x08 (to ce mi biti dummy byte) i onda posaljem to na SPDR sljedecim kodom:

            ldi R20, 0x08 ; Dummy Byte
            out SPDR, R20 ; Send Dummy Byte


I nakon toga citam vrijednost iz SPSR registra i provjeravam dali mi je flag SPIF postavljen na 1 ukoliko je u registru R20 mi se nalazi vrijednost koju sam precitao preko SPI, i nakon toga opet se vraca na funkciju Read_Temp i tako u loop...

           Read_Temp:

                 in R20, SPSR ; Read Data
                 sbrs R20, SPIF
                 rjmp Read_Temp

Znaci po ovim upustvima treba da poslije sbrs R20, SPIF stavim pomocnog brojaca koji ce da mi izbroji da se 8 puta izvrtjela petlja i nakon toga ucitam iz SPIF registra u LOW i HIGH X  registar i dalje ide matematika za racunanje napona u temperaturu jeli tako treba da bude?

Na ovoj stranici procitani SPI je samo autor pomnozio sa rezolucijom temperature i dobio temperaturu tj SPI data x 0,25C

gist.github.com/sleemanj/059fce7f1b8087edfe7d7ef845a5d881
Reply
Nije ti dobro. Kada konfigurises SPI, onda ukljucujes hardverski SPI modul. To znaci da MOSI mora da bude definisan kao izlazni, MISO, kao ulazni i SCK kao izlazni. Ovo su tri osnovna pina za shift registre. Potreban ti je jos CS pin. To znaci da moras jos jedan pin da konfigurises kao izlazni. Npr uzmes SS i definises ga da bude izlazni. Posle inicijalizacije, ovaj pin odmah podignes na "1".
Povezivanje je sledece:
MOSI MCU - nigde se ne povezuje
MISO MCU - SO MAX
SCK MCU - SCK MAX
SS MCU - CS MAX

Sto se konverije tice, ne znam sta je autor radio. Pogledaj PDF za MAX. Termo par na svom izlazu da je napon koji je proporcionalan razlici temperature izmedju vruceg i hladnog kraja. Tebe interesuje kolika je temperatura vruceg kraja. MAX bi trebao da ima i kompenzaciju hladnog kraja. Ovo moras da pogledas u PDF-u.
Inace i po tom autoru sto si naveo, kako mislis da u ASM-u pomnozis neku celobrojnu vrednost sa 0,25?
Reply
Spojio sam prema preporuci...i ovo je kod koji sam sada napisao da cita MSB i LSB sa MAX-a pa ako moze se bacit pogled jeli ok..posto mislim da moze biti kraci:

      ; *****      readThermoCouple     *****
      readThermoCouple:
                cbi PORTB,3 ; Enable CS Low
                ldi R20, 0x00 ; Dummy Byte
                out SPDR, R20 ; Send Dummy Byte

          Read_Temp_MSB:
                in R20, SPSR ; Read Data
                sbrs R20, SPIF ; Wait Unti Read Data
                ldi XH, HIGH(SPDR) ; Read Msb From MAX6675
                rcall Read_Temp_LSB
                rjmp Read_Temp_MSB

          Read_Temp_LSB:
                in R20, SPSR ; Read Data
                sbrs R20, SPIF ; Wait Unti Read Data
                ldi XL, LOW(SPDR) ; Read Lsb From MAX6675
                sbi PORTB,3 ; Disable CS High
                ret
                rjmp Read_Temp_LSB
      ret

Jeli ovako moze da cita MSB i LSB sa MAX-a? Gledam u proteusu da simuliram ali bezuspjesno...mora negdje da ima kakav datalogger...a za Floatipoint ALU u ASM cu kasnije da procavam kako se radi sad mi je cilj da ocitam MSB i LSB da mogu onda da radim shifting...

Dakle ako sam dobro razumio protokol SPI sa MAX treba da ide:

- CS postaviti na LOW
- poslati 0x00 byte na MAX
- procitati HIGH (MSB) Byte kada je SPIF 1
- poslati 0x00 byte na MAX
- procitati LOW (LSB) Byte kada je SPIF 1

sve to spremam u XH i XL registar sa kojima cu kad ovo proradi raditi shifting da se dobije 12 bita...
Reply
.DSEG
MAX6675_Result: .BYTE 4
SPI_Dummy: .BYTE 1

; ***** readThermoCouple *****
readThermoCouple:
cbi PORTB,3 ; Enable CS Low
ldi SPI_Dummy, 0x00 ; Dummy Byte
out SPDR, SPI_Dummy; Send Dummy Byte
Read_Temp_MSB:
in R20, SPSR ; Read Data
sbrs R20, SPIF ; Wait Unti Read Data
rjmp Read_Temp_MSB
ldi HIGH(MAX6675_Result), SPDR ; Read Msb From MAX6675

out SPDR, SPI_Dummy; Send Dummy Byte
Read_Temp_LSB:
in R20, SPSR ; Read Data
sbrs R20, SPIF ; Wait Unti Read Data
rjmp Read_Temp_LSB
ldi LOW(MAX6675_Result), SPDR ; Read Lsb From MAX6675
sbi PORTB,3 ; Disable CS High
ret

Ovako nekako bi trebalo da se napise
Reply
Imaš u Proteusu gotov primer za MAX6675 sa PIC-om. Iskoristi njega samo ubaci tvoj atmel.
Reply
Zapeo sam sa ovim kodom koji mi nije bas jasan...dakle u:

.DSEG
MAX6675: .Byte 4

je definirana MAX6675 promjenjiva varijabla velicine 4 byta (2 byte za MSB i 2 byta za LSB) i to se cuva u SRAM-u.

nemogu da skopiram vrijednost ocitanog SPDR registra u tu promjenjivu varijablu MAX6675...jer ldi normalno trazi kopiranje iz SPDR registra u jedan od registra R16-R31, jedino ako bih isao upisom u SRAM i onda u glavnoj petlji citao iz SRAM-a i ucitanu vrijednost upisao u registar R16...ali je problem sto mi registar R16 neda matematicke operacije pomocu kojih radim extracting 1 2 i 3 znamenke...inace alu u asm je jakoo mocan...nisam ocekivao da se u jednoj naredbi mogu staviti vise matematickih operacija...

npr kako extractati prvi broj:

ldi R16, HIGH(MAX6675%1000/100)

dakle % je modulos operator a / dijeli sa 100 kako bi se dobio decimalni broj..posto u registar ide samo cijeli broj sve iza zareza se ignorira i u registar ide samo prije zareza npr rezultat je 2.16 u registru R16 ce da bude vrijednost 2. I to radi odlicno.

Problem je sto sa ovim kodom nemogu da pohranih MSB i LSB u gore definiranu promjenjivu varijablu MAX6675:

ldi MAX6675, HIGH(SPDR)
ldi MAX6675, LOW(SPDR)

taj kod koji sadrzaj serijskog data registra koji je procitan preko SPI protokola sa MAX6675 neda mi da ga kopiram u MAX6675....jer bih ga htio da ga kopiram u tu promjenjivu varijablu da bi ga kod dekodiranja segmentne brojke samo pozvao kao u gore navedenoj formuli i prikazao..i tako u loop...inace kupio sam odlican AVR SImulator IDE...ima assembler i basic....assembleru tu radim ali mi se jakoo svidja simulator..moze da se vide svi registri vrijednosti step by step instrukcije...i kosta samo 29€ sto nije puno a dobi se jakoo mocan alat.Uz njega je programiranje puno lakse.


Evo ako moze malo pomoci oko ovog gore..da to sa kodom sibam u SRAM pa da citam iz SRAMA kod dekodiranja segmentnih brojki ili kako da to pohranim a da mogu raditi ALU sa time dakle mislim na promjenjivu MAX6675 definiranu u .DSEG
Reply
Ovo nije dobro: HIGH(SPDR) i LOW(SPDR)
SPDR je dužine jednog bajta pa HIGH(SPDR) i LOW(SPDR) ne znače ništa.

Pročitaj SPDR prvi put i to smesti u neki registar (probaj MOV naredbom). Sledeći put sadržaj SPDR smesti u drugi registar. Nakon toga imaš u ta dva registra HIGH i LOW podatak iz MAX pa sa njima možeš raditi šta god.

"inace kupio sam odlican AVR SImulator IDE...ima assembler i basic....assembleru tu radim ali mi se jakoo svidja simulator..moze da se vide svi registri vrijednosti step by step instrukcije...i kosta samo 29€ sto nije puno a dobi se jakoo mocan alat.Uz njega je programiranje puno lakse."

Čekaj, zar Atmel Studio nema takav simulator? Treba da ima, istina ja ga ne koristim više od 10 godina...
Reply
Ronovar,

u kodu koji sam postavio imao sam nekoliko gresaka, pogotovo oko upisa u definisane memorijske lokacije i citanja sa njih. Ja sam radio prema PIC MCU-ovima, a nisam obracao paznju na AVR arhitekturu.
Evo ispravke programa:

Code:
.DSEG  MAX6675_Result: .BYTE 2
.CSEG

readThermoCouple:
    cbi        PORTB, 3                    ; Select MAX
    ldi        R16, 0x00    
    out        SPDR, R16                    ; Send Dummy Byte
Read_Temp_MSB:
    in        R17, SPSR                    ; Read Data
    sbrs    R17, SPIF                    ; Wait Until Read Data
    rjmp    Read_Temp_MSB
    ldi        R17, SPDR
    out        HIGH(MAX6675_Result), R17    ; Read Msb From MAX6675
                
    out        SPDR, R16                    ; Send Dummy Byte
Read_Temp_LSB:
    in        R17, SPSR                    ; Read Data
    sbrs    R17, SPIF                    ; Wait Until Read Data
    rjmp    Read_Temp_LSB
    ldi        R17, SPDR
    out        LOW(MAX6675_Result), R17    ; Read LSB From MAX6675
    
    sbi        PORTB, 3                    ; Deselect CS

    ret
Reply
Inace, sto se tice kupovine AVR simulatora, nisi trebao. Kao sto je gorankg rekao, sve to imas u Atmel Studio-u.
Reply
Sad mi je jasnije..nisam ni znao a i po datasheetu nisam nigdje nasao kako se upisuje u MAX6675_Result memorijsku lokaciju...preko out...sada mi je to jasnije..i zanimljivo rjesenje.

Stavio shifting u desno za tri mjesta samo za Read_Temp_LSB ovako:

lsr R17 ; Shift Right three place
lsr R17
lsr R17
out Low(MAX6675), R17 ; Read Lsb From MAX6675

posto neznam kako rjesiti u jednoj liniji isao sam sa lsr a ovako i pise na microchipu:

https://www.microchip.com/webdoc/avrasse...b_LSR.html

Pokrenem simulaciju (mada znam da trebam jos to pomnoziti sa 0,25 da vidim temperaturu ako se tako radi mada to cu da vidim jos mislim da nije tako jednostavno)...i u proteusu mi javlja ovu gresku:

Invalid opcode 0xFFFF at PC=0x001A

Sto bi moglo da bude? Evo i koda:


.rar   Projects.rar (Size: 1,69 KB / Downloads: 2)
Reply
Program ti nema greske kada se iskompajlira preko Atmel Studio-a. Inace, program ti nije dobar. Ne mozes da koristis rotiranje kao sto si napisao. Ti siftujes samo donji bajt tri puta. Sta je sa gornjim bajtom. Poenta je da podatke iz gornjeg bajta prebacis u donji. Za te stvati moras da koristis C flag i rotiranje kroz C flag. ROR i ROL instrukcije su za te stvari. Vodi racuna da na 8-bitnom MCU-u radis sa 16-bitnim podatkom!!! Vec vidis kako se polako stvari komplikuju.
Reply
Sad sam se malo pogubio....kako prebaciti iz MSB u LSB i ovo sa ROR i ROL...ako moze primjer koda pa da onda proucim...u proteusu ima digitalni analizator pa cu moci preko njega rucno ici kod po kod i shifting da vidim kako radi..posto mi je to nepoznanica...

Sto se tice nakon shiftovanja samo rezultat ocitane temperature binarno pretvoriti u decimalno i podjeliti sa 4...to je lako u asm netreba decimalno djelenje jer je rezolucija 0,25C a (1/0,25 = 4)...jedan clan na forumu stavio temperaturu 111C a dobio ocitanje nakon shiftinga 432 decimalno kad to podjeli sa 4 dobija 108 a postavio je 111...posto je MAX ima -/+3C to je onda ta racunica...dakle shifting trebam da proucim i podjelim sa 4 i evo temperature...
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)