Analog zu PWM. Fehler im Programm?

#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:
#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
#2067975
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.
Angehängte Dateien:
#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.
#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 #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.
#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

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