Forum: Mikrocontroller und Digitale Elektronik Rechenzeitproblem im uC ?


von Dennis (Gast)


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

von Oliver (Gast)


Lesenswert?

Dennis schrieb:
> Ideen wären:

Code zeigen.

Oliver

von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

hier die C-Datei, gute Idee ;-)

dennis

von Dennis (Gast)


Lesenswert?

Dennis schrieb:
> hier die C-Datei, gute Idee ;-)
>
> dennis

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

von Düsendieb (Gast)


Lesenswert?

Was macht das Programm ohne den UART Interrupt?

von spess53 (Gast)


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

von Random .. (thorstendb) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.