Zaslal: ne květen 11 2008, 20:14 Předmět: AVR TWI/I2C
Ahojte, snazim sa rozchodit TWI na ATmega8 ale vobec sa mi nedari. Nedokazem vyslat ani startovaciu sekvenciu
Nemohol by tu niekto dat fragment programu kde je tato komunikacia vyuzita? Alebo link na program?
Jasne, ze som hladal v googli ale nasiel som len pisane v Ccku a ja to chcem pisat v assembleri.
VDAKA
.DEF reg=r16
.def treg=r17 ;definice I2C
.def Citac=r18 ;Pomocná proměná
.def Hodnota_Manualni=r19 ;registr pro nastavenou manuální hodnotu
.def LED0=r20
.def LED1=r21
.def LED2=r22
.def LED3=r23
.def LED4=r24
.def Poc=r27
.equ Smer=4 ;druhý vývod z rotačního enkodéru je na PD4
.equ Tlacitko=2 ;tlačítko je připojeno na PD2
.equ delicka=3
.equ T1H=155 ;155
.equ T1L=220 ;200
.equ start=$08 ;definice I2C START
.equ mt_sla_ack=$18 ;adresa slave
.equ mt_data_ack=$28 ;data
;===========================================================
;Obvod TDA8444 8x6bitová DA převodník
;===========================================================
.equ Adresa_TDA8444=0b01000000;adesa obvodu TDA8444, uzemnneny adresy A2,A1,A0
.equ TDA8444_DA0=0b11110000 ;prvni DA převodník
.equ TDA8444_DA1=0b11110001 ;druhy DA převodník
.equ TDA8444_DA2=0b11110010 ;treti DA převodník
.equ TDA8444_DA3=0b11110011 ;ctvrty DA převodník
.equ TDA8444_DA4=0b11110100 ;paty DA převodník
.equ TDA8444_DA5=0b11110101 ;sesty DA převodník
.equ TDA8444_DA6=0b11110110 ;sedmy DA převodník
.equ TDA8444_DA7=0b11110111 ;osmy DA převodník
;*******************************************************************
;Začátek programu
;*******************************************************************
.cseg
.org $0000
rjmp Reset
.org INT0addr
rjmp INT_Switch
.org INT1addr
rjmp INT_Smer
Reset: ldi r16,high(ramend)
ldi r17,low(ramend)
out sph,r16
out spl,r17
;********************************************************
;nastavení IO
;********************************************************
; ldi reg,$00
; out ddrd,reg ;portD,B jako vstup
; out ddrb,reg
; ldi reg,$ff
; out portd,reg ;zdvikací odpory připojeny
; out portb,reg
; out ddrc,reg ;portC jao výstup
ldi reg,$00
out ddrc,reg
out ddrd,reg
ldi reg,$ff
out portc,reg
out ddrb,reg
out portd,reg
;********************************************************
;Nastavení přenosové rychlosti pro TWI sběrnici cca 100kHz
;********************************************************
ldi reg,$00
out twsr,reg
ldi reg,72
out twbr,reg
;********************************************************
;test zda se bude provádět automatický nebo manuální režim
;testuje se při startu programu, tzn. pro změnu režimu je potřebný reset!!!!!
;přepínač je připojen na PD0
;+5V - Manuální režim
;GND - Automatický reřim
;********************************************************
Test_ON:sbis pind,0
rjmp Automatika
rjmp Manual
;********************************************************
;Mannuální režim ovládá se připojeným rotačním enkodérem. nejdříve se stiskem tlačítka kterým je vybaven
;vebere kanál na který se bude zapisovat a poté se natočí hodnota která se uloží a zapíše do DA převodníku
;Tlačítko je připojeno na INT0 (PD2) a výstupy z enkodéru jsou připojeny na INT1(PD3) a PD4
;Přerušení je vyvoláno na sestupnou hranu 1->0 = INT :-)
;********************************************************
Manual: ldi reg,10 ;nastavení přerušení
out mcucr,reg
ldi reg,0b11000000
out gicr,reg
ldi reg,255 ;nastavení hodnot pro test jestli nebylo nastaveno
mov r0,reg ;více nebo méně
ldi reg,64
mov r1,reg
ldi reg,6
mov r7,reg
;--------------------------------------------------------
;přerušení od stisknutí Switche na enkodéru
;--------------------------------------------------------
INT_Switch:push r16
in r16,sreg
push r16
push r17
inc Citac
rcall Test_Konec
rjmp Konec_INT2
Test_Konec:cpse Citac,r7
ret
ldi Citac,0
ret
Konec_INT2:pop r17
pop r16
out sreg,r16
pop r16
reti
;--------------------------------------------------------
;přerušení od změny směru tzn. hodnoty do DAC
;--------------------------------------------------------
INT_Smer:push r16
in r16,sreg
push r16
sbic pind,Smer
rjmp Pricti
rjmp Odecti
Pricti: inc Hodnota_Manualni
rcall Test_Max
rjmp Konec_INT
Odecti: dec Hodnota_Manualni
rcall Test_Min
rjmp Konec_INT
Test_Min:cpse Hodnota_Manualni,r0
ret
ldi Hodnota_Manualni,0
ret
Test_Max:cpse Hodnota_Manualni,r1
ret
ldi Hodnota_Manualni,63
ret
Konec_INT:pop r16
out sreg,r16
pop r16
reti
;********************************************************
;Automatický režim
;********************************************************
Automatika:nop
Loop2: ldiw R30,Tabulka*2 ;uloží adresu tabulky
ldiw R28,308 ;vloží počet kroků 64+64 na každou LED*5
Loop1: lpm R20,Z+ ;5*načte hodnotu do každého registru zvlášť
lpm R21,Z+
lpm R22,Z+
lpm R23,Z+
lpm R24,Z+
;neco s tim
rcall Zapis_Nulty
rcall Zapis_Prvni
rcall Zapis_Druhy
rcall Zapis_Treti
rcall Zapis_Ctvrty
rcall cekej ;vyvolá časovou smyčku cca 50ms
sbiw R28,1
brne Loop1
rjmp Loop2
;********************************************************
;podprogramy pro zapisování do DA převodníku
;********************************************************
Zapis_Nulty: rcall I2C_Start
ldi treg,Adresa_TDA8444;nastavení pro zapis do tda 8444
rcall I2C_Adresa
ldi treg,TDA8444_DA0
rcall I2C_Data
mov treg,r20
rcall I2C_Data
rcall I2C_Stop
ret
Zapis_Prvni: rcall I2C_Start
ldi treg,Adresa_TDA8444;nastavení pro zapis do tda 8444
rcall I2C_Adresa
ldi treg,TDA8444_DA1
rcall I2C_Data
mov treg,r21
rcall I2C_Data
rcall I2C_Stop
ret
Zapis_Druhy: rcall I2C_Start
ldi treg,Adresa_TDA8444;nastavení pro zapis do tda 8444
rcall I2C_Adresa
ldi treg,TDA8444_DA2
rcall I2C_Data
mov treg,r22
rcall I2C_Data
rcall I2C_Stop
ret
Zapis_Treti: rcall I2C_Start
ldi treg,Adresa_TDA8444;nastavení pro zapis do tda 8444
rcall I2C_Adresa
ldi treg,TDA8444_DA3
rcall I2C_Data
mov treg,r23
rcall I2C_Data
rcall I2C_Stop
ret
Zapis_Ctvrty: rcall I2C_Start
ldi treg,Adresa_TDA8444;nastavení pro zapis do tda 8444
rcall I2C_Adresa
ldi treg,TDA8444_DA4
rcall I2C_Data
mov treg,r24
rcall I2C_Data
rcall I2C_Stop
ret
;*********************************************************
;rutina na obsluhu I2C sběrnice
;*********************************************************
;vyšle START stav
I2C_Start:ldi treg,(1<<twint)|(1<<twsta)|(1<<twen)
out twcr,treg
rcall I2C_Ready
in treg,twsr
andi treg,$f8
cpi treg,$08
ret
;čeká na dokončení přenosu
I2C_Ready:in treg,twcr
sbrs treg,twint
rjmp I2C_Ready
ret
;odešle adresu z TREG
I2C_Adresa:out twdr,treg
ldi treg,(1<<twint)|(1<<twen)
out twcr,treg
rcall I2C_Ready
in treg,twsr
andi treg,$f8
cpi treg,$18
ret
;odešle data z TREG
I2C_Data:out twdr,treg
ldi treg,(1<<twint)|(1<<twen)
out twcr,treg
rcall I2C_Ready
in treg,twsr
andi treg,$f8
cpi treg,$28
ret
;vyšle stop stav
I2C_Stop:ldi treg,(1<<twint)|(1<<twsto)|(1<<twen)
out twcr,treg
stopt: in treg,twcr
sbrc treg,twsto
rjmp stopt
ret
;*********************************************************
;čekací smyčka pro automatický režim
;čeká cca 50ms
;*********************************************************
CEKEJ: push r17
push r18
push r19
LDI R17,4
LDI R18,0
LDI R19,0
CEKEJA: DEC R19
BRNE CEKEJA ;smyčka 1
DEC R18
BRNE CEKEJA ;smyčka 2
DEC R17
BRNE CEKEJA ;smyčka 3
pop r19
pop r18
pop r17
RET ;návrat
Caven DIKY za inspiraciu! Vyzera to tak, ze minimalne tu startovaciu sekvenciu mam rovnaku ako ty ale ked som to simuloval v AVR studiu tak to nerobilo to co som od toho cakal. Na nejakej diskusii som cital, ze TWI v AVR studiu odsimulovat nejde - nevies nieco o tom? Ak to nejde tak moj problem bude asi tam, ze kod mam sice dobre napisany ale odsimulovat to nejde asi budem musiet dat najskor dokopy HW. Ako maju byt nastavene piny SCL SDA? Alebo su nastavene automaticky oko treba ked je pouzita TWI?
zatial to nema robit nic konkretne - iba sa chcem naucit robit s tym TWI... asi to vyskusam na takom module kde mam obvod SAA1066, ktory riadi (multiplexuje) 4x7segmentovky... Len neviem kedy sa k tomu dostanem.
Huraaa uz mi to "chodi". Po niekolkohodinovom pozerani datasheetu, testovani, skusani a pozerania inych programov som zistil, ze v programe mi chyba test - podprogram, ktory je v programe vyzsie uvedeny ako I2C_ready... no co uz, ale PODARILO sa
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.