Sida 1 av 1
Koppla en Tiny15 på kretskort
Postat: 31 december 2006, 15:43:23
av Knoen
Jag har försökt koppla in en Tiny15 på ett kopplingsdäck. Följande kod laddas ner till uC
;;;--- I/O-adresses for Port B ---
#define PINB 0x16
#define DDRB 0x17
#define PORTB 0x18
;;;--- Variables ---
.data
;;;--- subrutin init_func ---
.text
.global init_func
init_func:
LDI R20, 0x00001
OUT DDRB, R20
; Pull up PORTB
LDI R21, 0x1E
RET
Dessa körs i en loop gjord i C, init func körs i bara en gång. Sedan gå den in i en loop som körs i oändlighet men inte gör något.
Målet är att lampan kopplad till portb pin 1 ska lysa när den går in i den oändliga loopen.
Jag har förmodligen kopplat det fel på kopplingedäcket eftersom inget händer. Allt är stendött.
De pinnar som man inte använder, vad ska jag koppla dessa till? Räcker det med att sätta DDRB som 0x00001 och sedan sätta de övriga pinnarna på port b till 1?
Sedan när det gäller reset pinnen. Den har ju andra funktioner än att vara en ut eller indata pinne. Vad ska den egentligen kopplas till?
tacksam för hjälp!
Postat: 31 december 2006, 15:55:53
av thepirateboy
Hmmm, du skriver alltså kod i C och assembler och vill få en en lysdiod att lysa, är det det du vill åstadkomma?
Bland annat raden LDI R20, 0x00001 ser ju lite mysko ut, antingen skriver du 0x01 eller 0b00000001
Reset kan du koppla till 5 volt via ett 10k motstånd.
Postat: 31 december 2006, 16:29:49
av Knoen
Det stämmer, C o asm. Men har funderat på att byta till bara asm för enkelhetens skull.
Du har rätt, raden med LDI 20... ser lite mysko ut. Det är jag som hade lite bråttom att skriva

dock så hjälpte det inte att ändra
Inte heller hjälpte det att sätta reset till +5v med ett 10k motstånd mellan.
jag har definierat portb så här
#define PINB 0x16
#define DDRB 0x17
#define PORTB 0x18
Kan det stämma? Jag har läst i databladet och kommit fram till dessa adresser.
Ska försöka att antingen ändra till ett rent c program eller till ett rent asm program.
Postat: 31 december 2006, 17:32:01
av thepirateboy
Vad jag vet så kan man inte köra C på den lilla Tiny 15 och det finns ingen anledning heller eftersom den är så begränsad på minne. Men OK, jag gjorde ett litet program som blinkar en diod, det kan ju vara en bra början så vet man att allt är rätt kopplat. Lysdioden bör kopplas till jord via lämpligt motstånd, utgången orkar inte driva speciellt mycket.
Kod: Markera allt
;AVR Projekt - Blinkande LED
.include "tn15def.inc" ; Filen tn15def.inc inkluderas, AtTiny 15
.equ FREQ = 1600000 ; Frekvens 1,6Mhz
.def TEMP = R16 ; Register R16 får namnet TEMP
.org 0x0000 ; Placerar följande kod från och med adress 0x0000
rjmp RESET ; Hoppar till RESET
RESET: ; Reset
ldi TEMP, 0xFF ; Variabeln TEMP ettsätts
out DDRB, TEMP ; TEMP kopieras till Data Direction Register, hela PORTB blir utgång
START:
ldi TEMP, 0b00000010; Kopiera 0x02 till variabeln TEMP
out PORTB, TEMP ; Pinne 6, PB1 ettsätts
rcall DELAY_1S ; Hoppa till "funktionen" DELAY_1S
ldi TEMP, 0b00000000; Kopiera 0x00 till variabeln TEMP
out PORTB, TEMP ; PORTB nollställs
rcall DELAY_1S ; Hoppa till "funktionen" DELAY_1S
rjmp START ; Hoppa tillbaks till start
DELAY_1S: ; Funktionen delay_1s, 1 sekunds fördröjning
ldi R17, 0xF1
LOOP0: ldi R18, 0x0E
LOOP1: ldi R19, 0x9D
LOOP2: dec R19
brne LOOP2
dec R18
brne LOOP1
dec R17
brne LOOP0
ret ; Hoppa tillbaks och fortsätt
Postat: 31 december 2006, 18:25:08
av sodjan
> jag har definierat portb så här
>
> #define PINB 0x16
> #define DDRB 0x17
> #define PORTB 0x18
De där definitionerna *måste* finnas i någon "include" -fil.
För assembler heter den tydligen "tn15def.inc", i C-kompilatorn
kanske den heter något annat (eller läses in automatiskt).
Det kan inte vara meningen att man ska göra det själv...
Postat: 1 januari 2007, 01:30:49
av Stinrew
Vad jag vet så kan man inte köra C på den lilla Tiny 15
Det stämmer! Den har inget RAM-minne, jag vill minnas att detta är ett krav för att kunna köra C-kod på AVR.
jag har definierat portb så här
#define PINB 0x16
#define DDRB 0x17
#define PORTB 0x18
Jag vet inte riktigt vad det där betyder(jag kan inte asm

)
Men i C, definierar du ett portregister så här:
DDRB = 0x17;
Detta gör B0, B1, B2 och B4 till utgångar. Och givetvis dom andra Bx till ingångar.
PORTB-kommandot sätter utgångarna, och är det ingångar så slår kommandot på/av den interna pull-upen.
PORTB = 0x18;
Sätter alltså B0, B1 och B2 =0. Det slår på pull-upen på ingången B3, och det sätter utgången B4 =1.
PINB-kommandot läser in värdet på B-registrets 8 ben.
Postat: 1 januari 2007, 14:55:11
av sodjan
Semantik kanske men,
> DDRB = 0x17;
Jag vill påstå att det där inte *definierar* DDRB, det sätter ett *värde* på
registret DDRB.
"#define DDRB 0x17", däremot, är en *definition* av DDRB (men ger det
inget värde). D.v.s säger att "DDRB ligger på adress 0x17".
Och register-definitionerna ligger normalt (alltid ?) i include-filer.
Postat: 1 januari 2007, 15:38:31
av MicaelKarlsson
Knoen skrev:
jag har definierat portb så här
#define PINB 0x16
#define DDRB 0x17
#define PORTB 0x18
Varför skall du deffiniera PORT B?
Om det är assambler bör du ju precis som i C "tala om för" din AVR huruvida I/O portarna skall vara in/ut-portar. Men det görs väl knappast med #define.
Skulle nog gjort så här om jag var i dina skor:
.def temp =r16
rjmp Init
Init:
ser temp
out DDRB, temp
eller liknande.
Postat: 1 januari 2007, 15:48:38
av thepirateboy
Tar man inte med includefilen så måste man definera PortB precis som Knoen gjort. Det går precis lika bra, men det det är ju mycket enklare att ta med includefilen så får man med alla definitioner automatiskt.
Postat: 1 januari 2007, 15:52:00
av MicaelKarlsson
Jo, det är ju klart. Men varför ägna sig åt att "uppfinna hjulet på nytt"?
Postat: 1 januari 2007, 15:59:42
av Stinrew
sodjan skrev:Semantik kanske men,
> DDRB = 0x17;
Jag vill påstå att det där inte *definierar* DDRB, det sätter ett *värde* på
registret DDRB.
"#define DDRB 0x17", däremot, är en *definition* av DDRB (men ger det
inget värde). D.v.s säger att "DDRB ligger på adress 0x17".
Och register-definitionerna ligger normalt (alltid ?) i include-filer.
Aha!!! Tack för förklaringen.

Postat: 1 januari 2007, 21:11:55
av JBV
Jag har några Attiny15 och orkar inte lära mig assembler, men jag hittade den här sidan:
http://lightner.net/avr/ATtinyAvrGcc.html
kanske kan vara användbart?
Postat: 4 januari 2007, 06:51:49
av Swech
Det skall räcka att sätta DDRB som 1 och sedan PORTB som 1.
Ser dock inte i din kod att du sätter PORTB - endast DDRB
Prova
ldi r16,1
out ddrb,r16
out portb,r16
bör funka...
jonas