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 

Začetniški problem v C-ju pri AVR-ju
Pojdi na stran Prejšnja  1, 2, 3 ... 11, 12, 13 ... 27, 28, 29  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
spy
Član
Član



Pridružen-a: Sre 06 Sep 2006 20:43
Prispevkov: 403
Aktiv.: 1.89
Kraj: Tržič

PrispevekObjavljeno: Sob Jul 18, 2009 12:12 am    Naslov sporočila:   Odgovori s citatom

Pravilno.
In tudi v simulatorju (klik na asembler okno) boš videl, da se prevede v ukaz "sleep".
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Sep 01, 2009 6:58 am    Naslov sporočila:   Odgovori s citatom

Spet jaz Angel

Na mikrokontroler bi rad priključil barcode reader. No, to sem že naredil in tudi berem podatke. Edinole podatki so malce nerazumljivi- niso takšni, kot bi jih pričakoval.
To pa zato, ker očitno nisem dobro dešifriral komunikacije. Zato bi se rad lotil dešifriranja celotnega komunikacijskega protokola.

Torej, rad bi "ujel" celotno besedo, ki jo scaner pošlje v mikrokontroler. Se pravi z vsemi enicami in ničlami. Kakšen način moram uporabiti, da bi ujete črke spravil v neko veliko spremenljivko v mikrokontrolerju? To bi potem mirno preko USARTa spravil na PC in dešifriral. Če to namreč počenjam sproti, se mi del prejetih podatkov izgublja in dobim ven garbage.
Kakšno vrsto spremenljivke bi moral uporabiti, mogoče podprto tudi s kakim primerom.
Pišem pa v WinAvr.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 25.15

PrispevekObjavljeno: Tor Sep 01, 2009 8:29 am    Naslov sporočila:   Odgovori s citatom

To se ne dela tako, razen ce si mazohist.

Napisi, kaj ze ves o komunikaciji (torej katere podatke ze imas), ker se odgovor od tukaj naprej razlikuje glede na to, vsega pa nimam volje nastevati.

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Sep 01, 2009 9:32 am    Naslov sporočila:   Odgovori s citatom

d'oh! Saj sem res nerazumljivo napisal.

Torej, imam PS/2 komunikacijski protokol. Barcode reader ob prebrani kodi pošlje vlak signalov, ki jih prejme mikrokontroler. In iz tega bi zelo rad dobil tak podatek, kot je zapisan ob črtni kodi (številka 49776).
Namesto tega pa sedaj dobim garbage. Ta 49976 zgleda recimo takole: %p%FpFFpF=p=6p6

Ko sem pospešil USART komunikacijo (sem medtem tudi ugotovil, da to ni bilo potrebno) in namesto skenerja priklopil navadno tastaturo, sem ugotovil, da je vsak znak - številka v odčitku predstavljena s tremi znaki. Recimo št. 4 je %p%.
Kar pa je že manj garbage. Edinole še dešifrirat jih potrebujem.

Pomagal sem si s tole stranjo, ampak očitno se ne pošilja samo 8 bitni podatek (domneval sem, da se pošilja ASCII) in torej vse na tej strani ne drži.
Te trimestne znake bi rad predstavil na razumljiv način kot številke in črke.
Bom še malce sam poizkušal, ko se zataknem, bom pa spet tu Very Happy
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 25.15

PrispevekObjavljeno: Tor Sep 01, 2009 10:08 am    Naslov sporočila:   Odgovori s citatom

Aha, zdaj je vse jasno - saj ti cisto lepo deluje. Ker nisi prebral opisa protokola, si mi dolzan :lasko: !

-=-=-=-=-=-=-=-=-=-

Teorija:

Scanner emulira PS.2 tipkovnico.

Tipkovnica poslje dve kodi za (skoraj) vsako tipko: eno za pritisk, eno za od-pritisk.

Koda za od-pritisk tipke je enaka kodi za pritisk, le da ima spredaj se prefix 0xF0.

Vse stevilske tipke imajo za pritisk enomestno kodo.

-=-=-=-=-=-=-=-=-=-

Praksa:

Ti imas kodo %p%FpFFpF=p=6p6, ki se razdeli na

% p% (pritisk 4, od-pritisk 4)
F pF (9, od-9)
F pF (9, od-9)
= p= (7, od-7)
6 p6 (6, od-6)

Opazis kaksen vzorec ? Wink

Ves kje sem doma, tako da le urno s pivom Dancing

Pa ce bos operiral s stevilskimi kodami, bo vse precej manj zmedeno, ker ti vsakic sproti kodna tabela doloca v kaj se vrednost prevede (v kateri znak).

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Sep 01, 2009 10:32 am    Naslov sporočila:   Odgovori s citatom

Aha, še veliko jasneje. Ker ko sem poizkušal s tastaturo in tipko držal, se je pojavljal samo en znak namesto treh, na koncu pa tisti dvojni. Sedaj moram torej samo še ugotoviti, kje sem ga pobiksal v rutini za branje. Sem jo namreč od prvotne (za katero sedaj celo mislim, da je delala), že precej spremenil.

Pivo bo pa takrat, ko se pripeljem mimo Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 25.15

PrispevekObjavljeno: Tor Sep 01, 2009 10:41 am    Naslov sporočila:   Odgovori s citatom

Naredi tako, da ti uposteva kodo samo, ce ji sledi koda za od-pritisk (scanner jih bo vedno posiljal tako, kot ce bi pritiskal po eno tipko naenkrat), saj bos tako izlocil morebitne napake v komunikaciji. Ko imas obe kodi, pretvoris v vrednost (tekst ali stevilko) in to odposljes naprej oz. obdelujes, kar je pac potrebno.
_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Čet Nov 26, 2009 7:42 am    Naslov sporočila:   Odgovori s citatom

Tole postaja počasi že moja tema Smile

Imam težave z deklaracijo in klicanjem funkcije.

v headerju imam funkcijo deklarirano takole:

void Funkcija (uint_16t);

Mislim da imam problem v tem, ker jo ne kličem s pravimi podatki.
Med testiranjem sem jo klical samo z int podatki (in ni bilo errorjev pri prevajanju), sedaj pa jo včasih pokličem s char podatkom.
Torej vprašanje: ali lahko v spremenljivko tipa int vpišeš char? Recimo takole
Koda:
int a;
char b;

a = b;
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 19.74

PrispevekObjavljeno: Čet Nov 26, 2009 8:06 am    Naslov sporočila:   Odgovori s citatom

Lahko.
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Čet Nov 26, 2009 8:17 am    Naslov sporočila:   Odgovori s citatom

Aha. Torej imam problem nekje drugje Think
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pet Dec 11, 2009 7:49 pm    Naslov sporočila:   Odgovori s citatom

Ta tema je vedno bolj moja. Izgleda da imam samo jaz probleme Very Happy

Imam eno vprašanje oz. potrditev mojega mišljenja:

V tem postu sem omenil težave z "izostajanjem sekund".

Mislim, da sem rešitev našel, vseeno me pa zanima, če mislim prav:
Če imam v programu dve časovni prekinitvi (ena takt iz omrežja, druga lastni takt), kaj se zgodi, ko se med izvajanjem ene prekinitve zgodi tudi druga? Po moje uC začne izvajati drugo prekinitev in ko jo zaključi, nadaljuje zopet v glavnem programu. Na zaključitev prve prekinitve pa pozabi.

Ali imam prav? Think
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 19.74

PrispevekObjavljeno: Pet Dec 11, 2009 8:23 pm    Naslov sporočila:   Odgovori s citatom

c/p iz datasheeta za mega8:
Citiram:
When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled. The user software can write logic one to the I-bit to enable nested interrupts. All enabled interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a Return from Interrupt instruction – RETI – is executed.


Tebi je takt iz omrežja zelo pomemben, saj ti ta določa točnost ure. Ta naj ima najvišjo prioriteto.

Splošno pa velja, da naj bodo prekinitvene rutine zelo hitre (npr. samo poveča nek števec, postavi nek flag, itd). Uporaba delay() in podobnih funkcij znotraj prekinitev je zelo slaba ideja.

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pet Dec 11, 2009 10:46 pm    Naslov sporočila:   Odgovori s citatom

Hvala lepa za info. Čeprav ni točen odgovor na vprašanje, vsaj vem, kje ga poiskat Wink
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 19.74

PrispevekObjavljeno: Pet Dec 11, 2009 10:57 pm    Naslov sporočila:   Odgovori s citatom

Nimaš prav, če si hotel direkten odgovor. Po končanju druge prekinitve se vrne v prvo in po končanju te v glavni program.

"nested interrupt" je tisto, kar te zanima (torej prekinitev med prekinitvijo)...

Za hec daj 100ms zakasnitev v prekinitveno rutino in opazuj, kako se bo program obesil, ker se nikoli ne bo vrnil iz nobene prekinitve (ta se zgodi na vsakih 10 ali 20 ms)

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
osmica
Član
Član



Pridružen-a: Sob 22 Maj 2004 21:16
Prispevkov: 377
Aktiv.: 1.70
Kraj: savinjska

PrispevekObjavljeno: Pon Dec 28, 2009 10:39 pm    Naslov sporočila:   Odgovori s citatom

Iz te teme sem iz programov, ki so napisani izdelal tale program za štetje stiskov na tipko ozioma vsakih 800 mS šteje za eno. Vse mi prevede OK vendar mi ne šteje več kot do 01. Prosim za pomoč, kje je napaka?
Koda:
#define F_CPU 1000000
#include <avr\io.h>
#include <util\lcd_lib.c>
#include <util\delay.h>


volatile unsigned char  e, d;
volatile unsigned char val;

int main (void)
{

DDRA=0xff;
DDRB=0x01;

LCDinit ();
LCDclr ();
LCDcursorOFF();
LCDGotoXY(2,0);   //postavi se na pozicijo
LCDstring ("dela ",5);

void izracun()
   {
     e=val/10;   //enice
     e=e*10;
     e=val-e;

     val=val/10;   //desetice
     d=val/10;
     d=d*10;
     d=val-d;
    }
;
val=0;
while (1)
{
 if (PINB &0X01)
 {
  ++val;
   
   izracun();
   LCDclr ();
   LCDGotoXY(2,0);
   LCDsendChar (d+48);
   LCDsendChar (e+48);
  _delay_ms(800);
  };
 }   
}


Za vsak ukaz LCDstring mi napiše opozorilo: warning: pointer tragets in passing argument 1 of 'LCDstring ' differ in signedness
vendar ko sem se igral z LCDju je delalo vse OK.
Hvala za pomoč
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3 ... 11, 12, 13 ... 27, 28, 29  Naslednja
Stran 12 od 29

 
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