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 ... 26, 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
lojzek
Član
Član



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

PrispevekObjavljeno: Pon Dec 07, 2020 3:09 pm    Naslov sporočila:   Odgovori s citatom

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
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, 2020 3:02 pm    Naslov sporočila:   Odgovori s citatom

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...
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: Pet Dec 11, 2020 3:04 pm    Naslov sporočila:   Odgovori s citatom

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..

_________________
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
mato1111
Član
Član



Pridružen-a: Pet 28 Dec 2012 14:42
Prispevkov: 611
Aktiv.: 4.46
Kraj: Vrhnika

PrispevekObjavljeno: Pet Dec 11, 2020 10:33 pm    Naslov sporočila:   Odgovori s citatom

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];
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 Dec 15, 2020 7:16 am    Naslov sporočila:   Odgovori s citatom

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..
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 Dec 15, 2020 8:06 am    Naslov sporočila:   Odgovori s citatom

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.

_________________
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
lojzek
Član
Član



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

PrispevekObjavljeno: Čet Jan 07, 2021 8:01 pm    Naslov sporočila:   Odgovori s citatom

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.



lcd_lib.c
 Opis:

Download
 Ime datoteke:  lcd_lib.c
 Velikost datoteke:  7.38 KB
 Downloadano:  1 krat


lcd_lib.h
 Opis:

Download
 Ime datoteke:  lcd_lib.h
 Velikost datoteke:  3.7 KB
 Downloadano:  1 krat

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



Pridružen-a: Pet 28 Dec 2012 14:42
Prispevkov: 611
Aktiv.: 4.46
Kraj: Vrhnika

PrispevekObjavljeno: Čet Jan 07, 2021 9:26 pm    Naslov sporočila:   Odgovori s citatom

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.
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: Čet Jan 07, 2021 10:59 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
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
lojzek
Član
Član



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

PrispevekObjavljeno: Pet Jan 08, 2021 11:48 am    Naslov sporočila:   Odgovori s citatom

@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"
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 Jan 08, 2021 12:24 pm    Naslov sporočila:   Odgovori s citatom

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
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: Sre Feb 22, 2023 9:12 pm    Naslov sporočila:   Odgovori s citatom

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.
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: Sre Feb 22, 2023 9:46 pm    Naslov sporočila:   Odgovori s citatom

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
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: Sob Apr 15, 2023 10:28 am    Naslov sporočila:   Odgovori s citatom

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?



Slikca.png
 Opis:
 Velikost datoteke:  80.37 KB
 Pogledana:  13 krat

Slikca.png


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: Ned Apr 16, 2023 8:37 am    Naslov sporočila:   Odgovori s citatom

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.
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 ... 26, 27, 28, 29  Naslednja
Stran 27 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