Guten Abend. Kennt sich einer mit besagten Thema aus und kann mir ein
konkretes Beispiel Posten, ich finde im Netz leider nix
aussagekräftiges, das meiste ist in C..
Folgendes es soll sich um eine Sinus Tabelle handeln, in der einen
Spalte die Grad und in der anderen der dazugehörige Tastgrad der PWM.
Die Grad gebe ich inkrementell vor, der PIC soll dann ohne viel zu
rechnen den dazu Passenden PWM Wert finden und in den RAM laden.
In W1 schreibst du die Stelle in der Tabelle, dann rufst du mit call LUT
auf und dann steht der Wert in W1. Das sollte 6 Maschinenzyklen lang
dauern.
Edit: Man könnte auch mit TBLRD was machen, damit habe ich aber noch nie
gearbeitet.
hier die Hälfte verrate ich dir....
.org(0xd00)
sinetable:
.word 0x0000,0x0006,0x000D,0x0013
.word 0x0065,0x006B,0x0071,0x0077
So mach ich das und retlw gibts bei dspic nicht.
Maik Werner schrieb:> retlw gibts bei dspic nicht.
Das sieht Microchip anders:
http://ww1.microchip.com/downloads/en/DeviceDoc/70000657H.pdf
Seite 395
Max H. schrieb:> Das sollte 6 Maschinenzyklen lang> dauern.
Ich sehe gearede, dass sprünge beim dsPIC länger brauchen, das mit den 6
Zyklen stimmt also nicht.
Wie groß soll die Tabelle eigentlich werden? Wenn sie nur ganz klein
wird könnte man sie in der RAM legen
Maik Werner schrieb:> hier die Hälfte verrate ich dir....>> .org(0xd00)> sinetable:> .word 0x0000,0x0006,0x000D,0x0013> .word 0x0065,0x006B,0x0071,0x0077>> So mach ich das und retlw gibts bei dspic nicht.
Danke Maik, aber so weit war ich auch schon, was ich gern wissen würde
wie kann ich mit der Tabelle interagieren und woher weis der PIC welchen
Wert er nehemn soll?
Hallo,
Ich lese die Tabellen aus dem ROM mit der TBLRD(L,H) Anweisung diese
benötigt 2 Zyklen...
RAM Tabellen gehen sehr gut mit einer indirekten Adressierung.
vieleicht hilft es Dir weiter...
Also ich verstehe das so, wenn deine Tabelle eine halbe Schwingung
enthält
so entspricht das 180° .Dies teilst Du durch die Anzahl deiner
"Stützstellen" o. Einträge....
Maik Werner schrieb:> Indem Du die Gradzahl kennst?
Die kenne ich ;) Wie speziell arbeite ich mit dem TBLRD H und L Befehl?
Am besten währe es wenn ich den Grad Wert einfach in eine Adresse für
die Tabelle umwandle.
Beispiel:
INT: ; wird zB alle 1µs aufgerufen
mov GRAD_PRO_STEP,W0 ; fester vorberechneter Wert
ADD GPS ; Vortlaufende Addierung bis zum Überlauf usw..
; Jetzt möchte ich den "GPS" Wert in eine Addresse umrechnen die
mir den passenden PWM Wert nach W0 kopiert, wie genau siehen die Befehle
aus?
mov -PWM WERT aus TABELLE-,W0
mov W0,MDC
bclr IFS5,#PWM1IF
bclr PWMCON1,#TRGSTAT
retfie
z.B. so:
TBLRDL [w5],w2 -->
hiermit liest du die unteren 16b deiner 24b Romspeicherstelle aus. in W5
steht die Adresse (indirekt) und in W2 der entsprechende
Tabelleneintrag. Das alles dauert 2 Zyklen!
viel Erfolg
Re Né schrieb:> Wofür ist eigentlich der "TBLPAG" Befehl?
Ein 8-Bit Register, das die 16 Bits aus dem Register im TBLxxx Befehl zu
einer 24-Bit Adresse verlängert. Wären sonst ja nur 96KB ROM
adressierbar. Bank-Switching in guter alter Microchip-Tradition.
Re Né schrieb:> Wie schreibe ich hier Dezimal Zahlen? Eine Raute nimmt er leider nicht>> .word 0x3333,0x4444,0x1111,0x2222
OK habe es herausgefudnen bei Dezimalzahlen lässt man einfach das 0x weg
also:
.word 3333,4444,1111,2222
So habe jetzt eine LTB mit 36.000 Werten generiert (Excel) und im
Programm eingebunden. Sind gleich mal 41% vom PIC Speicher ^^ Am Montag
setze ich das dann in die Praxis um
Für die die es Interessiert hier ist der Code. Was noch nicht enthalten
ist, ist die Steuerung per SPI. Das möchte ich gerne über DMA lösen. Im
Anhang befindet sich die Sinus Tabelle mit 36.000 Stützen. Range (0-300)
Das ist der PWM Wert.
1
;RA0
2
;RA1
3
;RA2
4
;RA3
5
6
;RB0
7
;RB1
8
;RB2
9
;RB3
10
;RB4
11
;RB5
12
;RB6
13
;RB7 SCK1
14
;RB8 SDO1
15
;RB9 SDI1
16
;RB10
17
;RB11
18
;RB12 PWM2H
19
;RB13 PWM2L
20
;RB14 PWM1H
21
;RB15 PWM1L
22
23
24
25
.title "MFG DDS"
26
.sbttl "" ; Firmware Version
27
28
.equ __33EP256MC202, 1 ; Define the type of MCU
29
.include "P33EP256MC202.inc" ; Include the definitions for the
30
; selected MCU
31
32
; CONFIG
33
;config __FPOR, PWRT_128 ; PWRT 128ms
34
;config __FOSC, CSW_FSCM_OFF & FRC_LO_RANGE ; LOW RANGE
35
;config __FWDT, FWDTEN_OFF & WINDIS_OFF ; WDT OFF
36
;config __FOSCSEL,FRC_PLL ; FRC PLL
37
;config __FGS, CODE_PROT_OFF
38
;config __FICD, ICS_NONE ; kein ICS
39
;config __FBS, NO_BOOT_CODE
40
41
42
.global __reset
43
__reset: ; hier setzt der PIC nach einem Reset ein
44
45
46
47
.text ; hier geht der asm code weiter!
48
49
mov #__SP_init,w15 ; Initalize the Stack Pointer
50
; mov #0x2AFEA,W0 ; Initialize the Stack Pointer Limit Register
51
; mov W0,SPLIM ; (__SP_init & __SPLIM_init values are calculated by linker)