www.mikrocontroller.net

Forum: Compiler & IDEs OCR1A lässt sich nicht schreiben?


Autor: Woeba (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe folgendes Problem und komme nicht weiter:
Ich habe eine kleine Routine geschrieben, die folgendes machen soll:
Die Spannung an einem Poti auslesen, und ein daszu proportionales PWM
Signal für einen Servo machen. Mein Problem ist, dass sich der Wert im
OCR1A Register des Controllers (MCU) nicht mehr ändern lässt, nachdem
ich ihn initialisiert habe. Laut JTAG beleibt der konstant, und auch
das Oszi sagt dass sich das Tastverhältniss am Ausgang nicht ändert
wenn ich am Poti drehe. Das verrückte ist, dass ich die kleine include
Datei früher zum ansteuern eines Servos verwendet habe, und zwar ohne
Probleme.
Habt Ihr eine Idee?

THX schonmal
Woeba

Autor: Woeba (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier die servo.h

Autor: Woeba (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
...und die adc.h

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void set_servo_1(unsigned char position)
{
  OCR1A=(unsigned short) (((position/256)*2800)+1200);
};


Du übergibst bei Deinem Aufruf aus der Main einen unsigned char. Zuerst
wird die Rechenoperation (position/256) durchgeführt, da kommt 0 raus,
weil ein unsigned char / 256 = 0. Die anschließende Multiplikation geht
ins leere, die Addition dürfte den Wert auf 1200 festlegen.
Ich würde zuerst multiplizieren und dann dividieren.

Autor: Woeba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
O_o

Das höhrt sich doch sehr sinnvoll an! Ist vollkommen logisch, aber ich
habe es 1000x übersehen.

Danke!

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Btw., wenn du wiedermal mehr als eine Datei anhängen willst, nimm
besser irgendein Archiv (.tar.gz, .zip oder so).  Außerdem sind
Headerdateien per Konvention eigentlich nicht dafür da, Code zu
erzeugen, sondern sie sollten Interface-Deklarationen aufnehmen für
Code, der in anderen C-Quelldateien implementiert ist (die dann alle
gemeinsam gelinkt werden).  Insofern hättest du natürlich auch gleich
alles in eine Datei schreiben können, es wäre dasselbe.

Aber das Ding mit der Division einer uint8_t-Zahl durch 256 hatte ich
auch nicht entdeckt.

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg: Das erfüllt mein Herz mit Stolz, daß ich als C-Newbie auch einem
alten Hasen wie Dir einen Schritt voraus sein kann ;)
Mir stach das irgendwie sofort ins Auge...
Ist aber oftmals so: Man wurschtelt tagelang an einem Problem herum,
und dann kommt jemand daher, der die Lösung sofort sieht. Irgendwie
verennt man sich, und dann kann etwas Abstand (im wahrsten Sinne des
Wortes) sehr schnell helfen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.