www.elektronik.si
Začetniški problem v C-ju pri AVR-ju
Pojdi na stran Prejšnja  1, 2, 3 ... 26, 27, 28, 29  Naslednja  :||:
www.elektronik.si -> Osnove programiranja AVR-jev

Avtor: lojzek PrispevekObjavljeno: Pon Dec 07, 2020 3:09 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Think

Sem pogledal v program in tam podpičje je. Mislim da se je podpičje izgubilo pri Copy/paste kode tukaj v post, ko sem ga urejal.. Think

Avtor: lojzek PrispevekObjavljeno: Pet Dec 11, 2020 3:02 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Pozdrav, tisto kar sem spraševal prejšnjič, bom preverjal preko vikenda, sem imel drugo delo.

Imam pa dve težavici - warninga pri kompilanju in to že od začetka učenja C-ja, torej cca 10 let Smile. Program sicer dela b.p., ampak med toliko warningi potem izgubiš bistvenega...

Torej, v knjižnici za uporabo LCD-ja imam deklaracijo funkcije tako:

Koda:
void LCDstring(uint8_t*, uint8_t, uint8_t);   //Outputs string to LCD - na poziciji x,y (12.10.2011)


v programu pa imam deklarirano recimo eno globalno spremenljivko,
Koda:
volatile unsigned char tekst [21];


v programu pa funkcijo uporabim takole:

Koda:
LCDstring ("11.12.2020 v1.2", 0, 1);


Tavarianta mi vrže ven warning:

../DS18_adresar.c:61:1: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness
../lcd_lib.c:144:6: note: expected 'uint8_t *' but argument is of type 'char *'

Kaj je treba narediri, da se tega znebim? Domnevam, da je nekaj narobe z deklaracijo spremenljivk, ampak mi ne uspe rešiti brez Warningov.

2 varianta pa je uporaba tega:


Koda:
sprintf (tekst, "%03d.%d'C", temp/10, abs(temp%10));
LCDstring(tekst,9,0);


kar vrže napako:
../DS18_adresar.c:142:1: warning: passing argument 1 of 'sprintf' discards qualifiers from pointer target type
../DS18_adresar.c:143:1: warning: passing argument 1 of 'LCDstring' discards qualifiers from pointer target type
../lcd_lib.c:144:6: note: expected 'uint8_t *' but argument is of type 'volatile unsigned char *'

Mislim, da bo rešitev enega problema rešila tudi drugega...

Avtor: tilz0RKraj: Črnomelj PrispevekObjavljeno: Pet Dec 11, 2020 3:04 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Najprej se odloči, ali boš uporabljal tipe iz stdint ali navadne tipe, predvsem integer.

String je signed char, medtem ko ti imaš parameter unsigned char. Zato imaš warning.

Deklariraj funkcijo, da sprejme "char *". in deklariraj spremenljivko kot char text..

Avtor: mato1111Kraj: Vrhnika PrispevekObjavljeno: Pet Dec 11, 2020 10:33 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Tudi jaz imam vprsanje in sicer je povezano z eepromom. Rad bi nastavil zacetne vrednosti eeprom spremenljivk in jih vnesel v MCU ko bi ga sprogramiral z eep datoteko.
V spodnjem primeru mi je jasno:
Koda:
static char EEMEM eVar[9]= "XYZ"; //primer z zacentno vrednostjo


Ni pa mi jasno kako se to naredi ce imam spremenljivke v strukturi:
Koda:
struct EEP_Vars_struct
{
    char EEP_Var1[9]; //to bi nastavil na "X"
    char EEP_Var2[5]; //to bi nastavil na "Y"
};
struct EEMEM EEP_Vars_struct EEP_Vars[3]; //v vseh strukturah zelim enako


In se naslednje vprasanje. Zelim n spremenljivk tipa string kot je spodnja
Koda:
char ID[5];

Je boljse uporabit en 2D array ali n struktur?
Koda:
struct ID_struct {

    char ID[5];
};
ID_struct ID[n];
ali
char ID[n][5];

Avtor: lojzek PrispevekObjavljeno: Tor Dec 15, 2020 7:16 am    Naslov sporočila:  
----------------------------------------------------------------------------
Samo da odgovorim Tilz0r-ju, na žalost (ali srečo) sem in bom imel do novega leta bolj malo časa za testiranje... En kup zaposlenosti. Da se bo vedelo, zakaj ne sodelujem aktivno v temi z "mojimi" vprašanji..

Avtor: tilz0RKraj: Črnomelj PrispevekObjavljeno: Tor Dec 15, 2020 8:06 am    Naslov sporočila:  
----------------------------------------------------------------------------
mato1111 je napisal/a:
Tudi jaz imam vprsanje in sicer je povezano z eepromom. Rad bi nastavil zacetne vrednosti eeprom spremenljivk in jih vnesel v MCU ko bi ga sprogramiral z eep datoteko.
V spodnjem primeru mi je jasno:
Koda:
static char EEMEM eVar[9]= "XYZ"; //primer z zacentno vrednostjo


Ni pa mi jasno kako se to naredi ce imam spremenljivke v strukturi:
Koda:
struct EEP_Vars_struct
{
    char EEP_Var1[9]; //to bi nastavil na "X"
    char EEP_Var2[5]; //to bi nastavil na "Y"
};
struct EEMEM EEP_Vars_struct EEP_Vars[3]; //v vseh strukturah zelim enako



Tako bo šlo:
Koda:

/* Lahko daš številko v oklepaje da definiraš velikost, drugače se bo definirala pri definiciji */
struct EEMEM EEP_Vars_struct EEP_Vars[] = {
    {"X", "Y"},                                     /* Prvi element, < C99 stil */
    { .EEP_Var1 = "X", .EEP_Var2 = "Y" } /* >= C99 stil */
}


mato1111 je napisal/a:
In se naslednje vprasanje. Zelim n spremenljivk tipa string kot je spodnja
Koda:
char ID[5];

Je boljse uporabit en 2D array ali n struktur?
Koda:
struct ID_struct {

    char ID[5];
};
ID_struct ID[n];
ali
char ID[n][5];


Dobro vprašanje, in konkretno za arhitekturo AVR ne vem, kar je boljše iz stališča performancev. Generalno pa vedi nekaj:

- Prevajalnik lahko strukturo poravnava na določeno število bytov (ponavadi 2, 4, 8), za dosego najboljšega performance-a. Torej je sizeof(struct ID_Struct) lahko recimo 8 bytov, v tvojem primeru bi lahko bil array tega velik n * 8 bytov, minimalno pa je n * (sizeof_vsake_elementa_posamezno). Če je v strukturi samo en element, se po navadi alignment ne dela, a dobro je vedeti. To ni standard, to je compiler specific. Torej v najboljšem primeru bo porava tvojega pomnilnika n * 5, v najslabšega pa ne vem, lahko da bo n * 8.
- Array bo imel vedno znano velikost, v tvojem primeru n * 5 bytov.

Jaz bi šel z strukturo, če ne drugo je lažje z njo programirati, kot pa z 2d array-i.

Avtor: lojzek PrispevekObjavljeno: Čet Jan 07, 2021 8:01 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Pozdravljeni, z večjim delom sem zaključil, sedaj pa k problemu, ki mi še ostaja.
Glede na take post - težave s passing argument differ in signedness sem sestavil tale mali testni programček. V njem sem poskusil upoštevat Tilz0r-jeve usmeritve, ki mi niso čisto jasne.
V programčku sta na začetku dve različni definiciji (po signedness), ena komentirana da sem lahko prevedel z AVR studiem.

na dnu programa pa je še copy paste izpisa warningov za obe varianti.

Tole:
Koda:

#include <stdio.h>
#include "lcd_lib.c"
#include <avr\io.h>

//ena vrsta definicije je komentirana zaradi možnosti kompilanja

//pri tej definiciji vržeta napako oba LCDstringa, sprintf pa ne (NAPAKA1)
char tekst [20];

//pri tej definiciji vržeta napako prvi LCDstring in sprintf.
         //Drugi LCDstring pa ne (NAPAKA2)
//unsigned char tekst [20];

int main (void)
{

while (1)
{

//Rezultat obojega je izpisana beseda "Napiši" na ekranu (pozicija 0,0)

LCDstring ("Napisi",0,0);   

sprintf (tekst, "Napisi");
LCDstring (tekst,0,0);

LCDclr();

}
}


/* Copy/paste napake 1 (prva definicija)+++++++++++++++++++++

../Test.c: In function 'main':

*./Test.c:22:1: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness
../lcd_lib.c:144:6: note: expected 'uint8_t *' but argument is of type 'char *'

*./Test.c:25:1: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness
../lcd_lib.c:144:6: note: expected 'uint8_t *' but argument is of type 'char *'





   Copy/paste napake 2 (druga definicija)++++++++++++++++++++

':../Test.c: In function 'main':

*./Test.c:22:1: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness
../lcd_lib.c:144:6: note: expected 'uint8_t *' but argument is of type 'char *'

*./Test.c:24:1: warning: pointer targets in passing argument 1 of 'sprintf' differ in signedness
c:\program files\atmel\avr tools\avr toolchain\bin\../lib/gcc/avr/4.5.1/../../../../avr/include/stdio.h:669:12: note: expected 'char *' but argument is of type 'unsigned char *'
*/


Če je rešitev samo v napačni definiciji spremenljivke "tekst", bi poprosil za usmeritev na pravo pot. S pointerji nisem ravno na ti, tako da je tu lahko rešitev.

Ker pa mogoče to ni tako lahko, pa prilagam še knjižnico za LCD, z njenimi definicijami funkcij. Da se lahko vanjo pogleda ali pa celo posimulira v AVR studiu, če si kdo lahko vzame čas.

Avtor: mato1111Kraj: Vrhnika PrispevekObjavljeno: Čet Jan 07, 2021 9:26 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Za string bo definicija: char tekst [20];

Je pa zanimivo to da imaš v .h datoteki definirano kot void LCDstring(uint8_t*, uint8_t, uint8_t); v .c pa kot void LCDstring(unsigned char* data, unsigned char x, unsigned char y).
Daj popravi in daj v obeh enak tip void LCDstring(char* data, unsigned char x, unsigned char y) ter probaj če bo potem OK.

Jaz za prepis/kopiranje stringov uporabljam funkcijo strcpy.
Koda:
strcpy(tekst,"Napisi"); //Vkljucit moras se knjiznico <string.h>

Še to če kje vidiš da funkcija prejme parameter char data[] ali pa char* data je ubistvu isto ker oboje kaže na lokacijo prvega znaka v stringu.

Avtor: tilz0RKraj: Črnomelj PrispevekObjavljeno: Čet Jan 07, 2021 10:59 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Tudi sprintf uporabljaš narobe.

Če že, potem tako:
Koda:
sprintf (tekst, "%s", "Napisi");


strcpy je boljše, še boljše strncpy.

Lojzek, če potrebuješ razlago v voice obliki, sem na voljo ali na zoom ali na mobitel. Več na https://majerle.eu za številko.

Avtor: lojzek PrispevekObjavljeno: Pet Jan 08, 2021 11:48 am    Naslov sporočila:  
----------------------------------------------------------------------------
@mato1111 in tilzOR:

ubogal sem nasvet mato-ta Pray voila Smile Brez warningov Dancing

V .c in .h knjižnicah sem dal vse na char in unsigned char. Prav tako v programu tekst definiram kot char. In dela.

Sem pa pri tem ugotovil, da prevajalnik (dokaj) dobro prebavi uint8_t in unsigned char in njuno navzkrižno uporabo.
Dokaj zato ker že berem da tudi to ni nujno enako.

Nista pa enaka int8_t in char. Pri tem pa kompiler res dela razliko. Milslim da še posebej ne mara int8_t oblike Think

Torej, hvala obema za pomoč. Sedaj pa urediti pravi program. Če je samo to, bom hitro skozi.

PS še odgovor za tilzor-ja... Prikazan sprintf je samo za poenostavljen primer. Drugače ga uporabljam za sestavo stringa iz besed in cifer. Za v primeru prikazano uporabo je namreč nesorazmerno "spominsko požrešen" v primeri s sam "LCDstring"

Avtor: lojzek PrispevekObjavljeno: Pet Jan 08, 2021 12:24 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Evo mene nazaj. Very Happy

V nekaj minutah sem se rešil cca 70 warningov in tako sedaj ostajajo še trije nepomembni.
Pa še dve knjižnici za LCD in TWI lcd, ki ju na začetku pisanja programa uporabim, sem popravil.

Hvala še enkrat, Branko

Avtor: lojzek PrispevekObjavljeno: Sre Feb 22, 2023 9:12 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Moja tema Eh?

Vprašanje:
Problem z NRF24L01
Imam Atmego (no ja, arduino v AVR studiu, C okolje) in bi rad prebral / nastavil adreso oddajne pipe NRFja (TX in RX0)

Znam prebrat in pisat v NRFju iz in v registre, dolge en byte. In tudi podatek za prenos večje dolžine (FIFO)

Adrese pa so dolge lahko 5 Bytov, vse v istem registru.

Seveda prvi byte zapišem / preberem verjetno pravilno, kako pa zapišeš / prebereš ostale 4?
Ni mi treba C kode, samo princip... :

- ali je za pisanje vsakega od bytov treba vsakič poslati komando za pisanje registra? (domnevam da ne, ker bi potem NRF podatek vsakič vpisal v prvo mesto adresnega registra?)

- ali pa NRF sam pri naslednjem vpisanem bytu brez komande za vpis to ve in naredi vpis v naslednje mesto od petih? (to bi mi bilo bolj logično)

- za branje je skoraj 100% princip enak, tako da če bom znal pisat, bom znal tudi brat.

Sprašujem pa zato, ker preberem pri obeh principih vedno isto adreso (verjetno napačno) in tako ne vem, če sem jo ali vpisal ali pa prebral prav. Oz kaj sem kam vpisal in kaj sem od kje prebral.

Nekaj je pa 100% narobe pri tem, ker če ne spreminjam adres (uporabim defaultno TX in RX0), podatek lepo leti med NRFjema...

Se mučim že nekaj dni - ko imam čas - , PDF čipa mi pri tem ni bil v pomoč, ali pa ne vidim rešitve.

Avtor: lojzek PrispevekObjavljeno: Sre Feb 22, 2023 9:46 pm    Naslov sporočila:  
----------------------------------------------------------------------------
POzdrav 2.ič

Odgovarjam sam sebi. In drugemu, če koga zanima.

Če pošiljaš dva podatka (TX in RX0 adresi), moraš med komandama in podatki za dva vpisa sprostiti SPI linije. Drugače druge komande za vpis ne upošteva Brick wall

Avtor: lojzek PrispevekObjavljeno: Sob Apr 15, 2023 10:28 am    Naslov sporočila:  
----------------------------------------------------------------------------
Novo vprašanje.

Zamenjal sem platformo AVR Studio --> Atmel Studio.
Problem je pa s prevodom programa.
Del programa na sliki mi novi Atmel studio ne prevede, (AVR studio ga je b.p.).

Zanimivi sta recimo vrstici 97 in 98, obe javita svojo napako na slikici spodaj.
Vem da je nekaj narobe z deklaracijami spremenljivk za besedilo. vrsta 97. Funkcija PrintString je deklarirana tako :
Koda:
void PrintString(int8_t*);


Ne vem pa tudi, kaj je narobe v sprintf, vrsta 98. Recimo spremenljivka Vlaga- zaradi katere se napaka pojavi - je povsem na začetku programa deklarirana kot

Koda:
volatile unsigned int Vlaga;


Kako bi morale biti zadeve deklarirane / definirane?

Avtor: lojzek PrispevekObjavljeno: Ned Apr 16, 2023 8:37 am    Naslov sporočila:  
----------------------------------------------------------------------------
Sem ugotovil kar sam, kje tiči velikonočni zajec. Naredil sem čisto kratek kartako programček z bistvenimi težavami pri kompajliranju.

In po taktiki MUP (mnoštvo uzaludnih pokušaja) sem ugotovil, da je Atmel Studio veliko bolj zahteven pri uporabi vrst spremenljivk kot WinAVR.
Torej, char upošteva popolnoma drugače kot int8_t

In tako je pri uporabi stringov obvezna uporaba spremenljivke tipa char.. Vsaj tako trenutno kaže.

Stran 27 od 29

Powered by phpBB © 2001,2002 phpBB Group