warum wird _delay_ms() nicht ausgeführt

Gast #2395013
Lesenswert?

Guten Abend,
Ich bin dabei mir eine Software PWM zu bauen.
Beim herumprobieren bin ich auf einen (mir unerklärlichen) Fehler 
gestoßen.

Und zwar wird _delay_ms(1000); in der main Funtkion nicht ausgeführt. 
Bzw bleibt der µC hier hängen!?

Hier der Code:
1
#define F_CPU 16000000UL
2
#define PWMPORT PORTB
3
#define PWMDDR  DDRB
4

5
#include <avr/io.h>
6
#include <util/delay.h>
7
#include <avr/interrupt.h>
8

9
unsigned volatile int pwmMaxWert = 100;
10
unsigned int aktuellerStand = 0;
11
unsigned volatile int sollWert[] = {0, 0, 0, 0};
12

13
void init()
14
{
15
  PWMDDR = 0xFF;    
16
}
17

18
void timerInit()
19
{
20
  TCCR0 |= (1<<CS00); /*Prescaler 0*/
21
  TIMSK |= (1<<TOIE0); /*Gibt das Timer0 Overflow Interrupt frei (inkl. Routine)*/
22
  sei();  /*enabled allgemeine Interrupts*/
23
}
24

25
ISR(TIMER0_OVF_vect)
26
{
27
  for (int i = 0; i < 4; i++)
28
  {
29
    if (aktuellerStand < sollWert[i])
30
      PWMPORT |= (1<<i);
31
    if (aktuellerStand > sollWert[i])
32
      PWMPORT &= ~(1<<i);
33
    if (aktuellerStand > pwmMaxWert)
34
      aktuellerStand = 0;
35
  }  
36
  aktuellerStand++;
37
}
38

39
int main(void)
40
{
41
  init();
42
  timerInit();
43
  
44
  while(1)
45
  {  
46
    _delay_ms(1000);
47
    sollWert[0] = 100;
48
    sollWert[1] = 0;
49
    sollWert[2] = 100;
50
    sollWert[3] = 0;    
51
  }
52
}

Die Hardware passt, wenn ich ein einfaches Programm schreib welches mir 
nacheinander die Ports setzt, dann funktioniert alles.
Gast #2395072
Lesenswert?

.... und weiter:
"When the user request delay which exceed the maximum possible one,
_delay_ms() provides a decreased resolution functionality. In this
mode _delay_ms() will work with a resolution of 1/10 ms, providing
delays up to 6.5535 seconds (independent from CPU frequency)."
#2395127
Lesenswert?

PS: Ausserdem könnte Unrolling die ISR ungemein beschleunigen. Entweder 
macht das der Compiler mit -O2 oder -O3 von selbst - oder du zu Fuss.

Soll heissen: Die 4 Fälle in der ISR nicht als Schleife programmieren, 
sondern einzeln. Dynamische Shifts sind AVRs sehr unangenehm, auch 
Array-Indizes sind nicht so billig wie sie aussehen.
Gast #2395145
Lesenswert?

Alles klar, danke für die Antworten, werd mich mofgen gleich mal um die 
Optimierung
 kümmern. Ich nehm stark an dass der uC die gNze Zeit nur mit der ISR 
beschäftigt ist.
Danke für die Antworten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren