www.elektronik.si
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  :||:
www.elektronik.si -> Osnove programiranja AVR-jev

Avtor: spyKraj: Tržič PrispevekObjavljeno: Sob Jul 18, 2009 12:12 am    Naslov sporočila:  
----------------------------------------------------------------------------
Pravilno.
In tudi v simulatorju (klik na asembler okno) boš videl, da se prevede v ukaz "sleep".

Avtor: lojzek PrispevekObjavljeno: Tor Sep 01, 2009 6:58 am    Naslov sporočila:  
----------------------------------------------------------------------------
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.

Avtor: Sokrat PrispevekObjavljeno: Tor Sep 01, 2009 8:29 am    Naslov sporočila:  
----------------------------------------------------------------------------
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.

Avtor: lojzek PrispevekObjavljeno: Tor Sep 01, 2009 9:32 am    Naslov sporočila:  
----------------------------------------------------------------------------
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

Avtor: Sokrat PrispevekObjavljeno: Tor Sep 01, 2009 10:08 am    Naslov sporočila:  
----------------------------------------------------------------------------
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).

Avtor: lojzek PrispevekObjavljeno: Tor Sep 01, 2009 10:32 am    Naslov sporočila:  
----------------------------------------------------------------------------
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

Avtor: Sokrat PrispevekObjavljeno: Tor Sep 01, 2009 10:41 am    Naslov sporočila:  
----------------------------------------------------------------------------
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.

Avtor: lojzek PrispevekObjavljeno: Čet Nov 26, 2009 7:42 am    Naslov sporočila:  
----------------------------------------------------------------------------
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;

Avtor: gumby PrispevekObjavljeno: Čet Nov 26, 2009 8:06 am    Naslov sporočila:  
----------------------------------------------------------------------------
Lahko.

Avtor: lojzek PrispevekObjavljeno: Čet Nov 26, 2009 8:17 am    Naslov sporočila:  
----------------------------------------------------------------------------
Aha. Torej imam problem nekje drugje Think

Avtor: lojzek PrispevekObjavljeno: Pet Dec 11, 2009 7:49 pm    Naslov sporočila:  
----------------------------------------------------------------------------
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

Avtor: gumby PrispevekObjavljeno: Pet Dec 11, 2009 8:23 pm    Naslov sporočila:  
----------------------------------------------------------------------------
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.

Avtor: lojzek PrispevekObjavljeno: Pet Dec 11, 2009 10:46 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Hvala lepa za info. Čeprav ni točen odgovor na vprašanje, vsaj vem, kje ga poiskat Wink

Avtor: gumby PrispevekObjavljeno: Pet Dec 11, 2009 10:57 pm    Naslov sporočila:  
----------------------------------------------------------------------------
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)

Avtor: osmicaKraj: savinjska PrispevekObjavljeno: Pon Dec 28, 2009 10:39 pm    Naslov sporočila:  
----------------------------------------------------------------------------
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č

Stran 12 od 29

Powered by phpBB © 2001,2002 phpBB Group