Witam!
Mam takie problem, starałem się napisać program w C dla szyny I2C.
Wszystkie ustawienia portu napisałem tak jak było pokazane w przykładowym programie (assembler) z TI. Czy może mi ktoś powiedzieć czemy procek nie dogaduje się z układem?
Jak uruchomię program w asemblerze to wszystko działa, a jak mój w C to nic...
Jedynie z czym jeszcze mam problem to ustawienie stosu na wartość 0x300. Nie wiem jak sie odwołać do stosu w C, gdyż wyskakuje mi błąd że dana zmienna nie jest zdeklarowana
Dla dokładniejszego zapoznania sie z problemem przesyłam wam kod z TI:
Jak ktoś by mi mógł wytłumaczyć, dlaczego nie dokonuje sie ustawienia portu OUT tylko DIR to też byłbym wdzięczny!
Dzięki za pomoc
pozdrawiam
Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
Mam takie problem, starałem się napisać program w C dla szyny I2C.
Wszystkie ustawienia portu napisałem tak jak było pokazane w przykładowym programie (assembler) z TI. Czy może mi ktoś powiedzieć czemy procek nie dogaduje się z układem?
Jak uruchomię program w asemblerze to wszystko działa, a jak mój w C to nic...
Jedynie z czym jeszcze mam problem to ustawienie stosu na wartość 0x300. Nie wiem jak sie odwołać do stosu w C, gdyż wyskakuje mi błąd że dana zmienna nie jest zdeklarowana

Dla dokładniejszego zapoznania sie z problemem przesyłam wam kod z TI:
#define RXTXI2C R7 ; I2C Receive/Transmit Register
#define ADDRI2C R8 ; I2C Address Register
#define DATAI2C R9 ; I2C Data Register
#define BITI2C R10 ; I2C Bit Counter Register
;
; Definitions for I2C bus
DACADDR equ 098h ; DAC8574 HW Address (A0=A1=0+WR)
DACCTRL equ 034h ; DAC Control Word (Broadcast to all DAC Channels)
SCL equ 001h ; P2.0 controls SCL line (pull-up)
SDA equ 002h ; P2.1 controls SDA line (pull-up)
TRIG equ 001h ; Trigger point
;******************************************************************************
#include ”msp430x44x.h”
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
; 16−bit Sine Lookup table with 256 steps
.
.
.
.
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ORG 0F000h
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
RESET mov.w #300h,SP ; Initialize stack−pointer
call #Init_Sys ; Initialize system
clr.w R6
One_Shot
; bis.b #TRIG,&P4OUT ; Toggle Trigger
; bic.b #TRIG,&P4OUT
mov.b #DACADDR,RXTXI2C ; Load DAC8574 Address
call #I2C_Start ; Generate Start Condition
call #I2C_TX
call #I2C_Stop ; Generate Stop Condition
mov.b #DACADDR,RXTXI2C ; Reload DAC8574 Address
call #I2C_Start ; Repeat Start
call #I2C_TX
mov.b #DACCTRL,RXTXI2C ; Load DAC8574 Control Byte
call #I2C_TX
Write_Data
mov.w #0FFh,R6
mov.w #0,R5
Again mov.w Sin_tab(R5),DATAI2C
swpb DATAI2C ; MSB first
call #Write_I2C
swpb DATAI2C ; LSB next
call #Write_I2C
incd.w R5
sub.w #1,R6
and.w #0FFh,R6
jnz Again
jmp Write_Data
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Init_Sys; Subroutine sets up Modules and Control Registers
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
SetupFLL2 bis.b #FN_4,&SCFI0 ; x2 DCO, 8MHz nominal DCO
bis.b #DCOPLUS+XCAP14PF,&FLL_CTL0 ; DCO+, configure load caps
mov.b #121,&SCFQCTL ;(121+1) x 2 x 32768 = 7.99 MHz
SetupPorts mov.b #0FFh,&P1DIR ; Set port to outputs
clr.b &P1OUT ; P1OUTs = 0
mov.b #0FFh,&P2DIR ; Set port to outputs
clr.b &P2OUT ; P2OUTs = 0
mov.b #0FFh,&P3DIR ; Set port to outputs
clr.b &P3OUT ; P3OUTs = 0
mov.b #0FFh,&P4DIR ; Set port to outputs
clr.b &P4OUT ; P4OUTs = 0
mov.b #0FFh,&P5DIR ; Set port to outputs
clr.b &P5OUT ; P5OUTs = 0
mov.b #0FFh,&P6DIR ; Set port to outputs
clr.b &P6OUT ; P6OUTs = 0
ret ;
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Write_I2C
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
mov.b DATAI2C,RXTXI2C ; Load Out−Going Data
call #I2C_TX ; Send Data and Acknowledge
ret ; Return from subroutine
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
I2C_Start; enter SDA=1, SCL=x
; exit SDA=1, SCL=0
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
bic.b #SCL+SDA,&P2DIR ; SCL and SDA to input direction
bic.b #SCL+SDA,&P2OUT ; SCL=1, SDA=1
bis.b #SDA,&P2DIR ; SDA=0
bis.b #SCL,&P2DIR ; SCL=0
ret
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
I2C_TX; enter SDA=x, SCL=0
; exit SDA=1, SCL=0
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
mov #08,BITI2C ; number of bits to transfer
I2C_TX_Bit rla.b RXTXI2C ; data bit −> carry
jc I2C_TX1 ; test carry for 1 or 0
I2C_TX0 bis.b #SDA,&P2DIR ; SDA=0
jmp I2C_TXx ; Toggle SCL
I2C_TX1 bic.b #SDA,&P2DIR ; SDA=1
jmp I2C_TXx
I2C_TXx bic.b #SCL,&P2DIR ; SCL=1
nop ; delay to meet I2C spec
nop ;
bis.b #SCL,&P2DIR ; SCL=0
dec BITI2C ; all bits read?
jnz I2C_TX_Bit ; continue until 8 bits are sent
bic.b #SDA,&P2DIR ; SDA=1, release SDA line for acknowledge
;
TX_Ackn bic.b #SCL,&P2DIR ; SCL=1
nop ; delay to meet I2C spec
nop ;
bis.b #SCL,&P2DIR ; SCL=0
ret ; Return from subroutine
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
I2C_Stop; enter SDA=x, SCL=0
; exit SDA=1, SCL=1
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
bis.b #SDA,&P2DIR ; SDA = 0
bic.b #SCL,&P2DIR ; SCL = 1
bic.b #SDA,&P2DIR ; SDA = 1
I2C_End ret ; Return from subroutine
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
; Interrupt Vectors Used MSP430F449
;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ORG 0FFFEh ; MSP430 RESET Vector
DW RESET ;
END
Jak ktoś by mi mógł wytłumaczyć, dlaczego nie dokonuje sie ustawienia portu OUT tylko DIR to też byłbym wdzięczny!
Dzięki za pomoc
pozdrawiam
Proszę umieszczać listingi programów w znacznikach "Code". [c_p]