www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analog zu PWM. Fehler im Programm?


Autor: Markus S. (flash_gordon)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


ich möchte ein Programm schreiben welches analoge Signale in PWM-signale
umwandelt aber ich bin noch recht unerfahren in der 
µController-Programmierung.
Das Programm funktioniert soweit auch ganz gut aber ich
wollte nun eine Funktion einfügen um festzulegen das die anliegende
Analogspannung 100% für die PWM entspricht. zB bei maximal anliegenden
3,7V am PortC.0 (zur Zeit ein Poti angeschlossen) soll, wenn an PortC.1
ein Taster gedrückt wird, die am PORTB.1 angeschlossene LED 100%
leuchten. Wenn die maximale Spannung allerdings 4,8V sein sollte möchte
ich ohne Veränderung am Programm die 4,8V als 100% zuweisen. Ich hoffe
ich konnte mich verständlich machen.
Vielleicht kann ja jemand sich das mal ansehen und mir sagen wo der
Fehler ist. Ich bin natürlich auch für Verbesserungsvorschäge offen :)

Das Programm soll später auf einen ATtiny13 umgeschrieben werden dann
entfällt ja auch die Möglichkeit den Analogwert via UART auszulesen.
Bisher teste ich auf einen ATmega8.

Vielen Dank im vorraus.

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaub ich hab den Fehler gefunden. Mein PortC.1 Taster zieht auf GND 
wenn ich ihn drück, im Programm sollte er aber das Eingangsbit setzen.
Jetzt habe ich den internen Pullup-widerstand aktiviert und statt sbis, 
sbic
eingesetzt.

Trotzdem wäre ich dankbar wenn jemand n Kommentar zu dem Programm 
schreibt (ist mein 1.)

eine Frage hab ich aber noch: Wenn ich das Programm im AVR-Studio 
simuliere,
löscht es die Bits im OCR1AH-register während die Werte im 
ORC1AL-register bleiben. Woran liegt das?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Trotzdem wäre ich dankbar wenn jemand n Kommentar zu dem Programm
>schreibt (ist mein 1.)

1. Finger weg von der Tab-Taste oder schalte in den Editor-Options 
'Replace tabs with space' ein.

>  ;2x nach rechts verschieben entspricht durch 4 teilen (um Mittelwert >zu 
erhalten)
>   lsr    temp3
>   ror    temp2
>   BRCC   div1 ; Springe wenn kein Runden
>   INC   temp2 ; Aufrunden
>div1:
>   lsr    temp3
>   ror    temp2

Das ist fehlerträchtig. Überlege mal was passiert, wenn dein Wert
0bxxxxxxx1 11111111 ist. Da sollte eine 16-Bit-Addition mit 1 hin.

MfG Spess

Autor: Markus S. (flash_gordon)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Oh besten Dank, wäre mir gar nicht aufgefallen das da ein Fehler 
auftreten kann. 'Replace tabs with space' hab ich auch eingeschaltet.
Gibt es noch weitere Stellen an denen ich noch etwas machen müsste

Ich hab das Programm nochmal überarbeitet und angehängt.
Den UART-Teil hab ich entfernt.

Autor: Markus S. (flash_gordon)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und nochmal ohne Tabs ;)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Gibt es noch weitere Stellen an denen ich noch etwas machen müsste

Also erst mal nichts offensichtliches. Nur erschließt sich mir der 
Startwert für ICR1 von $05B4 nicht so richtig. Vom AD-Wandler können 
maximal $3FF kommen.

MfG Spess

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Also erst mal nichts offensichtliches. Nur erschließt sich mir der
> Startwert für ICR1 von $05B4 nicht so richtig. Vom AD-Wandler können
> maximal $3FF kommen

Ich hatte in der 1. Version des Programmes mir die Analogwerte via UART 
ausgelesen und dabei festgestellt das mein maximaler Wert eben nur 
0x05B4 ist, wunderte mich auch, und hab das gleiche nochmal mit AREV 
probiert und kam auch auf ca 0x05B4. Daher kommt der Wert.

als Anmerkung vielleicht noch: ich nutz das myAVR Board MK2 USB,
bin aber auch gerade daran mir was für den ATtiny13 zu bauen.

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus S. schrieb:
> spess53 schrieb:
>> Also erst mal nichts offensichtliches. Nur erschließt sich mir der
>> Startwert für ICR1 von $05B4 nicht so richtig. Vom AD-Wandler können
>> maximal $3FF kommen
>
> Ich hatte in der 1. Version des Programmes mir die Analogwerte via UART
> ausgelesen und dabei festgestellt das mein maximaler Wert eben nur
> 0x05B4 ist, wunderte mich auch, und hab das gleiche nochmal mit AREV
> probiert und kam auch auf ca 0x05B4. Daher kommt der Wert.


Kann es vielleicht daran liegen das die Analogwerte verfälscht werden 
wenn nebenbei die Pulsweiten-Modulation läuft?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Kann es vielleicht daran liegen das die Analogwerte verfälscht werden
>wenn nebenbei die Pulsweiten-Modulation läuft?

Was funktioniert denn bei dir nicht? Ich habe dein Programm mal auf 
einen ATMega88 umgeschrieben und getestet. Läuft.

MfG Spess

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Programm funktioniert. Aber ich frag mich warum der ADC auf die 
Werte kommt. Da ja bei einer 10bit-Wandlung ja nur maximal 0x3FF 
rauskommen sollten und nicht 0x5B4. Kann es sein das die PWM den ADC so 
stört das solche Werte rauskommen?

@Spess53: Danke übrigens für deine Hilfe bisher.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Kann es sein das die PWM den ADC so stört das solche Werte rauskommen?

Nein. Ich habe hier ein STK500 und ca. 50cm Kabel zwischen Poti und 
PortC Steckverbinder. Kein C am ADC-Eingang. Die Werte bleiben brav im 
erlaubten Bereich (Dragon mit Debugwire).

Bist du sicher, das das nicht der kumulierte Wert ist?

MfG Spess

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Spess53

Dem TO wird die Abschaltung der Tab-Taste empfohlen,
kann mir bitte einer erklären warum?

Macht der GCC oder der ASM "Mist", letzteres konnte ich
noch nicht beobachten. Oder macht nur eine bestimmter
gebräuchlicher Texteditor Probleme.
Daß Tabs Ärger machen ist mir neu, lerne aber gerne hinzu.

Bei Umlauten würde mich das nicht wundern, da "zicken"
manche Programme.

Danke für Hinweise wegen der Tabs.

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab ja in der 1. Version des Programmes mir die Werte via UART 
ausgelesen weswegen ich ja erst festgestellt hab das sie viel höher sind 
als sie sein dürften. Habe ich vielleicht im UART-Teil einen Fehler 
gemacht?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Dem TO wird die Abschaltung der Tab-Taste empfohlen,
>kann mir bitte einer erklären warum?

Das hat nur mit der Darstellung des Codes in verschieden Programmen zu 
tun.
Einrückungen mit Leerzeichen sehen in allen Programmen gleich aus. Mit 
Tabs unterschiedlicher Weite nicht.

MfG Spess

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuch ja gerade das Programm für einen ATtiny13 umzuschreiben aber 
ich komm an einer Stelle nicht weiter.
Wie definier ich den Endwert für den Zähler?
Beim ATmega8 konnte ich das ja in ICR1H und ICR1L eintragen.
Aber ich finde im Datenblatt keinen Hinweis wo man das eintragen könnte.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Beim ATmega8 konnte ich das ja in ICR1H und ICR1L eintragen.

Der Timer vom ATTiny kennt nur $FF oder OCRA als Top.

MfG Spess

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ORCA ist ja der Comparewert, nehm ich an.
Damit müsste ich das Programm ja komplett umschreiben damit ich wieder 
die Möglichkeit habe einen beliebigen Analogwert als 100% für die PWM zu 
zuweisen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ORCA ist ja der Comparewert, nehm ich an.

OCRA kann je nach PWM-Mode entweder Compare-Wert oder Top-Wert sein.
Bei letzterem ist OCRB das Compare-Register.

MfG Spess

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heist,wenn ich den OC0B-Pin für die PWM nutze, kann ich ORCA als TOP 
und ORCB als Compare nutzen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Das heist,wenn ich den OC0B-Pin für die PWM nutze, kann ich ORCA als TOP
>und ORCB als Compare nutzen.

Ja.

MfG Spess

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, ich dachte schon ich muss mir was neues ausdenken.
Vielen Dank für die Hilfe
    ldi     temp1,  (1<<COM0A0)|(1<<COM0B1)|(1<<WGM01)|(0<<WGM00)
    out     TCCR0A, temp1
    ldi     temp1,  (1<<WGM02) | (1<<CS01)
    out     TCCR0B, temp1   

Hab jetzt die Einstellungen für die Initialisierung und
muss jetzt ja nur noch TOP und Compare eintragen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Hab jetzt die Einstellungen für die Initialisierung und
>muss jetzt ja nur noch TOP und Compare eintragen.

Nein. Du brauchst PWM-Mode 7. Du hast 'Reserved' (6) eingestellt.

MfG Spess

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh hatte ich übersehen. Danke.
Bin gerade beim testen, irgendwo hab ich noch einen Überlauf drin. Ich 
schau mal woran es liegen könnte und stell das Programm dann nochmal 
online.

Autor: Markus S. (flash_gordon)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Soweit so gut. Das Programm funktioniert.
Das einzige was mir noch nich so gefällt ist, das bei 0V die LED noch 
"glimmt" und das Spannung/Helligkeit -Verhältnis noch nicht ganz linear 
ist.
Vielleicht hat ja jemand noch eine Idee was man da noch machen könnte.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Das einzige was mir noch nich so gefällt ist, das bei 0V die LED noch
>"glimmt" und das Spannung/Helligkeit -Verhältnis noch nicht ganz linear
>ist.
>Vielleicht hat ja jemand noch eine Idee was man da noch machen könnte.

Invertierte PWM benutzen oder bei Null PWM abschalten.

MfG Spess

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei einer Invertierten PWM kann ich OCR0A (also den TOP-wert) nicht mehr 
so einfach definieren. Aber linearer wird das dadurch ja auch nicht 
oder?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Bei einer Invertierten PWM kann ich OCR0A (also den TOP-wert) nicht mehr
>so einfach definieren.

Was hat das damit zu tun? Lediglich das OC-Register muss mit
Topwert - errechneten OC-Wert geladen werden.

MfG Spess

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt, hatte grad ein Denkfehler.

Autor: Markus S. (flash_gordon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hab jetzt erstmal ohne invertierte PWM weitergearbeitet damit ich 
meine Testplatine nicht nochmal umlöten muss.
Die Änderung sieht jetzt so aus:
PWM:
; Wert in PWM eintragen
    ldi       temp1, 0
    cp        temp2, temp1 
    BRNE      pwm_an      
      cbi     DDRB,1
      rjmp    weiter
    pwm_an:
    cp        temp2, temp1 
    BREQ      weiter
      sbi     DDRB,1
    weiter:
    out       OCR0B, temp2
ret

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>So, hab jetzt erstmal ohne invertierte PWM weitergearbeitet damit ich
>meine Testplatine nicht nochmal umlöten muss.

Da braucht man nichts umlöten. COM-Bits ändern und OC-Wert wie oben 
berechnen.

MfG Spess

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.