Hallo Habe 2 Fragen zum programmieren mit Avr Studio: 1. beim atmega8 setze ich das tccr1a,b z.b. folgendermaßen: .def temp = r16 ... ... ldi temp, 0x42 out tccr1b, temp warum kann ich das beim mega 48 nicht so machen? immer fehler in Zeile: out tcc...... 2. wie kann ich ein 16 bit register mit 360 dividieren? / oder mit dem Kehrwert multiplizieren grüße Steff
1: Liegt vermutlich ausserhalb des Bereichs, der mit OUT erfasst werden kann. STS verwenden.
@2 So: x/360 = (128*x-32*x-4*x-x)/32768 , naja fast, da treten Fehler auf. Du muß mit 32Bit rechnen. Die Multiplikationen und Divisionen mit Potenzen von 2 mit Schieben machen. Oder so, das ist genau: pp=128;mm=360*128;fak=0; for(k=0:6) if(x>mm){x=x-mm;fak=fak+pp;}end; pp=pp/2;mm=mm/2; end Du muß aber nochmal genau draufkucken, ob das so stimmt, auch für negative x. Cheers Detlef
Der "16-Bit-Kehrwert" von 360 ist 65536/360=182,04444 (0xB6). Also multiplizierst Du mit 0xB6 und verwendest nur die oberen 16 Bits des 32-Bit-Ergebnisses: z.B. x=4660=0x1234 x/360=12,94444 x*182=848120=0x000CF0F8, 0x000C = 12 Wenn Du runden willst, addierst Du einfach das Bit15 zum Ergebnis. hier ist es das höchste Bit des linken Fs, ist gesetzt, also ist das gerundete Ergebnis 13. Wenn Du die Nachkommastellen auch noch ausgeben willst, multipliziertst Du das 0xF0F8 * 0x2710 = 24C4D780 und gibst die oberen 16 Bits (aufgerundet 0x24C5) aus (,9413). n.b. 0x2710 = 10000 Das ist nicht ganz genau, weil wir oben das 182,04444 abrundeten. Besser ist es, mit 0xB60B (256*182,04444) zu multiplizieren und nur die oberen 8 Bits des 32-Bit-Ergebnisses zu verwenden. Die reichen aus, da das maximale Ergebnis 65535/360=182,0416667 sein kann. Das o.g. Beispiel: 0x1234*0xB60B=0x0CF1C03C 0x0C=12 0xF1C0*0x2710=0x24E35C00 0x24E3=9443 Ausgabe ist dann 12,9443
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.