Analog zu PWM. Fehler im Programm?

OP #2067664
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.
Angehängte Dateien:
OP #2067731
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?
Gast #2067847
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
Gast #2068194
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
OP #2068388
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.
OP #2069811
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?
Gast #2070047
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
Gast #2070103
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
Gast #2070105
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.
Gast #2070119
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
OP #2072580
Lesenswert?

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

Hab jetzt die Einstellungen für die Initialisierung und
muss jetzt ja nur noch TOP und Compare eintragen.
Gast #2072834
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
Gast #2072858
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
OP #2073034
Lesenswert?

So, hab jetzt erstmal ohne invertierte PWM weitergearbeitet damit ich 
meine Testplatine nicht nochmal umlöten muss.
Die Änderung sieht jetzt so aus:
1
PWM:
2
; Wert in PWM eintragen
3
    ldi       temp1, 0
4
    cp        temp2, temp1 
5
    BRNE      pwm_an      
6
      cbi     DDRB,1
7
      rjmp    weiter
8
    pwm_an:
9
    cp        temp2, temp1 
10
    BREQ      weiter
11
      sbi     DDRB,1
12
    weiter:
13
    out       OCR0B, temp2
14
ret
Gast #2073095
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

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