www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Prvi koraki z LPC1343 & Keil - povzetek predavanj
Pojdi na stran Prejšnja  1, 2
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
S53DZ
Član
Član



Pridružen-a: Čet 28 Apr 2011 9:27
Prispevkov: 951
Aktiv.: 6.05
Kraj: Ljubljana

PrispevekObjavljeno: Pon Jul 23, 2012 11:36 pm    Naslov sporočila:   Odgovori s citatom

Predlagam, da se prispevki Highlag-a strnejo v temo tipa Wiki. Tako bo ostala kot pripomoček in bo lahko po potrebi dopolnjevana in/ali izpopolnjevana.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 18.16
Kraj: Črnuče

PrispevekObjavljeno: Sre Jul 25, 2012 6:37 pm    Naslov sporočila:   Odgovori s citatom

Del 6 Ura

Procesor ima na tiskanem vezju prispajkan 12MHz kvarčni kristal, vendar to ne pomeni da deluje na 12MHz. Procesor ima vgrajen zmogljiv tokovno krmiljen PLL oscilator, ki ga je potrebno ustrezno nastaviti. Vhodno frekvenco je potrebno v PLL oscilatorju dvigniti na 156-320MHz in nato zmanjšati na želeno vrednost.

Nastavitve za izbiro frekvence delovanja procesorja se nahajajo v datoteki system_LPC13xx.c.

Za sistemsko uro je nastavljeno naslednje:
Koda:
#define SYSOSCCTRL_Val        0x00000001
#define SYSPLLCTRL_Val        0x00000025
#define SYSPLLCLKSEL_Val      0x00000001
#define MAINCLKSEL_Val        0x00000003
#define SYSAHBCLKDIV_Val      0x00000001


Čemu služijo navedeni ukazi?
Vse možnosti posameznih registrov so opisane na straneh 14-31 datoteke UM10375.pdf
SYSOSCCTRL 0b0000 0000 sistemski oscilator ni izpuščen
SYSPLLCTRL 0b0010 0101 MSEL = 5, P=2
SYSPLLCLKSEL 0b0000 0001 vir PLL je sistemski oscilator
MAINCLKSEL 0b0000 0011 vir glavne sistemske ure je PLL izhod
SYSAHBCLKDIV 0b0000 0001 glavna sistemska ura je deljena z 1 da dobimo sistemsko uro
Ukazi dobijo smisel, če pogledamo shemo zgradbe procesorja na na strani 14 datoteke UM10375.pdf. Nekaj več detajlov prvih dveh likov SYSPLLCLKSEL in SYS PLL sta prikazana na sliki na strani 49.

V našem primeru je pa ukaz SYSPLLCTRL 0b0010 0101 ( MSEL = 5, P=2) ki določa frekvenco in ga je potrebno malce podrobneje pogledati.
Vsebuje dva faktorja vrednosti za dva faktorja M in P, ki se uporabljata za ustrezno nastavitev PLL oscilatorja.
Faktor M deli izhodno frekvenco PLL za vrednost MSEL+1 v povratni zanki PLL oscilatorja
Faktor P pa deli frekvenco PLL z vrednostjo PSEL*2, da dobimo izhodno frekvenco FCLKOUT.

Faktorja morata biti takšna, da ustrezata enačbam:
M=FCLKOUT/FCLKIN FCLKIN = vhodna frekvenca PLL – v našem primeru 12MHz
FCCO=2xPxFCLKOUT FCCO = frekvenca PLL, ki mora biti v mejah 156 do 320MHz za stabilno delovanje PLL

V našem primeru so vrednosti MSEL=5 -> M=(MSEL+1)=6, ter PSEL=2 ->P=(PSEL*2)=4

Če malo premečemo enačbe dobimo:
FLCKOUT=12MHz*6 = 72MHz
FCCO=2*2*72MHz=288MHz , kar je <320 in >156MHz

Iz tega sledi, da naš CPU deluje na 72MHz.

Podobna kolobocija je potrebna za izračun frekvence USB pogona, pri čemer je potrebno nastaviti frekvenco 48MHz, ki jo zahteva USB standard. Zato sta faktorja M in P drugačna. (M=4 in P=2)

_________________
If at first you don't succeed, destroy all evidence that you tried.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 18.16
Kraj: Črnuče

PrispevekObjavljeno: Pon Jul 30, 2012 8:50 pm    Naslov sporočila:   Odgovori s citatom

Del 7 Časovnik SYSTICK
Naš procesor ima vgrajen poseben časovnik SYSTICK, ki je namenjen predvsem za uporabo RTOS, kot vir prekinitev, ki si sledijo v natančno določenem časovnem vrstnem redu. Kot standardna enota je predlagana 10ms, seveda pa lahko nastavimo relativno poljubno vrednost.
SYSTICK časovnik je 24 bitni in ob preteku vrednosti proži namensko prekinitev.
Tule ga bomo pa uporabili za izdelavo časovnika za zakasnitve v programski kodi.
(Uporabno za programski debounce, utripanje in en kup drugih funkcij)

Za uspešno uporabo SYSTICK časovnika je včasih potrebno nastaviti nekaj vrednosti registrov:
SYSTICKCLKDIV – register za vpis delilnika za uro na katero je priključen.
Če je vrednost 0 je časovnik izključen. Vpisana vrednost 255 deli vhodno uro z 255.
Koda:
LPC_SYSCON->SYSTICKCLKDIV = 0x00000001  // delilnik z 1

(glej stran 28 datoteke UM10375.pdf)

Ker je SYSTICK mišljen kot zelo natančna ura, imamo na voljo register s katerim lahko natančnost ure popravimo z vpisom kalibracijske vrednosti v register SYST_CALIB
(glej stran 33 datoteke UM10375.pdf)

Kako pa zadeva deluje?
V register LOAD SYSTICK registra vpišemo vrednost. Časovnik ob vklopu procesorja šteje (glede na delilnik) do vrednosti vpisane v LOAD register, ko pride do vpisane vrednosti sproži prekinitev.

Kako pa pridemo do želene vrednosti?
Če hočemo zakasnitev 10ms.
V našem primeru deluje procesor na 72MHz
Torej pomnožimo 72000000 (72MHz) x 0,01 (10ms) = 720000.
Ker šteje od 0 in ne od 1 od dobljene vrednosti odštejemo še 1 torej 720000-1=719999, kar je enako 0x000AFC7F
Koda:
SysTick->LOAD = 0x000AFC7F;       // Reload vrednost za 10ms pri 72MHz in delilniku 1.

Pred uporabo časovnika ga je potrebno ustrezno nastaviti z vpisom vrednosti v CTRL register.
Omogočiti moramo SYSTICK z vpisom 1 v bit 0, omogočiti moramo interupt z vpisom 1 v bit 1, ter izbrati vir ure za register SYSTICK z vpisom vrednosti v bit 3. Če v bit 3 višemo 0 bo časovnik vzel uro preko delilnika ure (LPC_SYSCON->SYSTICKCLKDIV), v nasprotnem primeru pa bo uporabljena kar ura jedra.
Koda:
SysTick->CTRL = 0x00000007;        // Enable systick, Enable tickint, clksource=core

(glej strani 295-299 datoteke UM10375.pdf)

Kaj pa prekinitev?
Ime funkcije prekinitve je definira v datoteki Startup_LPC13xx.s. Kličemo jo pa takole:
Koda:
void SysTick_Handler(void) {
// tule naredimo nekaj;
}


Void kaj?
Void je definicija praznega tipa podatka. Torej naša funkcija prekinitve ne vrne, niti prejme nobene spremenljivke.

Kako potem zgleda programček?
Koda:
#include <stdio.h>
#include "LPC13xx.h"                    // LPC13xx definitions

#define LED2 (1<<8)                     // P0.8 LED2
#define LED3 (1<<9)                     // P0.9 LED3

unsigned int systick_stevec;            // števec tikov

void SysTick_Handler (void){            // prekinitvena rutina za SysTick register
  systick_stevec++;                     // ko pride do prekinitve se poveča števec
}

void setup_SysTick(void){
//  SysTick->LOAD = 0x000AFC7F;         // Reload vrednost za 10ms pri 72MHz in delilniku 1.
  SysTick->LOAD = 0x0001193F;           // Reload vrednost za 1ms pri 72MHz in delilniku 1.
  SysTick->CTRL = 0x00000007;           // Omogoči systick, Omogoči tickint, clksource=core
}

void Delay_ms (unsigned int cas_ms) {
unsigned int stevilo_systikov;
stevilo_systikov = systick_stevec;
while (( systick_stevec - stevilo_systikov) < cas_ms);  // V zanki dokler ne prešteje do cas_ms
}

int main (void) {                       // Main Program   
setup_SysTick();
LPC_GPIO0->DIR |= LED2 | LED3;          // |= (ALI) Vpišemo 1 v 8 bit registra DIR (LED=P0.8) 
                                        // Nastavitev smeri PortaP0(GPIO0) P0=izhod      
 
while (1) {                             // Loop forever
    LPC_GPIO0->DATA |= LED2;            // |= (OR) Vpiše 1 v 8 bit registra DATA GPIO0.8 ugasne LED2
    Delay_ms (100);                     // Pove ime funkcije
    LPC_GPIO0->DATA &= ~LED2;           // vpiše 0 v 8  bit  registra DATA GPIO0.8 prizge LED2
    Delay_ms (100);
   }
}


Na začetku definiramo spremenljivko systick_stevec, ki je 32 bitna pozitivna številka.
Sledi definicija funkcije prekinitve void SysTick_Handler (void) Funkcija se izvede ko SYSTICK časovnik prišteje do vpisane vrednosti v LOAD register. Prekinitvene funkcije morajo biti kratke, da lahko predelajo vpisane naloge pred proženjem naslednje prekinitve.

Naslednja funkcija je namenjena konfiguraciji SYSTICK časovnika. Najprej sem imel v register LOAD vpisano vrednost za zamik 10ms, ki sem jo kasneje spremenil na 1ms po zgoraj opisanem postopku. Zakaj? Zaradi naslednje funkcije.

Delay_ms funkcija opravlja nalogo zakasnitve. Sprejme en parameter in to je cas_ms – to pa je število ms, ki jih hočemo za zakasnitev. Ker je en SYSTICK dolg 1ms, je štetje ms enostavno.
Številka, ki jo vpišemo med klicem funkcije je število ms.
Znotraj funkcije je definirana ena spremenljivka stevilo_systikov , ki je začasna spremenljivka za hranjenje vrednosti stanja spremenljivke systick_stevec Sledi zanka, ki na zelo inteligenten način reši problem brisanja spremenljivke systick_stevec. Ko pokličemo funkcijo Delay_ms praktično ne vemo stanje spremenljivke systick_stevec , saj se spremenljivka povečuje vsako ms. Zato stanje spremenljivke systick_stevec shranimo v spremenljivko stevilo_systikov .
Z zanko WHILE potem primerjamo razliko vrednosti spremenljivk z številko ms.
Zanka vztraja dokler je razlika manjša od številke ms. Kaj pa povečuje vrednosti? Spremenljivka systick_stevec se vsako ms poveča za 1. Razlika med obema spremenljivkama je tako vedno od 1 do želenih ms. Lahko začnemo z vrednostjo systick_stevec-a 400 ali 2003044.
Tako se z vsako prekinitvijo razlika povečuje. Ko je razlika dovolj velika se izvajanje funkcije prekine.

Programček s tem omogoča, da LED 2 utripa. 100ms je prižgana 100ms pa ugasnjena.



systick.zip
 Opis:

Download
 Ime datoteke:  systick.zip
 Velikost datoteke:  240.39 KB
 Downloadano:  6 krat


_________________
If at first you don't succeed, destroy all evidence that you tried.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 18.16
Kraj: Črnuče

PrispevekObjavljeno: Pon Jul 30, 2012 9:07 pm    Naslov sporočila:   Odgovori s citatom

Glede na to, da moje programersko znanje ni zadovoljivo, program običajno nalagam na procesor precejkrat. Zato sem si spisal eno skripto, ki mi omogoča hitro nalaganje programa na procesor.

V generalni mapi, kjer imam shranjene mape posameznih projekte sem naredil eno podmapo z imenom Batch, notri pa sem skril datoteko z imenom LPC.bat.

Vsebina datoteke LPC.bat zgleda takole:
Koda:
h:
del firmware.bin
copy C:\Users\uporabnik\Documents\Projekti\Elektronika\Keil\Tecaj_1\Pwm_3\Flash\blinky.bin h:
pause


h: -> je črka pod katero se razvojna ploščica prijavi na računalnik, ukaz zamenja trenutno delavno mapo z h:
del firmware.bin -> zbriše datoteko firmware.bin s pogona h:
copy C:\Users\uporabnik\Documents\Projekti\Elektronika\Keil\Tecaj_1\Pwm_3\Flash\blinky.bin h: -> ukaz prekopira datoteko blinky.bin na disk h: seveda je to pot treba popraviti na lokacijo in datoteko trenutno aktualnega projekta.

Za konec si pripravim bljižnico na to skripto, tako da imam hitro dostopno.



Tako samo pripravim procesor na programiranje - tipki int + reset in kliknem na bljižnico. Seveda morajo okna prej pokazati okno za nov disk.

Datoteko lahko naredite s pomočjo programčka Notepad (ali poljubnega drugega urejevalnika teksta) in jo pod poljubnim imenom shranite s končnico bat.

_________________
If at first you don't succeed, destroy all evidence that you tried.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
boco
Član
Član



Pridružen-a: Čet 31 Jul 2003 9:42
Prispevkov: 919
Aktiv.: 4.14
Kraj: Ptuj/Kranj/Ljubljana

PrispevekObjavljeno: Pon Jul 30, 2012 9:41 pm    Naslov sporočila:   Odgovori s citatom

Highlag ...... ti si malce ušel osnovam, ampak z zanimivostjo prebiram in preizkušam tvoje stvaritve. HVALA ker deliš to z nami.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 18.16
Kraj: Črnuče

PrispevekObjavljeno: Pon Jul 30, 2012 10:49 pm    Naslov sporočila:   Odgovori s citatom

Jah če hočeš kaj bolj konkretnega spisat so tole osnove.
Sicer tega še nismo vzeli ampak... Mr. Green

_________________
If at first you don't succeed, destroy all evidence that you tried.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
airwolf
Član
Član



Pridružen-a: Sre 28 Maj 2008 17:17
Prispevkov: 2053
Aktiv.: 10.65

PrispevekObjavljeno: Tor Jul 31, 2012 10:47 am    Naslov sporočila:   Odgovori s citatom

Super. Z delay-i sem se zezal do nezavesti in potem tole tukaj. Odlično. Applause
_________________
LP Gašper
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 18.16
Kraj: Črnuče

PrispevekObjavljeno: Tor Avg 07, 2012 12:17 am    Naslov sporočila:   Odgovori s citatom

Del 8 Priklop 4x20 LCD displeja.

Velikokrat pri naših projektih prav pride uporaba LCD displeja. Med drugim ga lahko uporabimo tudi za razhroščevanje naših projektov, saj lahko izpisuje vrednosti spremenljivk, do katerih drugače nebi imeli dostopa. (Če seveda nimamo kakšnega uLink vmesnika ali kaj podobnega)

Najprej je bilo potrebno izbrati priključke na katere bom priključil LCD. Za to potrebujemo najmanj 7 priključkov. Štiri rabimo za prenos podatkov (D7, D6, D5, D4), 3 pa za krmiljenje LCD-ja (R/W, E, RS.

Po nekaj tuhtanja sem se odločil za Port GPIO2, ker se mi je zdel najbolj prazen. Torej malo pinov ima več funkcij. Žal so priklopi na te pine raztreščeni po štirih priključnih letvicah. V prilogi so označeni kateri pini so to.

Izdelal sem en 10 polni ploščati kabel, ki ima na eni strani prispajkano letvico z rastrom 2.54mm, na drugi strani pa ustrezno žensko letvico. Uporabno, če pine ločimo, tako da jih je možno poljubno priključiti.

LCD sem preko ene takšne letvice pritrdil na prototipno ploščico, ustrezne pine povezal na razvojno ploščico. Za napajanje LCD-ja je potrebno 5V, kar sem dobil z univerzalnega usmernika, ostali priključki pa so povezani direktno na našo razvojno ploščico. Seveda sem povezal tudi ničli obeh vezij. LCD potrebuje za svoje delo tudi priklop potenciometra na V0 priključek, da lahko nastavimo kontrast. Sam sem uporabil kar en 10K potenciometer vezan med 0 in +5V, srednji odcep pa je vezan na V0 LCD. Ko prižgemo LCD se mora na displeju (v mojem primeru 2) prikazati črna črta čez celo vrstico. Če ni vidna je potrebno nastaviti kontrast. To je običajno za LCD, ki še ni inicializiran. Ko se LCD-ju pošlje nekaj ukazov ta črta zgine.

Detajlov kako deluje LCD ne bom pisal lahko pa si detaljni opis pogledate tule: Newbie hack

Na internetu se najde kar nekaj projektov, kjer je na voljo tudi C koda za poganjanje LCD displejev. Med njimi ni neke posebno velike razlike, razlikujejo se predvsem zato, ker so mišljene za uporabo na različnih platformah ali pa so mišljene za različne prevajalnike.

Sam sem zato začel pregledovati kodo, ki je na voljo kar poleg razvojnega okolja Keil. Žal za naš procesor ni bilo kode, ki bi jo bilo možno direktno uporabiti, sem pa našel kodo, ki je bila sicer namenjena za procesor LPC29xx

Da LCD uporabimo, je najprej v naš program vključiti lcd.h datoteko, nato pa že sledi inicializacija LCD displeja in uporaba po željah.
Za uporabo displeja so spisane funkcije, ki omogočajo različne naloge:
Koda:
LCD_init ();                 // inicializacija LCD
LCD_gotoxy ();               // skok kurzorja na lokacijo
LCD_cls ();                  // pobriše prikaz
LCD_cur_off ();              // izklop kurzorja
LCD_putc ();                 //  izpis znaka
LCD_print ();                // izpis niza znakov
LCD_bargraph ();             // risanje stolpca (horizontalno)


V opis delovanja posameznih funkcij se ne bom poglabljal bom pa opisal kaj sem spreminjal. Oziroma ob kaj sem se spotaknil.

Nastaviti je seveda potrebno na katere izhode procesorja bodo priključeni vhodi LCD displeja. Kako se to počne sem že napisal, zato samo koda:
Koda:
#define PIN_E                 (1      <<  6) // ...0100 0000
#define PIN_RW                (1      <<  5) // ...0010 0000
#define PIN_RS                (1      <<  4) // ...0001 0000
#define PINS_CTRL             (0x07   <<  4) // ...0111 0000
#define PINS_DATA             (0x0FUL <<  0) // ...0000 1111


Zanimiva je tale postavka:
Koda:
(0x0FUL <<  0)

Toje je številka Unsigned Long 0x0F

Tule je napisana koda, ki določa ali je na izhodu določenega pina 1 ali 0

Koda:
#define LCD_E(x)              ((x) ? (LPC_GPIO2->DATA |= PIN_E)  : (LPC_GPIO2->DATA &= ~PIN_E) ); delay(10);

Tole se bere takole:
Koda:
LCD_E je v primeru, da je x = 1  (LPC_GPIO2->DATA |= PIN_E) torej gre pin na 1
                          x = 0  (LPC_GPIO2->DATA &= ~PIN_E) torej gre pin na 0

Na koncu je ne glede na to kaj smo izbrali še dodan delay(10)

LCD_E(1) ali LCD_E(0) kličemo znotraj našega programa. Prevajalnik potem ta LCD_E(1) zamenja s kodo:
LPC_GPIO2->DATA |= PIN_E; delay(10);

LCD ima vgrajeno tabelo standardnih znakov. Nekateri bolj nekateri manj. (ASCII) Običajno pa imajo nekaj prostora tudi za namenske znake, ki jih lahko izdelamo sami in ob zagonu pošljemo na LCD. Ta jih hrani v svojem ramu. Če jih potrebujemo jih enostavno pokličemo. Temu služi tale kos kode, ki vsebuje informacijo o obliki znakov.
Koda:
const unsigned char UserFont[8][8] = {
  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // prazen
  { 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 }, // |
  { 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 }, // ||
  { 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C }, // |||
  { 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E }, // ||||
  { 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F }, // |||||
  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // prazen
  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }  // prazen
};


Nekatera razvojna orodja imajo že vgrajene pripomočke, kjer enostavno narišemo znak, pripomoček pa zgenerira zapis tega znaka. Sam uporabljam tudi razvojno orodje Mikroelektronike (sicer za PicBasic+), ki ima takšno orodje že na voljo. Zapis je zelo enostavno prevesti v obliko, ki je prikazana zgoraj. Važni so le podatki, ki pa so identični.

Težave sem imel s funkcijo, ki preračunava pozicijo na katero skušamo prikazati trenutni znak.
Koda:
void LCD_gotoxy (unsigned char x, unsigned char y) {
  unsigned char address;
//  address = (y * 40) + x;                           // originalna koda   
//  address = 0x80 + (address & 0x7F);                // originalna koda           
  address = (0x80 + LCD_frst_locations[y-1] + (x-1)); // lokacija pisanja
  lcd_write_cmd(address);                        // Set DDRAM address counter to 0
}

Verjetno je bil displej uporabljen za primer drugačenm saj so se znaki izpisovali narobe. Zakaj sem ugotovil potem, ko sem šel preračunat vrednost spremenljivke address za nekaj različnih lokacij.

Kljub temu, da mi vidimo LCD kot 4 vrstice po 20 znakov bi bile te lahko nanizane ena za drugo od 1 do 80 Vendar temu ni tako. Moj LCD ima prve znake v posameznih vrsticah na teh lokacijah: 0, 64, 20, 84 - potrebno preverit za displej, ki ga mislimo uporabiti. Zato sem dodal še eno spremenljivko LCD_first_locations ki je deklarirana takole:
Koda:
char LCD_frst_locations[4] = {0, 64, 20, 84};

Vsebuje naslove skrajno levih polj znakov posameznih vrstic.
Tako se vsebina vpisuje v pravo vrstico.
Ko kličemo funkcijo LCD_print (3, 2, "Besedilo"); je 3 vrstica, 2 kolona
Če to vstavimo v enačbo:
Koda:
address = (0x80 + LCD_frst_locations[3-1] + (2-1))
address = (0x80 + LCD_frst_locations[2]  + 1)


ker je LCD_frst_locations[2] = 20 je končna enačba
Koda:
address = (0x80 + 20  + 1) = 21
, kar je 2 mesto z leve v tretji vrstici displeja
(0x80 odmislimo - je potrebno za pravilno delovanje LCD 0b10000000=0x80= ukaz za pomik na prvo mesto na displeju 0,0)

Če ima naš displej manj vrstic, je potrebno število vrstic v LCD_frst_locations[4] = {0, 64, 20, 84} zmanjšati na 2 in ustrezno popraviti začetna polja.

Še nekaj. Pri uporabi LCD displejev je vedno imeti v mislih, da so displeji počasni. Potrebujejo nekaj časa, da izvedejo ukaze zato ni dovolj, da ukaz samo pošljemo displeju potrebno je nekaj časa počakati. Detajlni opisi so v priloženi datoteki za čip HD44780, ki je vgrajen (ali njegovi kloni) v večino majhnih displejev. Zato je v kodi en kup zakasnitev. Sicer so izvedene s štetjem, ko bo čas pa bom uporabil vgrajene časovnike.

Zahvalil bi se Umniku, ki je razsvetlil najtemnejše dele kode. Mr. Green

Programček zapisuje vrednosti od 1 do 20 v posamezne celice v vrstice po vrsti. Začne levo zgoraj konča desno spodaj. Ker za ničlo pri 20 ni prostora se le ta izpisuje drugje.



P1010753.JPG
 Opis:
Projekt med delovanjem
 Velikost datoteke:  1.82 MB
 Pogledana:  10 krat

P1010753.JPG



LCD.zip
 Opis:
LCD projekt za Keil

Download
 Ime datoteke:  LCD.zip
 Velikost datoteke:  333.15 KB
 Downloadano:  12 krat


HD44780.pdf
 Opis:
HD44780 datasheet

Download
 Ime datoteke:  HD44780.pdf
 Velikost datoteke:  393.97 KB
 Downloadano:  9 krat


Vezava.pdf
 Opis:

Download
 Ime datoteke:  Vezava.pdf
 Velikost datoteke:  48.97 KB
 Downloadano:  15 krat


_________________
If at first you don't succeed, destroy all evidence that you tried.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
boco
Član
Član



Pridružen-a: Čet 31 Jul 2003 9:42
Prispevkov: 919
Aktiv.: 4.14
Kraj: Ptuj/Kranj/Ljubljana

PrispevekObjavljeno: Tor Avg 07, 2012 10:27 am    Naslov sporočila:   Odgovori s citatom

Applause Applause Applause
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
airwolf
Član
Član



Pridružen-a: Sre 28 Maj 2008 17:17
Prispevkov: 2053
Aktiv.: 10.65

PrispevekObjavljeno: Tor Avg 07, 2012 1:13 pm    Naslov sporočila:   Odgovori s citatom

LCD mmm, nekdo nas pošteno razvaja.
Highland pri meni imaš pivo ali kaj drugega v dobrem.

_________________
LP Gašper
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 18.16
Kraj: Črnuče

PrispevekObjavljeno: Pon Sep 24, 2012 6:59 pm    Naslov sporočila:   Odgovori s citatom

Del 9: DS1820

Ob pomoči nekaterih članov foruma, ki jih ne bom imenoval (Umnik, Igo Wink ) sem usposobil nekaj preprostih funkcij, ki omogočajo uporabo DS1820 senzorja.
Za različico DS18S20 je potrebno kodo spremeniti.

Zaenkrat še ni tako pametna, da bi se sama prilagajala tipom senzorjev.
Primerna je za uporabo enega senzorja.
V prvo vrstico se izpiše naslov senzorja, ki je priključen.
Izpisano kodo je potrebno prepisati v DS1820.c, (obstoječo pa odstraniti)
Sicer se da vrednost scratchpada enega senzorja prebrati tudi brez naslova senzorja. To je prikazano v drugi vrstici, kjer se naslov senzorja ne uporabi.

Popravljal sem tudi kodo za systick, saj se je izkazalo, da ima hrošča. Ob dolgem delovanju se je - vsaj na mojem LCD-ju prikaz sesul. Očitno se je števec takrat obrnil. To pa je povzročilo napako v dolžini signalov, ki je po določenem času sesula prikaz na prikazovalnika

Tako za začetek bo dovolj.



P1010803a.jpg
 Opis:
 Velikost datoteke:  162.05 KB
 Pogledana:  57 krat

P1010803a.jpg



LCD_DS1820.zip
 Opis:

Download
 Ime datoteke:  LCD_DS1820.zip
 Velikost datoteke:  1.21 MB
 Downloadano:  14 krat


_________________
If at first you don't succeed, destroy all evidence that you tried.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
tiger
Član
Član



Pridružen-a: Čet 05 Feb 2004 0:22
Prispevkov: 1138
Aktiv.: 5.12
Kraj: Škofja Loka

PrispevekObjavljeno: Pet Feb 01, 2013 11:03 pm    Naslov sporočila:   Odgovori s citatom

Končno sem našel čas za ARM, pohvale za napotke.

LP.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
mahoney
Neznanec
Neznanec



Pridružen-a: Tor 25 Nov 2014 10:52
Prispevkov: 3
Aktiv.: 0.03
Kraj: gorenjska

PrispevekObjavljeno: Tor Nov 25, 2014 10:11 pm    Naslov sporočila:   Odgovori s citatom

Tudi iz moje strani pohvale avtorju teme Applause , ogromno uporabnega.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.17
Kraj: Ljubljana

PrispevekObjavljeno: Pon Dec 05, 2016 2:44 pm    Naslov sporočila:   Odgovori s citatom

Ponavadi ko delam z ARM mi branje mikrokrmilniške dokumentacije ne predstavlja problema z izjemo prekinitev. Vedno, ko naletim na prekinitve sem prisiljen tudi v branje mikroprocesorske dokumentacije, kjer se vedno prakticira ARM assembly in potem se mi ustavi, saj je na Linux razvojnem okolju zaradi uporabe interruptov potrebno spreminjati zagonsko kodo in linker skripto... Na srečo vsaj makefile ne potrebuje modifikacij...

Je super, če si dobro podkovan v teh stvareh, ker imaš resno veliko svobode ampak ni pa lahko no... Me zanima, kako bi se / se bo avtor teme spopadel z interrupti.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2
Stran 2 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group