 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
discovery Član

Pridružen-a: Sre 15 Mar 2006 10:59 Prispevkov: 12 Aktiv.: 0.05
|
Objavljeno: Pet Apr 28, 2006 3:47 pm Naslov sporočila: Ali kdo uporablja PICC v MPLABU? |
|
|
Pozdravljeni!
Zanima me ce kdo programira z c umestnikom v Mplabu? Sam delam samo z to varijanto, tako da asemblerja ne lih stekam-oz. se nisem niti poglabljal.
Ce kdo uporablja picc bi prosil ce mi lahko pomaga. Ce prav stekam ukaz
data = input_b();
Prebere 8 bitno vrednost na portu B. Zanima me ce ima kdo idejo kako bi prebral samo 7 bitov in bi 8. ostal za output? porta A in C imam prav tako zasedena. Uporabljam pa 16f876.
Kaj pa ce bi bral posamezne bite...Se pravi 7 spremenljivk in vsaka prebere svoj bit, kako bi jih lahko zlozil v byte?
Ze v naprej hvala! |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Pet Apr 28, 2006 3:54 pm Naslov sporočila: |
|
|
Uh ... kaze, da "ne stekas" niti osnov programiranja v C-ju, niti slovenscine ali forumskih pravil
Ce input_b() prebere osem bitov, potem bo input_b() & maska (kjer je maska 1 << stevilka bita) vrnil 7-bitno vrednost, en bit bo pa nic, ker njegova vsebina ne bo relevantna). Npr. ce je spodnjih 7 bitov vhod, osmi pa izhod, potem bi slo takole:
Koda: |
sedembitna_vrednost = input_b() & 0x80 |
Ce morajo biti vrednosti na vsak nacin stisnjene skupaj (torej ce recimo manjka 3. bit, potem bi bili v bitih 0-1 originalni vrednosti, v 2-6 pa vrednosti bitov 3-7 iz porta), potem je resitev podobna (z eno dodatno spremenljivko).
Da bi vrednost posameznega bita spravil v drugo spremenljivko, bi uporabil podobno metodo:
Koda: |
bitN = input_b() >> (N - 1) & 1 |
kjer je N recimo 1 (1. bit) do 8 (8. bit) oziroma brez - 1, ce je N stevilka bita (0-7).
Ne bo ti padla krona z glave, ce se potrudis najprej nauciti vsaj minimalne osnove, potem pa preides na konkretno aplikacijo. |
|
Nazaj na vrh |
|
 |
discovery Član

Pridružen-a: Sre 15 Mar 2006 10:59 Prispevkov: 12 Aktiv.: 0.05
|
Objavljeno: Pet Apr 28, 2006 4:03 pm Naslov sporočila: |
|
|
Hvala za odgovor in hvala za opozorila! |
|
Nazaj na vrh |
|
 |
snow Član


Pridružen-a: Tor 27 Dec 2005 14:02 Prispevkov: 341 Aktiv.: 1.44 Kraj: Ljubljana || Velenje
|
Objavljeno: Pet Apr 28, 2006 7:04 pm Naslov sporočila: |
|
|
Sokrat a ni za ohranitev spodnjih sedem bitov narediti AND z 0x7F (oziroma negiran 0x80)? |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Pet Apr 28, 2006 7:45 pm Naslov sporočila: |
|
|
Groza ... seveda je Tako mi je sel na jetra tisti "ne stekam", da sem se ukvarjal z vsem drugim, samo z zapisanim izrazom ne, in sem ustrelil kozla  |
|
Nazaj na vrh |
|
 |
discovery Član

Pridružen-a: Sre 15 Mar 2006 10:59 Prispevkov: 12 Aktiv.: 0.05
|
Objavljeno: Sre Maj 03, 2006 3:54 pm Naslov sporočila: |
|
|
Torej projekt, ki ga sedaj delam, je "branje" 7 segmentnega prikazovalnika voltmetra in ko stevke na le tem mirujejo, bi rad, da se mi prizge ledica. Zaenkrat bi rad bral stotice in desetice, kasneje pa se enice. Prvo sem bral vsak bit posebej in ga primerjal z zakasnitvijo z novim stanjem bita. Stvar mi je delovala. Zaradi nadalnjega razvoja programa pa zelim brati vseh 7 bitov v eni besedi.
Sedaj sem napisal tak program:
#if defined(__PCM__)
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#elif defined (__PCH__)
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#endif
void main() {
int vhod_b, vhod_c, old_vhod_b, old_vhod_c;
int i, j;
while (TRUE)
{
delay_ms (500);
set_tris_b(0x7F);
set_tris_c(0x7F);
vhod_b = input_b() & 0x7F;
vhod_c = input_c() & 0x7F;
if (vhod_b==old_vhod_b)
i=1;
else
i=0;
if (vhod_c==old_vhod_c)
j=1;
else
j=0;
if (i==1 && j==1)
output_high (PIN_B7);
else
output_low (PIN_B7);
old_vhod_b=vhod_b;
old_vhod_c=vhod_c;
}
}
Nekaj imam narobe z branjem, ker tudi ce poizkusim, da mi namesto setiranja in resetiranja i-ja in j-ja, direktno setira in resetira PIN_B7 in PIN_C7, mi ne deluje.
Ali moram za branje besede se kaj definirati, razen spremenljivke in kateri so vhodi?
Hvala in lep pozdrav. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Sre Maj 03, 2006 4:25 pm Naslov sporočila: |
|
|
Ce je delovalo prej (ko te je zanimal samo en bit), potem mora delovati tudi zdaj, saj v obeh primerih preberes stanje celega 8-bitnega porta, le da za en bit ignoriras preostalih 7, tukaj pa preveris vseh 7 in ignoriras le tistega, kamor ni prikljuceno nic v zvezi s tvojim displayem.
Najbolj ocitna napaka v tvojem programu je, da na zacetku (pred vstopom v zanko) ne zapises vrednosti old_vhod_b in old_vhod_c.
Ce imas samo eno LEDico, potem ne potrebnujes kar dveh spremenljivok (i in j). Pravzaprav je tudi za 8 (osem) LEDic cisto dovolj ena enobajtna spremenljivka, pa se ta je v bistvu povsem odvec, saj bi pogoj lahko sestavil skupaj v eno vrstico in prepustil preracunavanje prevajalniku, na podlagi kombiniranega rezultata pa samo postavil ali ugasnil bit, ki upravlja LEDico.
Kodo za nastavitev smeri I/O porta lahko premaknes izven zanke (pred zanko), saj je v zanki povsem nepotrebna in samo nekoliko zavira izvajanje.
Moj predlog: spremeni program tako, da bo samo (brezpogojno) spreminjal stanje izbranega izhodnega pina, tako da bos zagotovo vedel ali ta del kode deluje ali ne. Sele ko bos to vedel, bo jasno, ali sploh pravilno pises na izhod. |
|
Nazaj na vrh |
|
 |
discovery Član

Pridružen-a: Sre 15 Mar 2006 10:59 Prispevkov: 12 Aktiv.: 0.05
|
Objavljeno: Sre Maj 03, 2006 6:32 pm Naslov sporočila: |
|
|
Hvala Za vso pomoc! Napako sem resil.
Napaka sploh ni bila programska, ampak povrsnost pri sestavljanju hardverja.
L.p. |
|
Nazaj na vrh |
|
 |
|
|
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: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|