Rechenzeitproblem im uC ?

Gast #2299371
Lesenswert?

Hallo uC-Community,

ich habe mit eurer Hilfe ein Programm für eine PWM-Abtastung erstellt.
(Topic vom 27.06.11: Beitrag "Erfassung PWM Signal und verarbeiten" )
Das Programm läuft soweit ganz gut,vielen Dank noch mal an alle Helfer 
;), nur leider ist jetzt ein weiteres komplexes Problem hinzugekommen.

Und zwar habe ich natürlich seit der Entwicklung der Software weitere
Softwareteile hinzugefügt. Jetzt habe ich folgendes Problem:
Ich habe meine PWM-Abtastung(die PWM 1kHz aus einem Steuergerät) durch
den Timer0 realisiert. Dadurch habe ich das Verhaeltnis errechnet dieses
wiederum für ein normales PWM-Signal für einen BL-Motor verwendet wird.
Nun bin ich an einer fortgeschrittenen Stelle, in der ich mehrere
Programmteile zusammengefügt habe. Durch das Gesamtprogramm verändert
sich jetzt mein Programmzyklus(oder auch Abtastzeit) meines 
Programmdurchlaufs.
Leider weiß ich nicht warum sich diese Zeit ändert, logisch wäre mir 
durch die vielen Rechenaufgaben des Gesamtprogramms, dachte aber damit 
hat der uC keine Probleme verwende einen AtMega644,20Mhz,programmiere in 
C). "Nachgwiesen" habe ich die Veränderung einfach durch ein Osci. Ohne 
den "kritischen Programmteil" benötigt mein Programm 7,52us mit dem 
"kritischen Programmteil" 320us.

Kann das Auswirkungen auf meine Timer haben, das die irgendwie nicht zu 
ende laufen oder mehrere OVF haben ?? ich habe keine Ahnung...

Auf jeden Fall bekomme ich dadurch, obwohl ich die PWM am Steuergerät 
nicht ändere (sagen wir 5%DutyCycle) jeden Zyklus ein anderes 
PWM-Verhältnis (meist auch über 100% -.-) dadurch wird auch mein Motor 
extrem belastet, schwingt und quietscht ...

So an dieser Stelle brauche ich eure Hilfe habe keinen besonderen
Lösungsansatz.

Ideen wären:
2 uC verwenden, den einen für die Berechnung des PWM-Signal aus dem
Steuergerät, den anderen für die Ausführung des restlichen Programms.
Sonst fällt mir nichts mehr ein, danke für eure Hilfe..

So ein langer Text ich hoffe ich konnte das technische Problem 
einigermaßen gut beschreiben wenn ihr meinen C-Code benötigt einfach 
posten.

dennis
Gast #2299794
Lesenswert?

HI

>( gibt es eine möglichkeit den C-Code besser anzeigen zu lassen, habe
>ihn eigentlich schöner formatiert ? ansonsten sorry, ist blöd
>anzuschauen -.- )

Ja. Finger weg von der Tab-Taste. Am besten du klebst ein paar 
Reißzwecken mit der Spitze nach oben drauf.

MfG Spess
Persönliche Seite #2299857
Lesenswert?

Ho,

die ganzen (0 << X) bringen dir übrigens gar nix in Verbindung mit |=, 
und in = sind sie bestenfalls überflüssig.
1
TCCR0A |= (0<<COM0A1) | (0<<COM0A0) | (0<<WGM01) | (0<<WGM00);  // T/C0 Control Register A: normaler Modus
Schlimmstenfalls bleiben beriets gesetzte 1er im Register stehen.

Zum Löschen von Bits geht
1
DDRA &= ~(1<<PIN0);
besser.

Also: erst löschen, dann setzen, wenn es um einzelbits geht:
1
DDRA &= ~(1 << PIN0);
2
DDRA |=  (1 << PIN1);

Oder als ganzes setzen (nicht "verwendete" werden ja automatisch zu 
null:
1
DDRA = (1 << PIN0) | (1 << PIN1);

Ansonsten: Im Editor einstellen, dass er TABs durch (2 oder 4) 
Leerzeichen ersetzen soll. Dann kannst auch wunderbar mit TAB einrücken.

Sowas idR in mehrere Zeilen aufteilen:
1
if (m < 1) { 
2
  TCNT0 = 0x00; i=0; start_algo(); 
3
}

Wegen der deklaration verkürzt sich dieser Ausdruck sogar auf:
1
volatile unsigned char m       = 0;
2
...
3
if (m) { 
4
  TCNT0 = 0x00; i=0; start_algo(); 
5
}

Im ganzen:
Muss wirklich alles global deklariert werden? Schaut ja aus wie QBASIC 
:-)

Ich hab mal nen Part auf die schnelle umgeschrieben & formatiert, wie 
ich es schreiben würde. Dabei hab ich auch die if(a >= x) rausgeworfen. 
Müsste man mal schauen, was der compiler draus macht, auf nem kleinen 
AVR bringts ev. was.
Nicht perfekt aber ne Anregung :-)
1
#define MAGIC_NUMBER  0x0f6d    // hier latürnich was sinnvolles einbauen *g*
2

3
/*** INTERRUPT TIMER2 ***/
4
ISR(TIMER2_OVF_vect)
5
{
6
  // ggf., um globales Zeug zu vermeiden, falls nur hier benötigt:
7
  // static unsigned int counter = 0, s_algo = 0;
8

9
  counter++;      // counter zaehlt die OVFs
10
  s_algo++;
11

12
/* Startalgorythmus des BL Motors */
13
  if(s_algo > 3) {    
14
    s_algo = 0;   
15
    
16
    if(n != 1) {
17
      start = OCR1A;
18
      OCR1A++;      
19
    }
20
  }
21

22
  if(start > MAGIC_NUMBER - 1) {
23
    n     = 1;
24
    OCR1A = MAGIC_NUMBER;    
25
  }
26
}
27

28
// ISR-Recieve Complete
29
ISR( USART0_RX_vect )
30
{
31
  char c;
32

33
  c = uart_getc();
34
  
35
  switch (c)
36
  {
37
    case '1':
38
      uart_putc(sen_rps);      //if(n<=>m){...}
39
      break;
40

41
    case '2':
42
      uart_putc(soll_wert);
43
      break;
44

45
    case '3':
46
      uart_putc(ausgang);
47
      break;
48
    
49
    default:
50
      break;
51
  }
52
}

VG,
/th.

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