Rechenzeitproblem im uC ?

Gast #2299371
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
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
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.