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