PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vergleich in ASM, wenn gleich oder größer gehe zu....



Thomass
20.06.2006, 12:48
Hallo,

habe ein kleines Programm geschrieben um einen DC-Motor der belastet wird etwas mehr Saft per PWM zu geben damit dieser in der Drehzahl nicht so stark abfällt.

Leider funktioniert das irgendwie nicht. Ich messe Jeweils die Spannung an der Stromquelle und einmal direkt am Motor so das das Kabel als Shunt fungiert. Es entsteht auch eine messbare Differenz dieser beiden Signale. Wie nutze ich diese aber um meine PWM-Rate zu erhöhen. Ich habe mal das Programm etwas vereinfacht dargestellt und einige Teile die funktionieren weggelassen.

main:
rcall ADWandlung1.....;Ergebniss in temp
rcall ADWandlung2.....;Ergebniss in temp2
sub temp, temp2....... ;Differenz steht in temp
out portc, temp......... ;Zur Kontroll eausgabe am PortC
ldi temp3,126............ ;Schwellwert
cp temp, temp3......... ;Vergleiche temp mit Schwellwert
brge hochsetzen....... ;wenn temp gleich oder größer temp3 gehe zu Routine die PWM-Wert erhöht
rjmp main

hochsetzen:
ldi pwm, 120
rcall PWMübergabe....;Übergebe 120 an PWM-Einheit um Drehzahlverlust auszugleichen, normalwert ist 60
rjmp main

Edit: Im AVR-Studio kann ich das simulieren lassen und es funktioniert auch das die Hochsetzroutine angesprungen wird wenn die Differenz höher ist. Wenn ich im Programm den Wert von 126 auf 128 ändere dreht sich der Motor auch schneller. Wenns aber auf 126 steht und ich ihn abbremse passiert ncihts obwohl ich am PortC sehe das die dDifferenz höher wird.

PicNick
20.06.2006, 13:32
Beim AD-Wandeln kommen doch normalerweise 10-Bit raus. Dein "sub" is aber doch nur ein Byte. das gibt doch Streß mit dem Vorzeichen ?

SprinterSB
20.06.2006, 13:44
Du könntest die Werte nach 16 Bit expandieren zum Vergleich:
temp= r25:r24
temp2= r19:r18
r0=0


clr r0
lds r24, temp
clr r25
lds r18, temp2
sub r24, r18
sbc r25, r0
cpi r24, 126
cpc r25, r0
brlt 0f
; temp-temp2 >= 126
0:

Thomass
20.06.2006, 14:29
ich habe das ADLAR Bit gesezt so das ich die oberen 8Bit des 10Bit-ADC-Ergebniss in ADCH habe. Ich arbeite also nur mit 8 Bits.

SprinterSB
20.06.2006, 14:46
Nein, tust du nicht. Bei der Subtraktion kann ein Übertrag auftreten. Du brauchst also 9 Bit. Oder kannst du sicherstellen, daß in ADCH nur Werte von 0..127 stehen?

Thomass
20.06.2006, 15:16
Signal A ist größer als Signal B
dann dürfte doch bei sub Signal A, Signal B kein Übertrag auftreten.
Ist das der Fall wenn Signal B größer als A ist das es dann so rausläuft
128-140= -12 also 12 plus gesetzes Negativ-Flag?

PicNick
20.06.2006, 15:25
nein, -12 (0x0C) => 0xF4

SprinterSB
20.06.2006, 15:34
Bist du sicher, daß A immer größer ist als B. Nicht in der Theorie, sondern in der Praxis (Rauschen, etc.) Und ein Vergleich wie oben ist doch net so kompliziert, oder sind die Handvoll asm-Instruktionen schon zu viel?