Hoi allemaal,

Ik ben net (vandaag) begonnen met AVR's. Ik heb een programma van internet gehaald voor op de AVR, hiermee ging de LED netjes knipperen. Ik heb de code daarna wat aangepast zodat twee LED's 3 om 3 keer gaan knipperen (het echte politielicht dus :p). Het werkt wel, maar ze lijken wel opeens sneller en zwakker te knipperen, dus volgens mij heb ik iets niet goed gedaan. Kan ik wel rechtstreeks een LED op de uitgang aansluiten?

Dit is de code van internet:

.include "tn13def.inc"

.def mp = r16
.def t1 = r17
.def t2 = r18
.def temp = r19

rjmp main

delay:
	clr t1
	clr t2
	ldi temp, 100
delaywalk:
	;dec T2		;
	;brne delaywalk	; uncomment these for longer delay
	dec T1		; 256 x 100 x 3 = 76800 cycles
	brne delaywalk	; standard ATtiny13 clock is 9.6Mhz
	dec temp	; 9.6Mhz/8 (divider) = 1.2Mhz a cycle
	brne delaywalk	; total delay time = +/- 64 ms (with temp on 100)
	ret		; go back to where you came from


main:
	ldi   	mp,0b00001000 ; PB3
	out   	DDRB,mp		

loop:
	LDI   mp,0x00
	OUT   PORTB,mp		

	rcall delay

	LDI   mp,0xFF
	OUT   PORTB,mp		

	rcall delay

rjmp loop

En dit is de door mij aangepaste versie:

/*
 * Politie_licht.asm
 *
 *  Created: 16-5-2011 21:16:30
 *   Author: Berry
 */ 

 .include "tn13def.inc"

.def mp = r16
.def t1 = r17
.def t2 = r18
.def temp = r19

rjmp loop

delay:
	clr t1
	clr t2
	ldi temp, 100
delaywalk:
	;dec T2		;
	;brne delaywalk	; uncomment these for longer delay
	dec T1		; 256 x 100 x 3 = 76800 cycles
	brne delaywalk	; standard ATtiny13 clock is 9.6Mhz
	dec temp	; 9.6Mhz/8 (divider) = 1.2Mhz a cycle
	brne delaywalk	; total delay time = +/- 64 ms (with temp on 100)
	ret		; go back to where you came from

loop:
	;LAMP1
	LDI   mp,0b00000000
	OUT   PORTB,mp		
	rcall delay

	LDI   mp,0b00001000
	OUT   PORTB,mp		
	rcall delay

	LDI   mp,0b00000000
	OUT   PORTB,mp		
	rcall delay

	LDI   mp,0b00001000
	OUT   PORTB,mp		
	rcall delay

	LDI   mp,0b00000000
	OUT   PORTB,mp		
	rcall delay

	LDI   mp,0b00001000
	OUT   PORTB,mp		
	rcall delay

	;LAMP2
	LDI   mp,0b00000000
	OUT   PORTB,mp		
	rcall delay

	LDI   mp,0b00010000
	OUT   PORTB,mp		
	rcall delay

	LDI   mp,0b00000000
	OUT   PORTB,mp		
	rcall delay

	LDI   mp,0b00010000
	OUT   PORTB,mp		
	rcall delay

	LDI   mp,0b00000000
	OUT   PORTB,mp		
	rcall delay

	LDI   mp,0b00010000
	OUT   PORTB,mp		
	rcall delay
rjmp loop

Zien jullie wat ik fout doe, of hebben jullie misschien een betere en kortere code (en graag uitleg)?

Groetjes,
Berry

Een led moet je niet rechtstreeks op de uitgang aansluiten, maar altijd met een voorschakelweerstand. Voor het berekenen van de voorschakelweerstand zijn er veel programma's te vinden d.m.v. google. Een weerstand van 1K is wel een makkelijke waarde voor het testen van een ledje.

Is dat om de AVR te beschermen of de LED? De LED maakt me niet zo veel uit namelijk :)

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

In eerste instantie de LED. Maar je weet maar nooit wat er nog meer fout gaat als die doorfikt. Verder, wat heb je er aan als je elke keer een LED moet vervangen?

Niks natuurlijk, maar hij bleef het gewoon doen zonder weerstand. Maar dat is eigenlijk het probleem niet, het gaat me meer om het script :P. Ik weet niet hoeveel spanning er op de uitgang komt? Het is namelijk niet te meten als hij steeds aan en uit gaat.

Edit:
Het script lukt nu wel, maar de uitgangen van de AVR zijn zonder LED 5V en met led maar 1,6 ongeveer. Dus de LED is heel zwak, en met een 1k nog zwakker. Hoe kan dat?

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

wat voor leds zijn het? hoeveel spanningsval hebben ze?

en hoe ziet je schema eruit?

Een AVR kan 40mA leveren op een uitgang en iets van 200mA totaal; dit geldt voor alle AVR's. Een LED kan afhankelijk van het type continu ongeveer 25mA hebben, daarboven gaat hij kapot. Meestal gaat hij dan eerst minder fel branden. Kijk even naar dit schema als voorbeeld : http://www.meeps.nl/mini-projecten/8-miniproject-lightbar

Ik heb de fout al ontdekt:
Ik heb geen output van de poorten gemaakt met DDRB. Nu wel, het werkt super :)

Op 16 mei 2011 23:18:58 schreef djoveld:
Een AVR kan 40mA leveren op een uitgang en iets van 200mA totaal; dit geldt voor alle AVR's. Een LED kan afhankelijk van het type continu ongeveer 25mA hebben, daarboven gaat hij kapot. Meestal gaat hij dan eerst minder fel branden. Kijk even naar dit schema als voorbeeld : http://www.meeps.nl/mini-projecten/8-miniproject-lightbar

Dat is wel handig om te weten voor ik hem opblaas :P

Bij deze is het dus opgelost ;)
Toch bedankt iedereen.

Formeel gaat zowel de led als de AVR buiten specs als je er niks tussen zet. Met een weerstand er tussen gaat het vaak meteen goed. Een enkele normale led kan je dan prima met een AVR output laten branden.

AVR outputs hebben een weerstand van ongeveer 25 ohm. Dus is je voeding 5V, trek je 40mA, is de spanningsval 40mA * 25 ohm = 1V. De spanning op de uitgang wordt dan dus 4V.... Of Atmel toestaat dat je 40mA trekt of dat ze zeggen dat de limiet minder is weet ik niet. Maar het werkt wel. Hoe lang doet atmel geen uitspraak over. Beter maar niet proberen....