Ik ben bezig met een klein temperatuurmetertje met een tiny15L. Ik gebruik de interne ADC in "free running mode" dus zou er steeds een andere waarde in ADCH moeten staan als de spanning op PB2 veranderd. Op PB0 staat de referentiespanning. Op PB2 zit een LM35.

Het programma stuurt een RGB LED aan (op PB 5,4,3), nu nog even op een zeer primitieve manier om te kunnen testen. Het rare alleen is dat PB5 laag wordt en PB4 en PB3 hoog blijven, ongeacht de spanningen op PB2 en PB0.

Ik heb de reset pin uitgeschakeld tijdens het programmeren, dat is dus ook niet de fout. Wie heeft een idee wat het wel kan zijn?


.include "tn15def.inc"
 
.def	temp 	= r16
 
.equ	SPD_VAL	= 50	
 
.org $000
rjmp RESET
 
;.org $005
;rjmp tmr_ovf

.org $009
rjmp main
 
RESET:
cli
 
;ports
ldi temp,	56
out DDRB, 	temp
ldi temp,	58
out PORTB, 	temp
 
;counter/timer
;ldi temp,	2
;out tccr0, 	temp	;set the counter to CK/8 speed
;ldi temp,	2
;out TIMSK,	temp	;set the counter interupt on
 
;internal ADC
ldi	temp,	97		;0b01100001
out admux,	temp
ldi	temp,	164		;0b10100100
out adcsr, 	temp
ldi	temp,	228		;0b11100100
out adcsr, 	temp
 
;interupt enable
sei
 
rjmp	main
 
MAIN:
in	temp,	adch
andi 	temp,	56
ori	temp,	2
out	portb,	temp
rjmp	main

EDIT: PB5 werkt wel goed zo te zien, de output daarvan is correct. Over het hele bereik gaat ie 4 keer aan en uit, komt omdat het MSB3 is (beginnend bij 1). PB4 zou dat 8 keer moeten doen en PB3 16 keer... Maar die twee doen helemaal niets... Is mijn AVR d00d? :'(

EDIT2: LAAT MAAR! Ik ben een beetje dom aan het worden geloof ik. 20 keer de code doorgelezen en niet snappen dat ddrb in de main portb moet zijn. |:(

Jah, da's waar! :D

Nu heb ik alleen nog een vraagje. Die ADC werkt niet echt lekker en PB5 ook niet. Het werkt wel enigzins, maar niet zoals het moet. Ik gebruik een externe referentiespanning van 640mV wat neer komt op 2,5mV per stapje van de ADC. Op PB2 zit een LM35 temperatuursensor, die werkt goed. Nu zou ik dus temperaturen tot 64 graden moeten kunnen meten (toch?), maar het gaat maar tot de 30 ongeveer. :(

Het probleem met PB5 is dat ie niet hoog wordt, een externe pullup zou dit moeten verhelpen, maar dat werkt niet...

Iemand ideeen?

Bij 640mV ref zou idd de te meten range 0-64 graden zijn wat de ADC weergeeft als 0-255. De gemeten waarde AND je echter met 56. Klopt dat wel?
PS, je output gaat nu toch wel naar PortB he?

[Bericht gewijzigd door Atlantis op ]

56 is binair 00111000, daar and ik mee zodat ik drie bits over hou, dan doe ik or met twee dus krijg ik 00xxx010 in temp te staan en dat gooi ik op portB.

Dan zouden alleen PB3-5 (waar de RGB aan hangt) moeten veranderen. Zo krijg ik dus geen ongewenste effecten door aan en uitschakelende pullup's! De pullup van PB1 staat aan zodat ik de schakelaar die hieraan hangt uit kan lezen.

toch goed zo?

wat is de minimale referentiespanning voor een AVR eigenlijk? Misschien dat ik daar onder zit ofzo? Of zie ik ergens een vermenigvuldigings- of delingsfactor over het hoofd?

De output van de ADC is voor de hele temperatuur range d 0-255, h 0-FF en b 00000000-11111111. Daarvan gebruik je alleen bit 3-5 en die stuur je naar het Data Direction Register van poort B volgens je listing. Kennie goei werke :)

Nee, klopt, het doet nog weinig, maar het is ook alleen maar een testprogrammaatje.

Maar PB5 zou toch moeten veranderen?!? Ik krijg met geen mogelijkheid de pin hoog (en er zit wel een externe pullup aan, die heeft PB5 niet intern zitten), het lijkt erop dat de poort opgeblazen is, maar dat kan bijna niet, twee tiny's doen precies hetzelfde! :(

Iemand met een tiny15 die ff kan proberen of ie PB5 kan laten werken? Bij voorbaat dank!

Schrijf anders een programmaatje waarbij je uitsluitend 1 en 0 naar PB5 schrijft met een vertragingetje.

Helaas, heb ik ook al geprobeerd... Nou ja, ik bedenk wel weer wat anders.

Ook geen sluiting naar de 0 op je printje? Ik zeg maar wat want als ik de datasheet van de AT tiny 15l bekijk is PB5 net zo'n port als alle andere: je zet hem in output mode via DDRB en je schrijft er naar toe wat je maar wilt...

56 is binair 00111000, daar and ik mee zodat ik drie bits over hou, dan doe ik or met twee dus krijg ik 00xxx010 in temp te staan en dat gooi ik op portB.

andi temp, 56
ori temp, 2

volgens mij:

andi temp, 0x20 ;alleen bit5

?

Op 2 mei 2003 22:57:19 schreef Atlantis:
Ook geen sluiting naar de 0 op je printje? Ik zeg maar wat want als ik de datasheet van de AT tiny 15l bekijk is PB5 net zo'n port als alle andere: je zet hem in output mode via DDRB en je schrijft er naar toe wat je maar wilt...

Nee, geen sluiting... PB5 is hetzelfde te besturen en gewoon een onderdeel van PortB inderdaad, het enige verschil is dat PB5 maar 12mA kan sinken en dat het een open drain output is of een input zonder pullup, daarom heb ik een 18k weerstand naar de 5V eraan gezet, wat ook niets uithaalde.

Het kan zijn dat de tiny's gesloopt zijn door een ander printje waar ze op hebben gezeten, daar hing PB5 (maar ditmaal geprogrammeerd als reset pin) aan de 5V. Dat moet toch gewoon kunnen?

Ik krijg misschien binnenkort van iemand een nieuwe tiny15L, misschien dat die het wel gaat doen, hoop van wel. Waar kun je eigenlijk 15L's kopen voor een mooie prijs en in kleine aantallen?!

EDIT: RobSki, ik heb het zo gedaan omdat aan PB3 en PB4 twee andere LEDs van de RGB LED hangen. Zo stuur ik dus alledrie de LEDs aan. 3 en 4 doen het goed, PB5 alleen niet.

Jeeeeuj, het werkt!!! Bij 20 graden is m'n RGB LED nu blauw en die fadet (via groen en geel) naar rood bij 64 graden.

Ik schakel de LED op PB3-5 nu door DDRB te veranderen en PORTB op 0 te laten. Als ik een pin in DDRB hoog maakt wordt de pin een uitgang die laag is. De PNP transistor zal dan geleiden. Zet ik een 0 in DDRB dan wordt de pin ingang en spert de tor. Vieze methode, maar het werkte ff niet anders.

Zo kan het ook ja :D Gefeliciteerd!!