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 :oops: )
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