ZlyDotyk:

M

Marcin1326

Guest
Hej,
Jeg ønskede at gøre sent i programmet for ATmega8.Brugt pausen, men det simuleringsprogram i AVR Studio, fremgår det, at programmet efter omkring 260 mikro-sekunder, nulstilles (vender tilbage til main ()-funktion).Ikke på grund af jet watchdogiem snarere fordi han er handicappet.Er der nogen kan fortælle mig, hvorfor dette sker?Åh, selvfølgelig, er udarbejdet programmet ikke fungerer ordentligt, og den "fysiske" processor.

Program:
Kode:# Include <inttypes.h>

# <stdio.h>

# Include <avr/io.h>

# Include <avr/interrupt.h>//----------------------------------------------uint8_t podtryb;

flygtige uint16_t tid;//-------------------------------------------void opoznienie8ms (uint16_t t);

podlacz_koncowke_pwm void (void) / / opretter forbindelse til de udstationerede spids OC0A PORT

odlacz_koncowke_pwm void (void) / / skar spidsen af OC0A PORT//--------------------------------------------void opoznienie8ms (uint16_t t)

(

time = t;

for (; tid! = 0;)

(

PORTD | = 1 <<7 / / Efter et par løber en for-løkke er nulstillet (hoppe til main () funktion) !!!!!!!!!!!!!!!!!

PORTD & = ~ (1 <<7);

)

)podlacz_koncowke_pwm void ()

(

TCCR1A | = 1 <<COM1A1;

)odlacz_koncowke_pwm void ()

(

TCCR1A & = ~ (1 <<COM1A1) & ~ (1 <<COM1A0);

)int main (void)

(

/ / Port Configuration

DDRB = 0b00000110;

DDRD = 0b11100000;/ / Indstil PWMa

TCCR1A | = 1 <<WGM10 / / FastPWM 8BIT

TCCR1B | = 1 <<WGM12;TCCR1B | = 1 <<CS11; / / Divide 8

TIMSK | = 1 <<OCIE1A;OCR1A = 120;/ / Configure counter overflow interrupt

TCCR0 | = 1 <<CS02; / / kløft 256

TIMSK | = 1 <<TOIE0 / / låse overflow interruptsei (); / / låse den globale Interrupt//=============== PROGRAM RELEVANTE =====================

for (;;)

(PORTB & = ~ (1 <<2);

podlacz_koncowke_pwm ();opoznienie8ms (100);odlacz_koncowke_pwm ();

PORTB & = ~ (1 <<1);

PORTB | = 1 <<2;opoznienie8ms (100);)

return 0;

)/ / Interrupt forekommende på ca 8,1 ms og det er den pause skaber forsinkelserSIGNAL (SIG_OVERFLOW0)

(

if (tid! = 0) - tid;

)
 
Gjort det muligt at stoppe "Timer Sammenlign (OCIE1A), som ikke håndteres.
 
ZlyDotyk: Det hjalp.Thanks you big!Jeg ved ikke, hvordan jeg glip af det!:)
 
Marcin1326: Ved den måde, tænker giver atomare adgang til variablen "tid" - hvis posten mellem den første og den anden byte vil være forstyrrelser, kan det ske forskellige ting (her, ved de fleste, andre end den forventede forsinkelse).Såsom at komme ind på "tid" kan løse hvert atom (undtagen SREG, CLI (), drift og restaurering af SREG), vil således fortsat blokerer for læseproblemer og sandsynligvis give bedre informere dem om flaget byte er nulstillet til variablen "tid" eller endda den samme flag blok til at stoppe er ikke blevet opdateret variabel "tid".Dette er ikke en fatal fejl, det er sandt, men det kan forårsage små, spontane ændringer i latens.
 
BoskiDialer: faktisk var ret hyppige ændringer i ventetid, men den variable ændret til 8bitową tid, og nu alt er OK:).Og hvordan atomare adgang til de variable?
 
Nukleare adgang til de variable, som jeg skrev: "gemme SREG, CLI (), drift og restaurering af SREG"
Kode:

unsigned char old_sreg = SREG;

CLI ();

/ / Nogle instruktioner

SREG = old_sreg;
 
Det avr-libc er makroer til atomare operationer:Kode:

# Include <util/atomic.h>ATOMIC_BLOCK (ATOMIC_RESTORESTATE) (

/ * Gør noget * /

)
 
ikke nok
Kode:

CLI ();

gøre noget, f.eks 16bitach

...

sei ();
 

Welcome to EDABoard.com

Sponsor

Back
Top