|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Jan Član
Pridružen-a: Sob 10 Jun 2006 14:19 Prispevkov: 313 Aktiv.: 1.44 Kraj: Dolenjska
|
Objavljeno: Ned Apr 16, 2023 12:44 pm Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Pon Apr 17, 2023 1:20 pm Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Tor Avg 29, 2023 4:35 pm Naslov sporočila: |
|
|
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 |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14551 Aktiv.: 65.52 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Avg 29, 2023 5:57 pm Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Tor Avg 29, 2023 7:10 pm Naslov sporočila: |
|
|
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 |
|
|
tilz0R Član
Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 6.24 Kraj: Črnomelj
|
Objavljeno: Tor Avg 29, 2023 7:48 pm Naslov sporočila: |
|
|
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 |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14551 Aktiv.: 65.52 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Avg 29, 2023 7:52 pm Naslov sporočila: |
|
|
Ž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 |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14551 Aktiv.: 65.52 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Avg 29, 2023 8:46 pm Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Čet Avg 31, 2023 1:50 pm Naslov sporočila: |
|
|
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.
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 kar pa vem da ni res
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 |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1712 Aktiv.: 7.71 Kraj: Ig
|
Objavljeno: Čet Avg 31, 2023 9:32 pm Naslov sporočila: |
|
|
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 |
|
|
tilz0R Član
Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 6.24 Kraj: Črnomelj
|
Objavljeno: Čet Avg 31, 2023 9:40 pm Naslov sporočila: |
|
|
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 |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14551 Aktiv.: 65.52 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pet Sep 01, 2023 8:49 am Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Sre Sep 06, 2023 6:16 am Naslov sporočila: |
|
|
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 .
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 |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14551 Aktiv.: 65.52 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Sep 06, 2023 10:15 am Naslov sporočila: |
|
|
lojzek je napisal/a: |
Tale podaljšan vikend sem imel čisto druge opravke - okrogla obletnica, .... |
Vse najboljše _________________ lp
Silvo |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Čet Sep 07, 2023 9:29 am Naslov sporočila: |
|
|
Hvala, ampak žena je praznovala. kar je pa še hujše |
|
Nazaj na vrh |
|
|
|
|
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
|