RE: Záhada v C

Pavel Hudecek edizon na seznam.cz
Sobota Leden 23 22:39:28 CET 2021


Ono to je takhle jen provizorně, že to nefungovalo plánovaným způsobem. Normálně by měl adSync nastat až po té, co celý cyklus 16x proběhne, v lokálním poli obsluhy přerušení budou v každém prvku součty 16 vzorků. Tehdy se to nakopíruje z lokálního pole do adDataRaw a nahodí adSync. Takže pak bude zas spoustu času na zpracování. Jenže ono to právě záhadně nefunguje, přestože byly jednotlivé části procesu zkopírovány z projektu, který normálně funguje a zákazníci si nestěžují.

PH

Od: as5s
nepoze byt problem v synchronizacii?
nemoze sa stat ze sa prerusenie vykona viac krat ono by vam to adSync drzalo na 1 ale index by sa zvysil.
Miro
On 23. 1. 2021 22:11, Pavel Hudecek wrote:
Hvězdičky a liché prázdné řádky přibyly někde mezi Vámi a HW serverem. Mě to přišlo jak jsem odeslal. Jen tečky na začátku odsazených řádků jsou moje, mnoho mailových klientů jinak zruší odsazení.
 
if (++ind>=AD_chCount) ind=0;
Je praktické, protože přičítací operace, podmínka i reset pohromadě, což zvyšuje přehlednost a snižuje šanci, že člověk mezi to něco náhodou strčí. Závorky nechybí. Pravidla jazyka požadují buď jeden příkaz, nebo v závorce příkazů víc. Třeba CodeVision to přesně takhle dokonce dělá v předgenerovaném kódu. Typicky právě v obsluhách přerušení:-)
 
Preventivně jsem to zkusil změnit do klasické podoby i se závorkami, ale nepomohlo. 
 
PH
 
Od: Michal Gregor
To by chtelo videt cely zdrojak, ale spise to zkusit v debugu.
 
- Za *if (++ind>=AD_chCount) ind=0;* chybi slozene zavorky {}
- Na jednom radku ma byt jeden prikaz - "if (++ind" je prasarna
- Co ty hvezdicky ve vypisu? *adDataRaw[ind]=(uint32_t)ind;* To je chyba 
mailu?
 
Vyplati se psat program poctive, i tak kratky a jednoduchy. Usetri to 
spoustu boleni hlavy v budoucnu. A taky hroomadu casu.
 
Michal Gregor
 
 
 
Dne 23.01.2021 v 20:14 Pavel Hudecek napsal(a):
> Dobrý den všem,
> 
> ATtiny816, Atmel Studio
> 
> volatile uint32_t               adDataRaw[AD_chCount];
> 
> uint32_t                              adData[AD_chCount];
> 
> ISR (ADC0_RESRDY_vect) { // 37,1 kHz / 16 ======
> 
> .              static uint8_t     ind=0;
> 
> .
> 
> .              //adDataRaw[ind]=(uint32_t)ADC0_RES;
> 
> . *adDataRaw[ind]=(uint32_t)ind;*
> 
> .
> 
> . *if (++ind>=AD_chCount) ind=0;*
> 
> .              ADC0_MUXPOS=AD_chFirst+ind;
> 
> .
> 
> .              adSync=1;
> 
> .              ADC0_INTFLAGS=1;
> 
> }
> 
> Ve funkci cekej je mj. (i je lokální int):
> 
> if (adSync==1) { // -------------------------
> 
> .              adSync=0;
> 
> .
> 
> . *for (i=0; i<AD_chCount; i++) adData[i]=adDataRaw[i];*
> 
> }
> 
> V mainu je while(1) a tam mj. (n je lokální uint32_t):
> 
> cekej(1000);
> 
> for (n=0; n<AD_chCount; n++) {
> 
> .              cislo((uint32_t)adData[n]); text("/");
> 
> .              cislo((uint32_t)adDataRaw[n]); text(" ");
> 
> }
> 
> UART_crlf;
> 
> A z terminálu leze:
> 
> 5/5 6/1 2/2 3/3 4/4 0/5 1/6
> 
> 5/5 6/1 2/2 3/3 4/4 0/5 1/6
> 
> 0/5 6/1 2/2 3/3 4/4 0/5 1/6
> 
> 5/5 1/1 2/2 3/3 4/4 0/5 1/6
> 
> Proč z terminálu neleze
> 
> 0/0 1/1 2/2 3/3 4/4 5/5 6/6
> 
> ???
> 
> Díky,
 


_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210123/ade546c6/attachment.html>


Další informace o konferenci Hw-list