Forum: Mikrocontroller und Digitale Elektronik Lauflicht KITT


von Marten M. (mcgonahy148)


Lesenswert?

Tach...ich bombadier förmlich das Forum momentan, scheisse wenn man 
Urlaub hat und heiss auf uController ist. :-)

Ich hab schon zwei Threats in den Fingern gehabt zu dem Thema, auch bei 
googgle. Jedoch finde ich immer nur Assembler-Geschichten, ich möchte es 
in C programmieren.

Wobei wir bei der Frage sind, ein Lauflicht hab ich schon hinter mir, 
kein Thema. So, bei PWM bin ich gerade angelangt, und mein Atmega16 hat 
ja 4 PWM-Kanäle. Momentan hab ich nur eine angeschlossen. Bei dem 
Knightrider Lauflicht, glimmen ja immer ein paar LED´s nach bzw. bei 
langen Lichtleisten ziemlich viele. Das ist doch dann mit einem 4-Kanal 
PWM nicht mehr machbar?

Ich würds mir so vorstellen, ein Lauflicht normal programmieren (harte 
Lichtübergänge von einer LED), anschließend mit PWM die nachleuchtenden 
LEDs mit PWM einschalten und helligkeit reduzieren, dass mit 
verschiedenen stufen. Kann ich also nur 4 LEDs nachglimmen lassen?

von kermit der frosch (Gast)


Lesenswert?

wenn das fest sein soll, dann mach das einfach über kondensator und 
widerstände

von Mh. M. (mhm)


Lesenswert?

So direkt mit Hardware-PWM kannst du in der Tat nur vier LEDs mit PWM 
steuern. Verwendest du jedoch eine Soft-PWM kannst du theoretisch alle 
Pins per PWM steuern, abhängig von der Frequenz deines Controllers und 
der Effizienz deiner Soft-PWM Routine. Einfach mal in dem Artikel hier 
schauen, da wird recht gut beschrieben wie man sowas in C macht: 
http://www.mikrocontroller.net/articles/Soft-PWM

von Jonas F. (wuschelkuchen)


Lesenswert?


von Marten M. (mcgonahy148)


Lesenswert?

kermit der frosch schrieb:
> wenn das fest sein soll, dann mach das einfach über kondensator und
> widerstände

Ja hast schon recht, aber ich möchte mich ja etwas mit dem uController 
beschäftigen, an dem hab ich momentan eben nur ein paar leds dranhängen, 
daher die Überlegung

von Marten M. (mcgonahy148)


Lesenswert?

Mh. M. schrieb:
> So direkt mit Hardware-PWM kannst du in der Tat nur vier LEDs mit PWM
> steuern. Verwendest du jedoch eine Soft-PWM kannst du theoretisch alle
> Pins per PWM steuern, abhängig von der Frequenz deines Controllers und
> der Effizienz deiner Soft-PWM Routine. Einfach mal in dem Artikel hier
> schauen, da wird recht gut beschrieben wie man sowas in C macht:
> http://www.mikrocontroller.net/articles/Soft-PWM

Ok, danke. Ich weiss zu meinem jetzigen Unterschied noch nicht den 
Unterschied zwischen einer soft und einer hardware-PWM...

Jonas R. schrieb:
> Als Anregung:
> http://www.evilmadscientist.com/article.php/larsonkit
> bzw.
> http://www.evilmadscientist.com/article.php/laaaaa...
>
> grüssse
> w.

Dankeschön..

von Marten M. (mcgonahy148)


Lesenswert?

1
OCR0B = *(pwmtable_8D+tmp)

Der "*" heisst was noch gleich in C?

von Karl H. (kbuchegg)


Lesenswert?

Marten Mcgonahy schrieb:
>
1
OCR0B = *(pwmtable_8D+tmp)
>
> Der "*" heisst was noch gleich in C?

Dereferenzieren.

Das Statement ist identisch zu

   OCR0B = pwmtable_8D[ tmp ];

nur dass da jemand den Hacker raushängen lassen wollte und es daher 
lieber 'kryptisch' geschrieben hat.


Ansonsten: C-Buch

von Marten M. (mcgonahy148)


Lesenswert?

:-) Gut, mit den "[]" find ich persönlich schöner...


Danke dir!

von Marten M. (mcgonahy148)


Lesenswert?

Was ich noch nicht verstehe ist, warum muss ich

zB
1
 
2
    for(tmp=255; tmp>=0; tmp--){
3
      OCR1A = pgm_read_word(pwmtable_16+tmp);
4
      my_delay(delay);
5
    }

schreiben und kann nicht
1
 
2
    for(tmp=255; tmp>=0; tmp--){
3
      OCR1A = pwmtable_16[tmp];
4
      my_delay(delay);
5
    }

schreiben? Es geht darum ja lediglich darum die Werte aus der Tabelle zu 
lesen und ins compare-register zu schreiben. Funktioinert aber nicht :-)

von Stefan B. (stefan) Benutzerseite


Lesenswert?


von Marten M. (mcgonahy148)


Lesenswert?

Die is global im Programm definiert...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Marten Mcgonahy schrieb:

> Die is global im Programm definiert...

Richtig, aber wo stehen die Bytes physikalisch im µC?
Die Definition gibt das an.

von Karl H. (kbuchegg)


Lesenswert?

Marten Mcgonahy schrieb:
> Die is global im Programm definiert...

Das ist nicht die Frage,
Die Frage ist:
Ist sie im SRAM oder ist sie im Flash?

Ist sie im SRAM (default), dann kann man mittels  pwmtable_16[tmp] auf 
den Tabelleninhalt zugreifen.
ISt sie im Flash, dann muss man eine Funktion bemühen, der man sagt von 
welcher Adresse im Flash man ein Byte lesen möchte.

Default ist in der C-Programmierung immer: Alles liegt im SRAM (bis auf 
das eigentliche Programm, das liegt im Flash). Nur wenn das nicht so 
ist, braucht man Sonderlösungen.

von Marten M. (mcgonahy148)


Lesenswert?

Ui..ihr fragt mich sachen. Ähm, die Tabelle is folgendermaßen angelegt:
1
uint16_t pwmtable_16[256] PROGMEM = {0, 1, 1, 1, 1, 1, 1, 1, 1

also so wie sich das programm verhält, liegt sie im Flash-speicher? Wie 
kann ich definierren ob im Flash oder SRAM Bereich? Fakt ist,
1
pwmtable_16[tmp]
 funktioniert nicht, nur mit dieser seltsamen pgmreadword-funktion.

Hat das auch was mit dem Thema der Dereferenzierung *(pwmtable_16+tmp) 
zu tun?

von Marten M. (mcgonahy148)


Lesenswert?

Marten Mcgonahy schrieb:
> PROGMEM = {0, 1,

ICh schätze das es was mit dem zu tun hat wo die Tabelle abgelegt wird?!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Richtig!

Die fetten 256 Bytes für eine Tabelle im SRAM sind bei kleinen AVRs 
kostbarer als der Platz im Flash.

Konstante Daten so wie im Bsp. die Tabelle speichert man deshalb gerne 
ausschliesslich im Flash, mit dem "Haken", dass man spezielle 
Lesefunktionen dafür braucht.

von Marten M. (mcgonahy148)


Lesenswert?

Ja, wenn ich das PROGMEM lösche und unten dann mit pwmtable[xx] arbeite, 
dann funktioniert es. Ebenfalls mit der dereferenzierung *, ist ja 
gleichbedeutend wie Karl Heinz angedeutet hat.

ABer wg. dem Verständnis, wann leg ich es in den Flash/Sram Bereich?

PROGMEM=Flash,
????=SRAM?

Flash is schneller wie sram?

von Marten M. (mcgonahy148)


Lesenswert?

Stefan B. schrieb:
> Die fetten 256 Bytes für eine Tabelle im SRAM sind bei kleinen AVRs
> kostbarer als der Platz im Flash.

Ja aber ich dachte das Programm wird ohnehin in den Flashspeicher 
gebracht?

von Karl H. (kbuchegg)


Lesenswert?

Marten Mcgonahy schrieb:
> Ja, wenn ich das PROGMEM lösche und unten dann mit pwmtable[xx] arbeite,
> dann funktioniert es. Ebenfalls mit der dereferenzierung *, ist ja
> gleichbedeutend wie Karl Heinz angedeutet hat.
>
> ABer wg. dem Verständnis, wann leg ich es in den Flash/Sram Bereich?
>
> PROGMEM=Flash,
> ????=SRAM?

indem du nichts angibst.

Wie schon gesagt:
Default ist, dass alles was keine "Sonderbehandlung" hat immer im SRAM 
liegt.

> Flash is schneller wie sram?

Nein.
Du hast mehr Flash als SRAM

von Karl H. (kbuchegg)


Lesenswert?

Marten Mcgonahy schrieb:

> Ja aber ich dachte das Programm wird ohnehin in den Flashspeicher
> gebracht?

Wir reden doch nicht vom Programm.
Wir reden davon, wo die Daten abgelegt sind, die dein Programm 
verwurschtet!

von Marten M. (mcgonahy148)


Lesenswert?

Ok, jetzt bin ich definitiv gescheiter :-)

Nur bei den Sonderfunktionen und Definitionen blick ich noch ins Dunkle, 
also mit PROGMEM und der FUnktion "pgm_read_word", nicht dass mir sowas 
öfters über den Weg läuft und weiss nicht woher das kommt.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Marten Mcgonahy schrieb:

> Ja aber ich dachte das Programm wird ohnehin in den Flashspeicher
> gebracht?

Richtig.

Du fragst nach den Innereien, wie ein C-Programm zur Laufzeit gestartet 
wird.

Der Startcode deines C-Programms (der Teil der vor main() ausgeführt 
wird) kopiert initialisierte Variablen aus dem Flash in das anfangs 
leere SRAM. Aber PROGMEM gekennzeichnete Daten (d.h. Daten im Flash) 
werden nicht kopiert, verbrauchen also keinen SRAM Platz!

von Marten M. (mcgonahy148)


Lesenswert?

Warum blinkt die LED beim "einfaden so komisch"?
1
  TCCR1A = (1<<COM1A1) | (1<<COM1A0) |(1<<WGM10); 
2
  TCCR1B = (1<<WGM12);
3
  TCCR1B = (1<<CS11)|(1<<CS10);
4
 } 
5
 
6
void fade(void) 
7
{
8
  unsigned char tmp;
9
 
10
  for(tmp=0; tmp<=255; tmp++){
11
    OCR1A = *(pwmtable+tmp);    //LED einfaden
12
    _delay_ms(50);
13
  }
14
 
15
  _delay_ms(1000);
16
    
17
  for(tmp=0; tmp<=255; tmp++){
18
    OCR1A = *(pwmtable+255-tmp); //LED ausfaden
19
    _delay_ms(50);
20
  }
21
   _delay_ms(1000);
22
23
24
int main(void)
25
{
26
  init_fade();
27
 
28
  while(1)
29
  {
30
    fade();
31
  }
32
}

Es flackert beim Einfaden, aber dann beim Ausfaden gehts...ähm, überseh 
ich was?

von Karl H. (kbuchegg)


Lesenswert?

Der dürfte aus dem einfaden überhaupt nie rauskommen

  for(tmp=0; tmp<=255; tmp++){

das ist mit
  unsigned char tmp;

eine Endlosschleife.
tmp <= 255 ist für alle überhaupt möglichen tmp-Werte immer erfüllt. tmp 
kann gar keinen Wert annehmen, so dass diese Schleife jemals verlassen 
würde.

von Marten M. (mcgonahy148)


Lesenswert?

Gibt es eigentlich ein C-Buch zu empfehlen dass im Inet kostenlos zur 
Verfügung steht? Ok...wiki...aber gibts noch was?

von Jochen F. (jamesy)


Lesenswert?

KITT sollte das doch in der Datenbank haben! ;-)

von Marten M. (mcgonahy148)


Lesenswert?

Ja schon, aber Kitt wird momentan repariert, und da ich erst bei seinem 
Lauflicht bin, dauert es wohl noch eine Zeit lang bis sein Steuergerät 
fertig is ;-)

von Marten M. (mcgonahy148)


Lesenswert?

Hallo nochmals...

zum Thema KITT Lauflicht: Die LED´s die der "HauptLED" nachlaufen, 
glimmen die eigentlich aus oder sind die auf statisch feste 
Helligkeitswerte programmiert?

Ich habs jetzt mal ganz einfach mit "statischen Werten" versucht und so 
schlecht wirkt es garnicht.
1
/*
2
KITT-Lauflicht mit Hilfe von Soft-PWM realisieren
3
*/
4
 
5
 
6
#define F_CPU 16000000L                  // Systemtakt in Hz
7
#define F_PWM 50                        // PWM-Frequenz in Hz
8
#define PWM_STEPS 255                   // PWM-Schritte pro Zyklus(1..255)
9
#define PWM_PORT PORTA                  // Port für PWM
10
#define PWM_DDR DDRA                    // Datenrichtungsregister für PWM
11
#define blinktime 300          // Blinkzeit der Laufled LED1
12
#define hell_max 150          // maximale Helligkeit LED1
13
#define hell_s5 130
14
#define hell_s5 100
15
#define hell_s5 80
16
#define hell_s5 60
17
#define hell_s5 40
18
#define hell_s5 20
19
 
20
// ab hier nichts ändern, wird alles berechnet
21
 
22
#define T_PWM (F_CPU/(F_PWM*PWM_STEPS)) // Systemtakte pro PWM-Takt
23
 
24
#if (T_PWM<(152+5))
25
    #error T_PWM zu klein, F_CPU muss vergrösst werden oder F_PWM oder PWM_STEPS verkleinert werden
26
#endif
27
 
28
#if PWM_STEPS > 255
29
    #error PWM_STEPS zu gross
30
#endif
31
 
32
// includes
33
 
34
#include <stdint.h>
35
#include <string.h>
36
#include <avr/io.h>
37
#include <avr/interrupt.h>
38
#include <delay.h>
39
 
40
// globale Variablen
41
 
42
volatile uint8_t pwm_setting[8];                    // Einstellungen für die einzelnen PWM-Kanäle
43
 
44
// Timer 1 Output COMPARE A Interrupt
45
 
46
ISR(TIMER1_COMPA_vect) {
47
    static uint8_t pwm_cnt=0;
48
    uint8_t tmp=0, i=0, j=1;
49
 
50
    OCR1A += (uint16_t)T_PWM;
51
 
52
    for (; i<8; i++) {    
53
      if (pwm_setting[i] > pwm_cnt) tmp |= j;
54
            j<<=1;
55
  }
56
    PWM_PORT = tmp;                         // PWMs aktualisieren
57
    if (pwm_cnt==(uint8_t)(PWM_STEPS-1))
58
        pwm_cnt=0;
59
    else
60
        pwm_cnt++;
61
}
62
 
63
int main(void) {
64
 
65
    // PWM einstellen
66
    
67
    PWM_DDR = 0xFF;         // Port als Ausgang
68
    
69
    // Timer 1 OCRA1, als variablem Timer nutzen
70
 
71
    TCCR1B = 1;             // Timer läuft mit vollem Systemtakt
72
    TIMSK |= (1<<OCIE1A);   // Interrupt freischalten
73
 
74
    sei();                  // Interrupts gloabl einschalten
75
 
76
77
78
/*********************************************************************/
79
const uint8_t LED1_t1[8]={hell_max, 0, 0, 0, 0, 0, 0, 0};
80
const uint8_t LED1_t2[8]={100, hell_max, 0, 0, 0, 0, 0, 0};
81
const uint8_t LED1_t3[8]={50, 100, hell_max, 0, 0, 0, 0, 0};
82
const uint8_t LED1_t4[8]={10, 50, 100, hell_max, 0, 0, 0, 0};
83
const uint8_t LED1_t5[8]={0, 10, 50, 100, hell_max, 0, 0, 0};
84
const uint8_t LED1_t6[8]={0, 0, 10, 50, 100, hell_max, 0, 0};
85
86
87
88
 
89
 while(1)
90
  {
91
 
92
    
93
  //Haupt-LED=LED1 Ablauf
94
  for (int i=0;i<=5;i++)
95
    {
96
      memcpy(pwm_setting, LED1_t1, 8);
97
      _delay_ms(blinktime);
98
      memcpy(pwm_setting, LED1_t2, 8);
99
      _delay_ms(blinktime);
100
      memcpy(pwm_setting, LED1_t3, 8);
101
      _delay_ms(blinktime);
102
      memcpy(pwm_setting, LED1_t4, 8);
103
      _delay_ms(blinktime);
104
      memcpy(pwm_setting, LED1_t5, 8);
105
      _delay_ms(blinktime);
106
      memcpy(pwm_setting, LED1_t6, 8);
107
      _delay_ms(blinktime);
108
    
109
      }
110
  
111
  
112
  }
113
 
114
 
115
    return 0;
116
}

Meine Fragen sind nun:

a.) Wie funktioniert noch gleich der Zugriff auf ein Element eines 
Vektors, denn hier is alles mit Hand geschrieben (hell_max) in den 
Vektorelementen. Wie kann ich über die Laufvariable "i" des 
for-Konstrukts auf die Elemente zugreifen?

b.) Wie würde ich ein "Nachglimmen" realisieren? Da müsste ich jedes 
einzelne Vektorelement noch in XXX Stufen abdimmen, sprich die 
Software-PWM mit z.B. 64 Helligkeitsstufen und einem Delay dazwischen. 
Wird das dann zeitlich nicht etwas kritisch?

c.) Wie berechne ich die genaue Zeit wieviel ms bzw. us er in den 
Interupt springt? Is zwar irgendwo angegeben, aber ohne zu wissen 
wieviel Rechenschritte in dem ISR sind kann ich es nicht oder?


Hat wer Ideen?


Schönen Gruß,
MG

von Karl H. (kbuchegg)


Lesenswert?

Marten Mcgonahy schrieb:

> a.) Wie funktioniert noch gleich der Zugriff auf ein Element eines
> Vektors, denn hier is alles mit Hand geschrieben (hell_max) in den
> Vektorelementen. Wie kann ich über die Laufvariable "i" des
> for-Konstrukts auf die Elemente zugreifen?

Dazu müsstest du LED1_t1 bis LED1_t6 aufgeben und dir dafür ein 2D-Array 
machen.

Oder du gehst das ganze etwas intelligenter an und gibst die LED1_t1 
(und Konsorten Array) komplett auf:

Du hast nur 1 LED die auf hell_max steht. Wenn diese Led um 1 Position 
weiterwandert, dann setzt du in pwm_setting den dazugehörenden Eintrag 
auf hell_max und alle anderen halbieren sich zb in der Helligkeit, 
sofern sie noch größer als 0 sind.

> c.) Wie berechne ich die genaue Zeit wieviel ms bzw. us er in den
> Interupt springt? Is zwar irgendwo angegeben, aber ohne zu wissen
> wieviel Rechenschritte in dem ISR sind kann ich es nicht oder?

Die Anzahl der Rechenschritte hat darauf erst mal keinen Einfluss. Du 
musst dir ausrechnen, wie oft der Timer mit dein eingestellten 
Timer-Werten in die Situation kommt, einen Interrupt auszulösen.

von Falk B. (falk)


Lesenswert?

@  Marten Mcgonahy (mcgonahy148)

Lies mal was über Netiquette. Lange Quelltexte gehören in den 
Anhang.

>Vektorelementen. Wie kann ich über die Laufvariable "i" des
>for-Konstrukts auf die Elemente zugreifen?

Kauf dir ein C-Buch un lies es.

LED1_t1[i]=a;

>Wird das dann zeitlich nicht etwas kritisch?

Nö, der AVR schläft dabei ein.

>c.) Wie berechne ich die genaue Zeit wieviel ms bzw. us er in den
>Interupt springt?

Wozu?

> Is zwar irgendwo angegeben, aber ohne zu wissen
>wieviel Rechenschritte in dem ISR sind kann ich es nicht oder?

Wozu? Die Soft-PWM läuft doch, darum musst du dich nicht mehr 
kümmern.

MFG
Falk

von Marten M. (mcgonahy148)


Lesenswert?

Danke Karl-Heinz...

Ich muss sagen, für dass das ich noch nicht sehr lange hier aktiv bin, 
du bist hier eine wirklich große Hilfe! Ich komm mir schon langsam etwas 
schlecht vor, weil ich einfach NUR frage und nichts weitergebe. Aber 
dafür bin ich irgendwie noch zu schwach auf der Brust :-) Aber das Forum 
lebt eben davon von Wissensweitergabe, und die Seite hier ist einfach 
wirklich gut angelaufen. Ich möchte nicht wissen wieviel Elektroniker 
und Entwickler hier rumschwirren :-)

Nun zum Thema: Also Speicherplatz einsparen kann ich wenn ich die 
Vektor/Array-Geschichten aufgebe, ok, das muss ich schon mal 
einverleiben. Dafür wird der Prozesser mehr belastet durch mehr 
Rechenschritte? Ich kenn mich hinsichtlich Optimierung eines Programmes, 
was auch besser ist für den Prozessor oder den Speicher, nciht aus. Mehr 
Speicher verbraten und den Prozessor wenig rechnen lassen oder wenig 
Speicher und die Schritte rechnen lassen. Da heutzutage ja Speicher kein 
Thema mehr is, möchte man ja den Prozessor entlasten? Oder seh ich das 
ganze falsch?

von Marten M. (mcgonahy148)


Lesenswert?

Falk Brunner schrieb:
> @  Marten Mcgonahy (mcgonahy148)
>
> Lies mal was über Netiquette. Lange Quelltexte gehören in den
> Anhang.

Sorry, ich werd mich in Zukunft dran halten!

Falk Brunner schrieb:
>>c.) Wie berechne ich die genaue Zeit wieviel ms bzw. us er in den
>>Interupt springt?
>
> Wozu?

Ich würds gern wissen, aber es ist wohl nur von den Einstellungen des 
Timers abhängig und nicht wie hoch die Rechenschritte im ISR sind. Was 
ich aber nciht versteh, wenn die ISR lange dauert, dann funktioniert die 
Annahme halt auch nicht mehr?! Und genau dann weiss ich nicht wie ich 
die Zeiten berechnen kann. Warum? PWM und Zeiten gehört halt schon 
zusammen...

Falk Brunner schrieb:
>> Is zwar irgendwo angegeben, aber ohne zu wissen
>>wieviel Rechenschritte in dem ISR sind kann ich es nicht oder?
>
> Wozu? Die Soft-PWM läuft doch, darum musst du dich nicht mehr
> kümmern.

Wie gesagt, ich würds auch gern alles verstehen und nicht einfach nur 
copy-paste. Auch wenn mir manchmal einfache C-Grundlagen im Kopf 
abhanden gekommen sind. Übrigens, liegt irgendwo das Buch von Ulla 
Kirch-Prinz bei mir rum, so viel zum Thema Zugriff auf ein Vektorelement 
:-s

von Falk B. (falk)


Lesenswert?

@  Marten Mcgonahy (mcgonahy148)

>Nun zum Thema: Also Speicherplatz einsparen kann ich wenn ich die
>Vektor/Array-Geschichten aufgebe, ok,

Nix OK, gespart wird da nichts, man kann es "nur" besser verwalten. Und 
Speicherplatzsparen steht heute nicht auf dem Stundenplan, also vergiss 
es für dieses Projekt.

> Dafür wird der Prozesser mehr belastet durch mehr
>Rechenschritte? Ich kenn mich hinsichtlich Optimierung eines Programmes,
>was auch besser ist für den Prozessor oder den Speicher, nciht aus.

Das ist auch im Moment vollkommen egal. Du musst erstmal die Grundlagen 
lernen.

>Speicher und die Schritte rechnen lassen. Da heutzutage ja Speicher kein
>Thema mehr is, möchte man ja den Prozessor entlasten? Oder seh ich das
>ganze falsch?

Jain. Wenn gleich Speicher auch bei Mikrocontrollern heute billig ist, 
muss man immer von Fall zu Fall sinnvoll abwägen. Dazu baucht man 
Erfahrung. Die hast du im Moment noch nicht.

>ich aber nciht versteh, wenn die ISR lange dauert, dann funktioniert die
>Annahme halt auch nicht mehr?!

Wei kommst du darauf?

> Und genau dann weiss ich nicht wie ich
>die Zeiten berechnen kann. Warum? PWM und Zeiten gehört halt schon
>zusammen...

Du bist auf dem Holzweg.

>Wie gesagt, ich würds auch gern alles verstehen und nicht einfach nur
>copy-paste.

Schön, aber warum liest du dann nicht den Artikel, aus dem du den 
Quelltext her hast? Dort ist alles haarklein erklärt.

MFG
Falk

von Marten M. (mcgonahy148)


Lesenswert?

Falk Brunner schrieb:
>>ich aber nciht versteh, wenn die ISR lange dauert, dann funktioniert die
>>Annahme halt auch nicht mehr?!
>
> Wei kommst du darauf?

Je nach Timereinstellung springt er ja alle XXXms/us in die ISR rein. 
Wenn nun die ISR Routine aber extrem lange dauern würde, keine 
ahnung...100ms oder sonstwas, dann funktioniert doch die PWM auch nicht 
mehr?! Daher mein Schluss, bzw. meine Aussage dass PWM und Zeiten ja 
zusammenhängen! Es geht hier ja um Puls-Pausen-Verhältnis, ergo wie 
lange schalte ich die LED EIN und wie lange die LED AUS.

Falk Brunner schrieb:
> Schön, aber warum liest du dann nicht den Artikel, aus dem du den
> Quelltext her hast? Dort ist alles haarklein erklärt.

Sei mir nicht bös, und der Artikel ist ja auch gut und hilfreich, aber 
es wird, zumindest bei dem einfachen Lösungsansatz nur der Code angeben 
und nichts weiter groß erklärt! Ausser halt "m AVR-Studio kann man den 
Code simulieren. Wichtig ist hi..." unter dem Sourcecode. Daher finde 
ich NICHT dass hier alles haarklein erklärt wird.

Und, ich dank dir schön für die Antworten Falk, aber es wirkt etwas 
unfreundlich und es tut mir leid dass ich noch keine Plan von dem Ganzen 
hier hab! Ich versuchs zumindest jetzt erstmal und stell eben 
Anfängerfragen...

von Karl H. (kbuchegg)


Lesenswert?

Marten Mcgonahy schrieb:

>>>c.) Wie berechne ich die genaue Zeit wieviel ms bzw. us er in den
>>>Interupt springt?
>>
>> Wozu?
>
> Ich würds gern wissen, aber es ist wohl nur von den Einstellungen des
> Timers abhängig und nicht wie hoch die Rechenschritte im ISR sind. Was
> ich aber nciht versteh, wenn die ISR lange dauert, dann funktioniert die
> Annahme halt auch nicht mehr?!

Logisch.
Wenn du dir eine Uhr stellst, so dass sie alle 10 Sekunden klingelt 
(einen Interrupt auslöst) und du bei jedem klingeln ein Wort sagen 
sollst, dann sagst du 6 Wörter in der Minute. Und es spielt keine Rolle, 
ob du nun 'bap' oder 'Mikrocontroller' sagst. Das ändert nichts an den 6 
mal in der Minute.
Ist dein Wort aber zu lang, wie 
"Donaudampfschifffahrtskapitänskajütenknopfunterlegscheibe" dann kann es 
natürlich dazu kommen, dass das Aussprechen länger als 10 Sekunden 
dauert und du ein Klingeln verpasst.

> Und genau dann weiss ich nicht wie ich
> die Zeiten berechnen kann.

Dann schaut man sich das Assembler Listing an, zählt Befehle zusammen 
und rechnet sich die Laufzeit aus.
Im Regelfall passiert das nicht, weil man es in einer ISR gar nicht 
soweit kommen lässt, dass es mit den verfügbaren Taktzyklen knapp wird. 
Nicht von ungefähr lautet eine Daumenregel: ISR sollten kurz sein. In 
einer ISR macht man das was Notwendig ist, aber nicht mehr. Alles was 
nicht unbedingt in einer ISR sein muss, fliegt dort raus.

> Warum? PWM und Zeiten gehört halt schon
> zusammen...

Und das spielt bei dir überhaupt keine Rolle. Die PWM läuft und du 
läufst noch nicht einmal annähernd in Gefahr, dass es knapp werden 
könnte.

> abhanden gekommen sind. Übrigens, liegt irgendwo das Buch von Ulla
> Kirch-Prinz bei mir rum, so viel zum Thema Zugriff auf ein Vektorelement
> :-s

Was soll uns das jetzt sagen?
Das du lieber dir Halbwissen anlassbedingt in einem Forum 
zusammensuchst, anstelle eines systematischen Zugangs durch ein Buch?

von Falk B. (falk)


Lesenswert?

@  Marten Mcgonahy (mcgonahy148)

>Je nach Timereinstellung springt er ja alle XXXms/us in die ISR rein.
>Wenn nun die ISR Routine aber extrem lange dauern würde, keine
>ahnung...100ms oder sonstwas,

Das tut sie aber nicht, weil sie durchdacht ist.

> dann funktioniert doch die PWM auch nicht
>mehr?! Daher mein Schluss, bzw. meine Aussage dass PWM und Zeiten ja
>zusammenhängen!

Dein Schluss ist falsch. Und du redest wirr und drehst dich im Kreis. 
Lies den Artikel, denk in Ruhe drüber nach.
Die Einstellung der PWM-Zeit hat KEINERLEI Einfluss auf die Dauer des 
Interrupts.

> Es geht hier ja um Puls-Pausen-Verhältnis, ergo wie
>lange schalte ich die LED EIN und wie lange die LED AUS.

Du hast den Artikel nicht verstanden, auch nicht wie Soft-PWM 
funktioniert. Siehe oben.

>Sei mir nicht bös, und der Artikel ist ja auch gut und hilfreich, aber
>es wird, zumindest bei dem einfachen Lösungsansatz nur der Code angeben
>und nichts weiter groß erklärt!

Der Code ist so einfach, dass er selbsterklärend ist. Sind ja auch 
Kommentare drin!

>ich NICHT dass hier alles haarklein erklärt wird.

Wir sind nicht deine Mutti.

>Und, ich dank dir schön für die Antworten Falk, aber es wirkt etwas
>unfreundlich und es tut mir leid dass ich noch keine Plan von dem Ganzen
>hier hab! Ich versuchs zumindest jetzt erstmal und stell eben
>Anfängerfragen...

Ist OK, aber du solltest vielleicht auch mal die Hinweise 
berücksichtigen und die Sache selber INTENSIV durchdenken. Das muss 
jeder.

MFG
Falk

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.