i2c Slave eine PWM programmieren

Gast #2406438
Lesenswert?

Hallo,
ich programmiere mit dem Atmega8 einen Slave
für i2c. Dieser Slave soll über die Pins OCR1A/OCR1B
eine PWM ausgeben.
Mit einem Master (simuliert mit dem MySmartUSB_Terminal)
schicke ich ihn die Buchstaben (8Bit)
für die switch-Anweisung (siehe Code im Anhang).
Problem:
Das Senden der einzelnen Buchstaben und das "Springen"
in die dafür angelegte case-Anweisung funktioniert,
aber nur bei "v" funktioniert auch die pwm
 bei "h","l" und "r" nicht???

Habe das PWM-Programm auch auf einen Atmega8 (kein Slave)
geschrieben, da funktionierts  :(

würde mich um Antwort freuen.
Mit freundlichen Grüßen Christoph
Angehängte Dateien:
#2407366
Lesenswert?

Hallo,

da der Wert von 'test' bis zum nächsten empfangenen Zeichen seinen Wert 
behält, werden die Berechnungen die du bei "h","l" und "r" ausführst 
ständig wiederholt und der OCR1A-Wert ändert sich schneller als die PWM 
läuft.
Setze 'test' nach abarbeiten der case-Abschnitte auf 0.
Oder führe die switch-Anweisung nur aus, wenn 'test' einen gültigen Wert 
hat.
1
while (1) {
2
  if (test<>0) {
3
    switch (test) {
4
      case ...
5
      ....
6
    }
7
    test=0;
8
  }
9
}

Sascha
#2411073
Lesenswert?

Walter schrieb:
> ein weiterer Fehler ist auch noch drin:
> wenn zwischen switch(test) und test=0 im Interrupt ein weiteres Zeichen
> kommt, geht es verloren!
Das würde ich unter den aktuellen Bedingungen ausschließen. Da die Main 
nichts weiter zu tun hat ist die Ausgabe der OC-Werte so schnell 
erledigt das in der Zeit kein zweites Zeichen kommen kann.
Sollte die Main jedoch mal Funktionen enthalten, die signifikant 
rechenzeit brauchen - geb ich dir recht.
Man könnte natürlich die Berechnung und PWM-Ausgabe auch gleich noch in 
die Empfangsroutine einbauen - auf die paar µs kommt's nicht an.

Sascha

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