volgens de datasheet van de attiny12 kun je PB05 ook als output gebruiken (open drain) als je de reset disabled.

nu heb ik een klein looplicht progje geschreven in avrstudio maar wanneer ik dit simmuleren staat PB05 bij portb grijs (niet bruikbaar dus).

wanneer ik dit programmeer blijft PB05 laag. de rest van de uitgangen lopen wel -> prog loopt

moet ik PB05 ook ergens in de software activeren? de fuses staan zeker juist.

voor de duidelijkheid even het prog:


.DEVICE ATtiny12
.INCLUDE "tn12def.inc"

;--------------------------------------------------------
;-> REGISTERS:						
;--------------------------------------------------------

.DEF temp = R16

;--------------------------------------------------------
;-> RESET & INTERRUPT VECTORS:						
;--------------------------------------------------------

.CSEG
.ORG 0000
	RJMP start

;--------------------------------------------------------
;-> MAIN-ROUTINE
;--------------------------------------------------------

start:
;	SEI				; Set Int Enable Bit
	LDI	temp,0b11111111
	OUT	DDRB,temp

loop:
	LDI	temp,0x00
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0xFF
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0x00
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0xFF
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0x00
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0xFF
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0x00
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0xFF
	OUT	PORTB,temp	
	RCALL delay

	LDI	temp,0b00000001	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00000011	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00000111	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00001111	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00011111	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00111111	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00000000
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00111110	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00111100	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00111000	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00110000	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00100000	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0x00	
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00010101
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00101010
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00010101
	OUT	PORTB,temp
	RCALL delay

	LDI	temp,0b00101010
	OUT	PORTB,temp
	RCALL delay

	RJMP	loop

;--------------------------------------------------------
;-> SUB-ROUTINES
;--------------------------------------------------------

delay:
; ============================= 
;    delay loop generator 
;     1200000 cycles:
; ----------------------------- 
; delaying 1199910 cycles:
          ldi  R17, $0A
WGLOOP0:  ldi  R18, $C6
WGLOOP1:  ldi  R19, $C9
WGLOOP2:  dec  R19
          brne WGLOOP2
          dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; ----------------------------- 
; delaying 90 cycles:
          ldi  R17, $1E
WGLOOP3:  dec  R17
          brne WGLOOP3
; =============================
	RET

[Bericht gewijzigd door Henry S. op (0%)]

Ben je er zeker van, dat de fuses goed staan? Om PB5 als I/O pin te gebruiken, moet het RSTDISBL-bit '0' zijn. Bedenk wel, dat je de AVR dan niet meer via ISP te programmeren valt!

ja ja deze staan goed. mijn vorig item ging namelijk over het niet ISP kunnen proggen van deze controller. ik dacht dat het probleem toen bij de interne klok lag maar het was dus het disablen van de reset.

ik moet toch gewoon een extra pull up aansluiten op PB5 (heb 10k gebruikt) en vervolgens heb ik een transistor genomen die een led schakeld

Met assembler ben ik niet vertrouwd. Maar ik heb de indruk dat je PB5 wil sturen als een gewone I/O-pin. Edoch, je moet PB5 sturen door het DDR-register te manipuleren. De datasheet zegt het zo:


On ATtiny12, it can also output a logical zero, acting as
an open-drain output. Note that, since PB5 only has one possible
output value, the output functionality of this pin is controlled
by the DDRB register alone.

voor de data direction heb ik heel poort B als output geconfigureerd. de pin wordt tijdens het programma herhaaldelijk eens hoog en laag. op mijn testbord blijft deze precies laag.

(ben ook nog maar beginnend met assembler vandaar dit simpel progje :) )

Als je nou DDRB 0b00011111 maakt, zou PB5 hoogohmig moeten worden.

zo stel ik hem toch in als ingang he?
meet ik dat dan tussen massa en poort?

Je stelt hem in als ingang, maar je hoeft hem niet als ingang uit te lezen.
Je kan die truuk trouwens met elke I/O-pin uithalen. Na een reset zijn die pinnen immers laag, zodra je het bijpassende DDR-bit hoog maakt. Met het DDR-bit kan je bijgevolg kiezen tussen "laag" en "hoogohmig".

even op een rijtje:

ik zet PB5 doormiddel van DDR op 0
vervolgens gebruik ik hem dan toch als uitgang?

Ja, hoe raar het ook mag klinken. Maak je er een "ingang" van, dan is PB5 hoogohmig. Maak je er een uitgang van, dan is PB5 laag. Dat geldt trouwens ook voor PB4 ... 0. Maar daar kan je de pin als uitgang configureren, en vervolgens hoog maken - en dat lukt niet met PB5.

dat zal ik dan eens testen.

klopt het dan als ik denk dat de DDR de interne pull ups regelt?

De interne pull-up's regel je door een pin als ingang te configureren, en ze vervolgens 1 of 0 te maken. Of dat voor PB5 ook opgaat, is me niet duidelijk. Proberen is de boodschap.

Mag ik proberen het uit te leggen? Wat ik er van begrepen heb is de hardware van PB5 wat "simpeler" uitgevoerd dan andere ports. Ze hebben het bitje PORTB.5 VAST op nul gezet. Kan best zijn dat je er een 1 naar schrijft maar dat doet verder niks.

Als je hem "input" programmeert, laat de chip de lijn los, en moet JOU (externe) pullup z'n werk doen. Maak je hem output, en is de reset-disable fuse geactiveerd, dan wordt ie nul.

wil dit zeggen dat je de poort niet moet aansturen met het out commando maar telkens de DDR-bit moet wijzigen.

Yep! Dat is het (voor zover ik het begrijp).

ja dat gaan we eens proberen deze avond he. zo lees ik dat toch niet in de datasheet. ik vind dat deze documenten toch soms iets te beknop zijn.

ja dat gaan we eens proberen deze avond he. zo lees ik dat toch niet in de datasheet. ik vind dat deze documenten toch soms iets te beknop zijn.

klopt het dat een looplichtje met 6 leds dit wordt??? (ik heb de wijzigingen aangeduid)


.DEVICE ATtiny12
.INCLUDE "tn12def.inc"

;--------------------------------------------------------
;-> REGISTERS: 
;--------------------------------------------------------

.DEF temp = R16

;--------------------------------------------------------
;-> RESET & INTERRUPT VECTORS: 
;--------------------------------------------------------

.CSEG
.ORG 0000
RJMP start

;--------------------------------------------------------
;-> MAIN-ROUTINE
;--------------------------------------------------------

start:
; SEI ; Set Int Enable Bit
LDI temp,0b11111111
OUT DDRB,temp

loop:

LDI temp,0b00000001 
OUT PORTB,temp
RCALL delay

LDI temp,0b00000011 
OUT PORTB,temp
RCALL delay

LDI temp,0b00000111 
OUT PORTB,temp
RCALL delay

LDI temp,0b00001111 
OUT PORTB,temp
RCALL delay

LDI temp,0b00011111 
OUT PORTB,temp
RCALL delay

LDI temp,0b00011111	;wijziging toegevoegd
out DDRB,temp		;wijziging toegevoegd (hier PB5 dan hoog worden?)
LDI temp,0b00111111
OUT PORTB,temp
RCALL delay

LDI temp,0b00000000
OUT PORTB,temp
RCALL delay

RJMP loop

;--------------------------------------------------------
;-> SUB-ROUTINES
;--------------------------------------------------------

delay:
; ============================= 
; delay loop generator 
; 1200000 cycles:
; ----------------------------- 
; delaying 1199910 cycles:
ldi R17, $0A
WGLOOP0: ldi R18, $C6
WGLOOP1: ldi R19, $C9
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; ----------------------------- 
; delaying 90 cycles:
ldi R17, $1E
WGLOOP3: dec R17
brne WGLOOP3
; =============================
RET  

[Bericht gewijzigd door Henry S. op (4%)]

Dat zou moeten werken. Voor het laag of hoog maken van 1 bit kan je ook de CBI en SBI instructies gebruiken. Daarmee kan je de poort rechtstreeks aanspreken, ipv. eerst een waarde in een register te plaatsen en dat vervolgens naar de poort te schrijven.

zal ik eens moeten testen, ik ben assembler via zelfstudie aan het leren, dat commando ben ik nog niet tegengekomen denk ik

Zomaar andermans Assembly code gaan controleren is lastig. Het zou kunnen dat je vergeet de DDR weer terug te zetten, dus dat je ledje op PB5 constant aanblijft na 1 cyclus.

nu je het zegt ja, klopt inderdaad ben ik vergeten. weer een beetje frustratie minder :)

ik heb dit ondertussen eens geprobeert en dat werkt inderdaad. hoe zou het komen dat ik dit niet gewoon via de out functie kan uitvoeren? volgens de datasheet is PB5 een uitgang (als je hem voorziet van die pull up)

Zie mijn eerste post in dit topic.

@ rew, ik begrijp het wel (duidelijk uitgelegd trouwens, bedankt) maar waarom zo werken? dat is toch helemaal niet logisch.