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



Pridružen-a: Sob 10 Jun 2006 14:19
Prispevkov: 313
Aktiv.: 1.44
Kraj: Dolenjska

PrispevekObjavljeno: Ned Apr 16, 2023 12:44 pm    Naslov sporočila:   Odgovori s citatom

Tole je verjetno samo stvar nastavitev kompilerja.
Malo poglej v Project -> ... Properties -> Toolchain -> AVR/GNU C Compiler.

Lahko to rešiš tako, da uporabljaš pravi tip spremenljive, včasih pa ga tudi ne moreš ker bi recimo rabil da ima spremenljivka dva različna tipa.
Problem lahko rešiš tudi takole npr. za vrstico 97:
Koda:
PrintString("Vlaga")
napišeš takole
Koda:
PrintString((int8_t*)"Vlaga")
torej pretvoriš tip spremenljivke v pravilnega na mestu uporabe. Sicer moraš to potem pisati vsakič, tako da je ponavadi bolje spremenljivko definirati v tipu kot se večinoma uporablja.

Jan
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: Pon Apr 17, 2023 1:20 pm    Naslov sporočila:   Odgovori s citatom

Saj sem nekako vedel da je to težava kompilerja. Ker mi je prej tako delalo b.p.

Sem pa vse stringe (spremenljivke in funkcije ki jih uporabljajo) spremenil v char.

Tam kjer so pa samo enobytne spremenljivke, torej cifre, pa mislim da nima veze, če je to deklarirano kot char ali int8_t. Vsaj po matematičnih / logičnih funkcijah, ki jih z njimi izvajam, je videti da je to tako.
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 Avg 29, 2023 4:35 pm    Naslov sporočila:   Odgovori s citatom

Novo vprašanje.
Imam Atmega s programom, ki sicer deluje b.p.
Občasno - zelo poredko se sicer nekam zatakne in zacikla, ampak to naj bi ne bil problem. Namreč imam watchdoga, ki bi naj (in tudi naredi) naredil reset uc-ja. Ampak, procesor se ne pobere, izvede samo nekaj prvih vrstic programa in se zopet zacikla. Tako da ga Watchdog stalno resetira in je vedno v zanki izvajanja začetka programa, pa še to ne 100% pravilno.
Ne pomaga niti hardverski reset s tipko direktno na pinu uc-ja, rezultat je enak. izvede se samo nekaj na začetku programa.
Pomaga samo izklop in ponovni vklop naprave.

Ampak, če namenoma naredim v programu neskončno zanko, ga watchdog pravilno in lepo resetira. Isto lepo deluje, če med normalnim izvajanjem programa pritisnem reset tipko.

Torej, pri (neuspešnem) resetu gotovo še nekaj ostane v nekem spominu, kar mu preprečuje pravilno delovanje... Kaj sem zgrešil, kaj moram popravit..... kako ob resetu zbrisat vse?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14551
Aktiv.: 65.52
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Avg 29, 2023 5:57 pm    Naslov sporočila:   Odgovori s citatom

lojzek je napisal/a:
...

Torej, pri (neuspešnem) resetu gotovo še nekaj ostane v nekem spominu, kar mu preprečuje pravilno delovanje... Kaj sem zgrešil, kaj moram popravit..... kako ob resetu zbrisat vse?



Po resetu se resetirajo I/O registri. Vrednosti v splošno namenskih registrih R0-R31 ostanejo nespremenjene. Enako ostane nespremenjena vrednost v SRAM-u.
Sam vedno na začetku programa počistim (vpišem 0x0) splošno namenske registre in SRAM. Tako vedno vem kaka je vsebina registra, ko ga prvič "vzamem". Izogneš pa se tudi težavi, napačno pobrane vrednosti recimo, ko testiraš ali pišeš program. Lahko se ti recimo zgodi da zadeva super - lepo dela med programiranjem dokler je stvar priključena na napajanje. Ko naslednji dan nadaljuješ - pa žalost - ne dela pa ne veš kaj se je zgodilo. ... ja recimo nekje iz neke lokacije SRAMA nekaj bereš. Potem si spremenil lokacijo vpisa. Podatek se bere stare lokacije vpisuje pa na drugo... Ob izklopu napajanje se vrednosti srama zrušijo....

_________________
lp
Silvo
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 Avg 29, 2023 7:10 pm    Naslov sporočila:   Odgovori s citatom

Silvo, glede na odgovor se zgleda ob resetu res zbrišejo I/O registri - LCD napiše pozdrav. Ostalo ne dela.

Torej, ali moram za rešitev SRAM na začetku programa pobrisat od 0x00 do konca SRAMA (tega res nisem še nikoli počel)?
Ali ni dovolj vse (globalne) spremenljivke na začetku programa postaviti na 0? - ostale lokalne se namreč ob klicu posamezne funkcije postavijo v začetno stanje...? PS, tega zadnjega, gledam v program, res nisem naredil za večino globalnih spremenljivk...
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 Avg 29, 2023 7:48 pm    Naslov sporočila:   Odgovori s citatom

lojzek je napisal/a:
Silvo, glede na odgovor se zgleda ob resetu res zbrišejo I/O registri - LCD napiše pozdrav. Ostalo ne dela.

Torej, ali moram za rešitev SRAM na začetku programa pobrisat od 0x00 do konca SRAMA (tega res nisem še nikoli počel)?
Ali ni dovolj vse (globalne) spremenljivke na začetku programa postaviti na 0? - ostale lokalne se namreč ob klicu posamezne funkcije postavijo v začetno stanje...? PS, tega zadnjega, gledam v program, res nisem naredil za večino globalnih spremenljivk...


Ne, to so rahlo nesmiselne poteze. CPU bo ob reset vektorju pognal prvo inštrukcijo in s tem resetiral statusne registre, r0-rxx registre in podobno.

SRAM-a pa ne uporabljaš, dokler ga ne "nafilaš". Startup skripta (before main) naloži globalne spremenljivke na 0 (.bss sekcija) ali na default vrednosti, če so le-te definirane (.data).

Nedefinirane so samo, če startup skripta ne naredi nič. To pa po default-u v C AVR ni case. Lahko pa je v assemblerju.

_________________
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
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14551
Aktiv.: 65.52
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Avg 29, 2023 7:52 pm    Naslov sporočila:   Odgovori s citatom

Confused Žal sem v C-ju na majavih tleh.

Poskusi najprej obrisat samo splošno namenske registre.
Verjetno obstaja kaka funkcija.

Lahko vstaviš assemblersko kodo:
clr r0
...
...
clr r31

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14551
Aktiv.: 65.52
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Avg 29, 2023 8:46 pm    Naslov sporočila:   Odgovori s citatom

Glede na to, kar je napisal tilz0R, (da inicializacijska C koda registre že pobriše) ti težavo povzroča priklopljena periferija na mikrokontrolerju. Uporabljaš morda kako periferijo na I2c ali 1Wire vodilu?
_________________
lp
Silvo
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: Čet Avg 31, 2023 1:50 pm    Naslov sporočila:   Odgovori s citatom

Malce pozno odgovarjam obema, čas me heca.

Uporabljam obe vodili, IIC in 1 wire.
Ampak ne istočasno oz. s pomočjo prekinitev.
Ko pridem domov, bom v program pogledal, kako imam kaj na začetku.
Kot pravim, globalne spremenljivke na začetku programa nisem vse postavil na 0.
Bom poskusil najprej to. Problem je v tem, da se to zaciklanje zgodi takoooo poredko, da ne morem biti gotov, če sem kaj rešil.

Think Pa v spominu imam, da zna WD reset obdržati nekaj v spominu, da kasneje po WD resetu lahko ugotavljaš, kaj je na stvari. Ampak... v tem primeru bi reset s tipko na reset pinu to rešil.... Če razmišljam še naprej... noben program ki ga testiraš in vmes potem pritisneš reset, nebi štartal od nule Think kar pa vem da ni res Think

Bom poskusil najprej še enkrat isti program naložit v CPU, pa da vidim. Ali pa resetirat še sosednji CPU, s katerim glavni šef komunicira po TWI. Imam krmilnik namenoma v tem zaciklanju že nekaj dni, trenutno ga ne potrebujem v delovni formi.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1712
Aktiv.: 7.71
Kraj: Ig

PrispevekObjavljeno: Čet Avg 31, 2023 9:32 pm    Naslov sporočila:   Odgovori s citatom

I2C je stvar, ki ti lahko blokira delovanje mikrokontrolerja. Če se bus obesi, bo tvoj mikrokontroler obvisel vsakič, ko bo hotel komunicirati preko I2C. Poglej si, kako opraviš reset I2C vodila. Če imaš na I2C vodilu napravo, ki jo lahko resetiraš, izkoristi možnost, drugače pa: ko se zadeva obesi, preveri SDA linijo, če je ta konstantno dol (0V) potem moraš narediti sledeče: SCL pin prekonfiguriraj v navadni GPIO izhodni pin in generiraj 9 CLK ciklov. I2C naprava bi morala nekje vmes sprostiti SDA vodilo. Potem pa lahko narediš dvoje: pin, ki si ga skonfiguriral kot GPIO nazaj prekonfiguriraš v I2C, ali pa s pomočjo watchdoga resetiraš mikrokontroler, da se ponovno skonfigurira in požene kodo.
_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
tilz0R
Član
Član



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

PrispevekObjavljeno: Čet Avg 31, 2023 9:40 pm    Naslov sporočila:   Odgovori s citatom

To tudi objasni, zakaj se to zgodi tudi ob resetu, ampak dela pa, če vzameš napajanje.
_________________
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
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14551
Aktiv.: 65.52
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pet Sep 01, 2023 8:49 am    Naslov sporočila:   Odgovori s citatom

Kot je napisal Gorazd - zelo verjetno ti težavo povzroča periferija na I2c vodilu. Na i2c vodilu so zahtevana "pravila lepega vedenja" za vse udeležene člane. Če je master prehiter, slave potegne SCL na dol - to mora "videt" master. Če master tega ne upošteva bo obvisel pri čakanju na ACK. Če imaš kak pin prost daš gor en led in ga prižigaš, ko master čaka na ACK in ga ugasneš, ko dobi potrditev. Če bo led ostal prižgan, ko ti procesor obvisi boš vedel, da je krivo I2c vodilo.
Kot pišeš imaš gor tudi LCD - domnevam z HD44780 kompatibilnim kontrolerjem. Morda čitaš BUSY FLAG? Tudi tukaj zna zadeva obviset.

_________________
lp
Silvo
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 Sep 06, 2023 6:16 am    Naslov sporočila:   Odgovori s citatom

Tale podaljšan vikend sem imel čisto druge opravke - okrogla obletnica, tako da se nisem s tem čisto nič ubadal in sem pustil zadevo namenoma zaciklano.
Ampak, glej ga zlomka. včeraj sem videl, da je zadeva v ponedeljek zvečer sama od sebe speljala. In to po recimo 14 dneh...
Imam pa dve IIC napravi: uro in IIC-> rs232 vmesnik. Najverjetneje ga ta slednji nekaj pobiksa, ker sem ga jaz sam naredil Smile .
Bom upošteval RGorazdov nasvet in na začetku programa resetiral vodilo.
Pri LCD-ju pa v bistvu ne berem nič, nanj samo pišem.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14551
Aktiv.: 65.52
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sre Sep 06, 2023 10:15 am    Naslov sporočila:   Odgovori s citatom

lojzek je napisal/a:
Tale podaljšan vikend sem imel čisto druge opravke - okrogla obletnica, ....


Vse najboljše sbeer

_________________
lp
Silvo
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: Čet Sep 07, 2023 9:29 am    Naslov sporočila:   Odgovori s citatom

Hvala, ampak žena je praznovala. kar je pa še hujše Smile
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 ... , 27, 28, 29  Naslednja
Stran 28 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: 49 dni


Powered by phpBB © 2001, 2005 phpBB Group