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 ... 22, 23, 24 ... 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
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 6.24
Kraj: Črnomelj

PrispevekObjavljeno: Ned Sep 08, 2013 2:56 pm    Naslov sporočila:   Odgovori s citatom

To mi pol ne pomaga nič.

Hvala vseeno Wink

_________________
Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.26
Kraj: Ljubljana

PrispevekObjavljeno: Pon Sep 09, 2013 10:15 am    Naslov sporočila:   Odgovori s citatom

Zakaj pa ne poskusiš v tej smeri?

Koda:

#define LCD_RS_PORT    B
#define LCD_RS_PIN      PINB7

#include "MyMacros.h"


Vsebina MyMacros.h:
Koda:

#define SET_BIT(port,pin)      port|=1<<pin
#define CLR_BIT(port,pin)      port&=~(1<<pin)
#define CHECK_BIT(port,pin)   (port&(1<<pin))
#define DDR(x)      DDR ## x
#define PORT(x)   PORT ## x
#define PIN(x)      PIN ## x



LP, Gregor
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: Pon Sep 09, 2013 1:23 pm    Naslov sporočila:   Odgovori s citatom

gregoral je napisal/a:
Koda:
#define SET_BIT(port,pin)      port|=1<<pin


V izogib kasnejšim glavobolom se navadite na tako obliko:
Koda:
#define SET_BIT(port,pin)      (port)|=1<<(pin)

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



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.26
Kraj: Ljubljana

PrispevekObjavljeno: Pon Sep 09, 2013 3:23 pm    Naslov sporočila:   Odgovori s citatom

gumby: V izogib kasnejšim glavobolom se navadite na tako obliko:
Koda:
#define SET_BIT(port,pin)      (port)|=1<<(pin)


Pritrjujem napisanemu,
parametre makrojev je zelo priporočljivo vgnezditi med oklepaje.

Razlog:
Koda:

#define OPERACIJA_A(x)      x*2
#define OPERACIJA_B(x)      (x)*2
...
int a = OPERACIJA_A(1+1);
int b = OPERACIJA_B(1+1);
...
// to je isto kot
int a = 1+1*2;
int b = (1+1)*2;


Razlika upam da je vsem razumljiva!
Vrstni red operacij se spremeni, s tem pa tudi rezultat!

Moj post je bil za ilustracijo ideje, s katero je možno vrstni red definicij zelo enostavno zamenjati.

Osnova je da splošne makroje premakneš v header file.
To je priporočljivo v vsakem primeru.
S tem pridobiš tudi možnost uporabe iste datoteke v več projektih.
Prednost je, da izboljšave te datoteke lahko uporabiš pri vseh projektih ki datoteko uporabljajo.

Header datoteko potem vključuješ po potrebi.
Pred vključevanjem pa lahko definiraš tudi druga "imena".

Kodo sem vzel od predhodnikov in je nisem podrobno analiziral.

Lp, Gregor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 6.24
Kraj: Črnomelj

PrispevekObjavljeno: Tor Sep 10, 2013 3:01 am    Naslov sporočila:   Odgovori s citatom

gregoral je napisal/a:
Zakaj pa ne poskusiš v tej smeri?

Koda:

#define LCD_RS_PORT    B
#define LCD_RS_PIN      PINB7

#include "MyMacros.h"


Vsebina MyMacros.h:
Koda:

#define SET_BIT(port,pin)      port|=1<<pin
#define CLR_BIT(port,pin)      port&=~(1<<pin)
#define CHECK_BIT(port,pin)   (port&(1<<pin))
#define DDR(x)      DDR ## x
#define PORT(x)   PORT ## x
#define PIN(x)      PIN ## x



LP, Gregor


Žal, ampak to je neuporabno za moj problem.

_________________
Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
program_er
Član
Član



Pridružen-a: Sob 08 Mar 2008 13:47
Prispevkov: 2173
Aktiv.: 11.12
Kraj: Maribor (Pohorje)

PrispevekObjavljeno: Tor Sep 10, 2013 8:50 am    Naslov sporočila:   Odgovori s citatom

Koda:
#define SET_BIT(port,pin)   (port) |= 1<<(pin)
#define CLR_BIT(port,pin)   (port) &=~(1<<(pin))
#define CHECK_BIT(port,pin)   ((port)&(1<<(pin)))

#define DDRx(x)      (DDR ## x)
#define PORTx(x)   (PORT ## x)
#define PINx(x)      (PIN ## x)

#define DDR(x)   DDRx(x)
#define PORT(x)   PORTx(x)
#define PIN(x)   PINx(x)

#define LCD_RS_PORT    B
#define LCD_RS_PIN     PINB7


Tvoj makro ne sme imeti "stika" z ##, ker se v tem primeru ne razširi. Zato sem dodal še eno plast makroja, kar povzroči, da se prvotni makro pravilno razširi in stvar deluje.

Preberi si odlomek: Scanning the replacement list for macros to expand.

_________________
Upanje ni del naše projektne strategije.
Member of Trisat - 1. Slovenian satellite running new fault tolerant aerospace processor.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.26
Kraj: Ljubljana

PrispevekObjavljeno: Tor Sep 10, 2013 8:51 am    Naslov sporočila:   Odgovori s citatom

tilz0R je napisal/a:
Žal, ampak to je neuporabno za moj problem.

Nisi probal, ne deluje, ti ni všeč, kaj je narobe??
Napiši da bodo tudi drugi vedeli in se morda česa naučili.

Poskusiš lahko še z inline funkcijami namesto makrojev.
Poleg tega dobiš zraven type-checking gratis.

Koda:

//typedef uint8_t address_t;
//typedef uint8_t index_t;
typedef int address_t;
typedef int index_t;

static inline void SET_BIT(volatile address_t *target, index_t bit){ *target |= (1<<bit); };
static inline void CLR_BIT(volatile address_t *target, index_t bit){ *target &= ~(1<<bit); };
static inline void TOGGLE_BIT(volatile address_t *target, index_t bit){ *target ^= (1<<bit); };
static inline bool CHECK_BIT(volatile address_t *target, index_t bit){ return *target & (1<<bit); };



LP, G
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 6.24
Kraj: Črnomelj

PrispevekObjavljeno: Tor Sep 10, 2013 10:57 am    Naslov sporočila:   Odgovori s citatom

gregoral je napisal/a:
tilz0R je napisal/a:
Žal, ampak to je neuporabno za moj problem.

Nisi probal, ne deluje, ti ni všeč, kaj je narobe??
Napiši da bodo tudi drugi vedeli in se morda česa naučili.

LP, G


Ni delalo, še vedno DDRLCD_RS_PORT da ne obstaja.

Sem pa našel na netu "adc" knjižnico, v kateri je bila koda za "CONCAT" pa sem jo dodal k sebi.

Koda:

#ifndef CONCAT1
   #define CONCAT1(a, b) CONCAT2(a, b)
#endif

#ifndef CONCAT2
   #define CONCAT2(a, b) a ## b
#endif

#define SET_BIT(port,pin)         (port)|=1<<(pin)
#define CLR_BIT(port,pin)         (port)&=~(1<<(pin))
#define CHECK_BIT(port,pin)         ((port)&(1<<(pin)))
#define PINSTATE(port,pin,state)   (state==0)?(CLR_BIT((port),(pin))):(SET_BIT((port),(pin)))
#define DDR(x)                  CONCAT1(DDR, x)
#define PORT(x)                  CONCAT1(PORT, x)
#define PIN(x)                  CONCAT1(PIN, x)
#define CONCAT(a, b)            CONCAT1(a, b)


In uporaba čudežno dela:

Koda:

DDR(LCD_RS_PORT);


Zdej zakaj je to, da tokrat dela ne vem, če pa kdo ve pa lahko napiše.

_________________
Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.98
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Sre Sep 11, 2013 2:16 pm    Naslov sporočila:   Odgovori s citatom

tilz0R je napisal/a:

Zdej zakaj je to, da tokrat dela ne vem, če pa kdo ve pa lahko napiše.


Saj ti je progam_er napisal, zakaj je tako, tudi pravo resitev ti je podal.

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
klemen88
Član
Član



Pridružen-a: Tor 01 Jan 2008 17:37
Prispevkov: 747
Aktiv.: 3.78
Kraj: Slovenj Gradec

PrispevekObjavljeno: Pon Jun 30, 2014 6:40 pm    Naslov sporočila:   Odgovori s citatom

Lep pozdrav,

tudi jaz sem prišel do problema oz. sam ne najdem rešitve. Sem začetnik v Cju.

Uporabljam ATMega328 ter programiram v C-ju (GCC).

V eni aplikaciji želim uporabiti UART komunikacijo in sem vzel že napisano knjižico od Peter Fleury-a. Zadeva deluje tako kot more vendar težava nastane, ko želim sprejeti več bytov informacij (string). Kako bi lahko na boljši način sprejel string v obdelavo (predhodno se shrani v procesorju in potem kličemo byte po byte vsak cikel) kot sem to storil jaz. Težavo imam, ker nikoli nevem, če sem že sprejel celoten string.



Koda:

   // SPREJEM ZNAKOV //
            
 c = uart_getc();
        if ( c & UART_NO_DATA )
        {
    /* ni podatkov
      
        }
        else
        {
                 zastavica=1;
            sprejem[i]=c;
            i++;
         
          /*
             * nov podatek
         
                       */
         
      }

      // KONEC SPREJEMA //


Sam sem razmišljal v tej smeri, da bi uporabil samo "c = uart_getc();" in z neko while funkcijo shranjeval podatke v string, od 0 (0 vrne, če ni kakšnega sprejetega podatka) pa do druge 0, ki sledi in potem postavil zastavico, da je sprejet string.
Sam sem poskušal vendar zaradi predhodnega (ne)znanja nisem prišel do prave rešitve. Upam, da me razumeta kaj sem želel napisati.

Hvala za odgovore!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 6.24
Kraj: Črnomelj

PrispevekObjavljeno: Pon Jun 30, 2014 6:45 pm    Naslov sporočila:   Odgovori s citatom

Ena ideja je, da čakaš znak, ki ti pomeni konec stringa, recimo "\n".
_________________
Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
klemen88
Član
Član



Pridružen-a: Tor 01 Jan 2008 17:37
Prispevkov: 747
Aktiv.: 3.78
Kraj: Slovenj Gradec

PrispevekObjavljeno: Sre Jul 02, 2014 6:19 pm    Naslov sporočila:   Odgovori s citatom

To sem že poskusil vendar mi nekako ni delalo. Zdaj, ko si mi napisal sem spet poskusil in dodal 100us pavzo pri pobiranju znakov iz spomina mi je stvar začela delovati. Včasih že pomaga, če samo napišeš na forum Wink

Če se mi še kje zalomi pa se priporočam,

Hvala!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.69
Kraj: Yogyakarta

PrispevekObjavljeno: Sre Jul 02, 2014 11:01 pm    Naslov sporočila:   Odgovori s citatom

ponavadi imas nek flag, ki ga lahko preveris ali je kak podatek v internem UART bufferju.

ali pa naredis na prekinitve ki ti polnijo neko string speremenljivnko.
v glavni zanki pa se sprehodis cez sprejete znake

_________________
Bad things happen to good people all the time for no reason!
Blog
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
klemen88
Član
Član



Pridružen-a: Tor 01 Jan 2008 17:37
Prispevkov: 747
Aktiv.: 3.78
Kraj: Slovenj Gradec

PrispevekObjavljeno: Pon Avg 04, 2014 6:48 am    Naslov sporočila:   Odgovori s citatom

Lep pozdrav,

zadeva mi sedaj deluje, problem mi je nastal kako bi iz string ločil podatke in jih stranil v svojo spremenljivko, med seboj se ločijo z vejico.

Naredil sem s to kodo vendar mi ne deluje vedno kot bi morala.

Koda:

char *tmp_rx_data = rx_data; // Zacasni kazalec


// Poisci vsebino

// Isci do naslednjega ','


while( *tmp_rx_data++ != ',' );

// Izracunaj dolzino

int length = tmp_rx_data - rx_data ;

// Rezerviraj prostor za vsebino

vsebina = (char*)malloc( length  );

// Zascitis, da ne vgre cez dovoljene meje

vsebina[length-1] = 0;

// Prekopiraj vsebino

memcpy(vsebina, tmp_rx_data, length-1 );



Hvala!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
program_er
Član
Član



Pridružen-a: Sob 08 Mar 2008 13:47
Prispevkov: 2173
Aktiv.: 11.12
Kraj: Maribor (Pohorje)

PrispevekObjavljeno: Tor Avg 05, 2014 7:05 pm    Naslov sporočila:   Odgovori s citatom

klemen88 je napisal/a:
Naredil sem s to kodo vendar mi ne deluje vedno kot bi morala.


Kdaj pa ne deluje in kaj se takrat dogaja?

Prvi očiten problem bi bil v primeru stringa, ki ima že na prvem mestu vejico. V tem primeru je spremenljivka length = 0, zato ti malloc vrne NULL pointer, nato pa hočeš ti na ta null_pointer[-1] zapisati 0 (torej dvojna napaka).

EDIT: Spregledal post inkrement pri *tmp_rx_data++. Zgoraj napisano torej ni možno.

EDIT2: Ti kopiraš bajte iz tmp_rx_data na vsebina. Vendar pazi, tmp_rx_data kaže na konec substringa, na začetek kaže rx_data.

Ekvivalentna (a delujoča) koda memcpy v tvojem primeru bi bila:
Koda:
// Rezerviraj prostor za vsebino

vsebina = (char*)malloc( tmp_rx_data - rx_data );

// Prekopiraj vsebino

char *tmp_substr = rx_data;

while( tmp_substr != tmp_rx_data ) *(vsebina++) = *(tmp_substr++);

*vsebina = 0; // Dodaj null-char na koncu

ali
Koda:
// Rezerviraj prostor za vsebino

vsebina = (char*)malloc( length );

// Zascitis, da ne vgre cez dovoljene meje

vsebina[--length] = 0; // length je >= 1

// Prekopiraj vsebino

while(length--) vsebina[length] = tmp_rx_data[length];

ali
Koda:
// Rezerviraj prostor za vsebino

vsebina = (char*)malloc( length  );

// Zascitis, da ne vgre cez dovoljene meje

vsebina[--length] = 0; // length je >= 1

// Prekopiraj vsebino

memcpy(vsebina, rx_data, length);

_________________
Upanje ni del naše projektne strategije.
Member of Trisat - 1. Slovenian satellite running new fault tolerant aerospace processor.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
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 ... 22, 23, 24 ... 27, 28, 29  Naslednja
Stran 23 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: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group