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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.