Hallo iedereen,
Op dit moment moet ik met een atmega8515 aan de slag voor school. De code is zo goed als af. Ik heb ook al de spullen en een soort van schakeling gemaakt. Ook het programmeren gaat goed. Nu moet ik doormiddel van een knop input geven zodat de 8 leds telkens een ander patroon laten zien. Ik heb dit zo geprogrammeerd dat als I/O poort A een signaal binnen krijgt op PINA 0 deze patronen gewisseld worden. Ik heb geprobeerd een knop tussen 5v en de pin in te zetten. Dit werkte helaas niet. Mij is verteld dat dit niet werkte omdat er zowiezo al 5v op die pinnen staat. Ik heb nu alleen geen idee hoe ik die knop zou moeten schakelen.
Dit is de eerste microcontroller waar ik mee werk dus als iemand mij zou kunnen vertellen hoe ik de knop moet aansluiten of mij helpt dit uit te vinden zou ik dit erg waarderen.
Met vriendelijke groet,
BlackUnknown
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
.include "8515def.inc"
.def Temp = R16
.def Temp2= R17
.def delay1 = R18
.def delay2 = R19
.org 0x0000
rjmp RESET
RESET:
ldi Temp, 0
out DDRA, Temp
ldi Temp, 255
out DDRB, Temp
rjmp StackpointerInit
StackpointerInit:
ldi Temp, low(RAMEND)
out SPL, Temp
ldi Temp, high(RAMEND)
out SPH, Temp
rjmp Loop4
Loop1:
out PORTB, Temp
dec Temp
rcall Delay
in Temp2, PINA
cpi Temp2, 1
breq ResetLoop1
rjmp Loop1
ResetLoop1:
ldi Temp, 0
out PORTB, Temp
rjmp Loop2
Loop2:
out PORTB, Temp
inc Temp
rcall Delay
in Temp2, PINA
cpi Temp2, 1
breq ResetLoop2
rjmp Loop2
ResetLoop2:
ldi Temp, 255
out PORTB, Temp
rjmp Loop3
Loop3:
ldi Temp, 0
out PORTB, Temp
rcall Delay
ldi Temp, 255
out PORTB, Temp
rcall Delay
in Temp2, PINA
cpi Temp2, 1
breq ResetLoop3
rjmp Loop3
ResetLoop3:
ldi Temp, 0
out PORTB, Temp
rjmp Loop4
Loop4:
sbi PORTB, 0
rcall Delay
sbi PORTB, 1
cbi PORTB, 0
rcall Delay
sbi PORTB, 2
cbi PORTB, 1
rcall Delay
sbi PORTB, 3
cbi PORTB, 2
rcall Delay
sbi PORTB, 4
cbi PORTB, 3
rcall Delay
sbi PORTB, 5
cbi PORTB, 4
rcall Delay
sbi PORTB, 6
cbi PORTB, 5
rcall Delay
sbi PORTB, 7
cbi PORTB, 6
rcall Delay
sbi PORTB, 6
cbi PORTB, 7
rcall Delay
sbi PORTB, 5
cbi PORTB, 6
rcall Delay
sbi PORTB, 4
cbi PORTB, 5
rcall Delay
sbi PORTB, 3
cbi PORTB, 4
rcall Delay
sbi PORTB, 2
cbi PORTB, 3
rcall Delay
sbi PORTB, 1
cbi PORTB, 2
rcall Delay
sbi PORTB, 0
cbi PORTB, 1
rcall Delay
in Temp2, PINA
cpi Temp2, 1
breq ResetLoop4
rjmp Loop4
ResetLoop4:
ldi Temp, 0
out PORTB, Temp
rjmp Loop5
Loop5:
sbi PORTB, 0
rcall Delay
sbi PORTB, 2
cbi PORTB, 0
rcall Delay
sbi PORTB, 1
cbi PORTB, 2
rcall Delay
sbi PORTB, 3
cbi PORTB, 1
rcall Delay
sbi PORTB, 2
cbi PORTB, 3
rcall Delay
sbi PORTB, 4
cbi PORTB, 2
rcall Delay
sbi PORTB, 3
cbi PORTB, 4
rcall Delay
sbi PORTB, 5
cbi PORTB, 3
rcall Delay
sbi PORTB, 4
cbi PORTB, 5
rcall Delay
sbi PORTB, 6
cbi PORTB, 4
rcall Delay
sbi PORTB, 5
cbi PORTB, 6
rcall Delay
sbi PORTB, 7
cbi PORTB, 5
rcall Delay
sbi PORTB, 6
cbi PORTB, 7
rcall Delay
cbi PORTB, 6
in Temp2, PINA
cpi Temp2, 1
breq ResetLoop5
rjmp Loop5
ResetLoop5:
ldi Temp, 255
out PORTB, Temp
rjmp Loop1
Delay:
ldi delay1, 255
ldi delay2, 100
DLY1:
DLY2:
dec delay1
brne DLY2
dec delay2
brne DLY1
ret
Lelijke code, maar daar moet je dan nu maar even niet op letten. Dit is namelijk mijn eerste keer dat ik zoiets gemaakt heb.
Ik snap dat op dit moment mijn code geen interrupts gebruikt en niet altijd het indrukken van de knop waarneemt. Maar als ik de knop een tijdje ingedrukt houdt dan zou hij moeten blijven knipperen. Dit gebeurt op dit moment ook niet.
BlackUnknown
BTW, dit kan je ook wel zien in avr-Studio.
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Beginners handleiding:
Ik snap nou niet wat ik met deze tutorial moet, want voor zover ik weet zit mijn probleem in de hardware schakeling. Ook gebruik ik de poorten voor zo ver ik heb gezien goed. Ik heb hulp nodig met een knop aansluiten en schakelen niet met de software.
Bedankt voor de tutorial deze zal ik later nog eens doornemen.
De vraag is nog steeds hoe sluit ik een knop aan op een I/O poort zodat deze een signaal doorgeeft als erop gedrukt wordt?
[Bericht gewijzigd door BlackUnknown op ]
rimco
Digitaal - Mijn ding :P
de knop naar de plus als je een 1k weerstand naar de min zet bijvoorbeeld
of de knop naar de min, en een 1k weerstand naar de plus indien nodig.
de avr heeft waarschijnlijk zelf ook al een weestand naar de plus, daarom is hij altijd al 5V waarschijnlijk
rimco
Digitaal - Mijn ding :P
Op 1 juni 2007 18:09:54 schreef BlackUnknown:
Dus wat je krijgt is 5v-> 1k weerstand ->PIN ->knop -> min?
bijvoorbeeld ja, de weerstand maakt hem standaard 5 volt, maar de knop trekt hem hard naar de min als je hem indrukt
de 1k mag ook 1-100k zijn, dan verbruikt het wat minder stroom;)
En deze 5v komt natuurlijk gewoon ook van de voeding van het ICtje? of moet dit van een andere spanningsbron?
Fossalta
Access violation at address 0x8BA82089. Read of address 0xC0FFEE in module coffee.sys. Please refill coffee bin and wait till i get back.
er zijn 3 registers voor I/O .. DDR PORT en PIN
als je DDR (Data Direction) op 0 zet/laat is het een input. Wanneer je in het PORT register een 1 zet zal er een pull-up aangezet worden. Dit betekend dat wanneer er geen knopje o.i.d. aanzit, je altijd een 1 inleest via het PIN register. Hiermee voorkom je dat de poort ongedefinieerd is.
Als je nu een knopje aansluit zul je hem dus naar de 0V (GND) moeten trekken om een wijziging te zien. (je leest dus geinverteerd in, maar dit is makkelijk op te lossen met de INV/COM instructie.
je schakeling gaat er dus zo uitzien:
Waar precies zit de knop Fossalta? of is dat de knop zo ja waar zit dan de weerstand? in feite is de com instructie nutteloos als ik de schakeling zo bouw toch?
[Bericht gewijzigd door BlackUnknown op ]
Fossalta
Access violation at address 0x8BA82089. Read of address 0xC0FFEE in module coffee.sys. Please refill coffee bin and wait till i get back.
knop
\/
+---+ _
| M |----| |----|GND
| E |
| G |
| A |
| 8 |
| 5 |
| 1 |
| 5 |
+---+
Meestal gebruik ik geen weerstanden voor knopjes. En als je het "makkelijk" in wilt lezen heb je wel degelijk de COM instructie nodig. Als de knop is ingedrukt lees je namelijk een 0 en anders een 1.
Hartstikke bedankt Roland van Leusden, rimco en Fossalta. Dankzij jullie kan ik nu eindelijk weer verder.
nogmaals bedankt!
BlackUnknown
Ik heb trouwens nog een klein vraagje. Je moet zowiezo 5v houden op de inverted reset van de atmega8515. Als ik de knop naar de ground toe laat wijzen zal mijn chip dan niet overal stroom kwijtraken en dus resetten?
Je moet de !Reset inderdaad (via een weerstandje!) hoog maken.
Wordt deze laag, dan reset je CPU. Wat er dan gebeurt, en wat er verder nog voor een reset kan zorgen staat allemaal op pagina 45 en verder van de datasheet.
Hang je !Reset direct aan Vcc dan begrens je de stroom niet en is het niet meer mogelijk om je µC zelf (of door ISP/JTAG) te resetten.
Bekijk overigigens AVR042 om te zien hoe je je AVR aan dient te sluiten
je hoort aan de !Reset ook nog een condensator en een diode (als je geen high-voltage programming gebruikt) te hangen 
Er zijn wel meer Application Notes met heel interessant leesvoer 
Ik wil eigenlijk dat hij nooit reset. Ik heb even de volgende schakeling opgezet.
wat zeggen jullie hiervan? Zou dit goed gaan?
BlackUnknown
[Bericht gewijzigd door BlackUnknown op ]
Nooit _uit zichzelf_ reset neem ik aan? Anders wordt programmeren wat lastig 
Ziet er niet heel verkeerd uit. Is dit je hele schema?
- 100nF C tussen Vcc en GND zo dicht mogelijk bij de chip als ontkoppeling, eventueel nog een L erbij om het af te maken.
- C van !reset naar GND als extra noise-filter
- Diode van !reset naar Vcc (Anode aan !reset) tegen ESD, die zit niet intern omdat dan high-voltage programmeren onmogelijk wordt.
- C over de knop heen als hardware debounce. Kun je ook in software doen. RC-tijd is de debounce tijd.
Ik dacht zelf dat als ik deze schakeling zo bouw dat hij elke keer als ik de knop indruk zou resetten. Dat is absoluut niet wat ik wil hebben want dan krijg je dus dat hij weer bij het eerste led patroontje begint.
De punten die je hebt genoemd zal ik er in opnemen alleen begrijp ik ze maar half omdat ik niet zo heel vaak met electronica werk. Wat ik er ook uit begrepen heb zit er niks bij om ervoor te zorgen dat als ik de knop indruk dat hij niet reset. En wat als ik de weerstand bij de reset pin lager houdt dan de weerstand bij de knop? dan zou de stroom toch die kant op moeten gaan? (Is dit wat je bedoelde met:"Je moet de !Reset inderdaad (via een weerstandje!) hoog maken.")
Dit is bijna mijn hele schakeling, het enige wat er nog niet in zit zijn de 8 ledjes en 8 weerstandjes tussen de ledjes en de chip. Deze vond ik overbodig om te tekenen.
BlackUnknown
Hij reset (dmv de reset-aansluiting, er zijn meer reset-mogelijkheden, zie de datasheet) alleen maar als je die laag trekt, dus zeg maar aan GND hangt.
Aangezien jouw knop op geen enkele manier aan de !Reset hangt zie ik niet in hoe hij daardoor zou moeten resetten?
Hoe goed is je Engels? De 1e 3 puntjes die ik noemde kwamen allemaal uit die AVR042 die ik een post eerder linkte.
Switch debouncen doe je omdat bij het overgaan van niet-ingedrukt naar ingedrukt je knopje een aantal keer op en neer klappert tot hij stabiel op ingedrukt staat. Bij loslaten gebeurt dat opnieuw.
Je controller is snel genoeg om ieder afzonderlijk pulsje bij dat klapperen te zien. Als jij denkt de knop 1x in te drukken kan de controller wel vinden dat het 10x is gedaan.
Beste kun je er zelfs nog een schmitt trigger achter zetten.
Dit _was_ zo ongeveer de beste uitleg die ik ben tegengekomen (stond dan ook bovenaan in Google) maar die geeft nu een 404 en Google's cache doet geen plaatjes...
Dit is ook wel een leuke uitleg alleen de mooie real-life scope-plaatjes ontbreken
En het is wat onleesbaar door de witte tekst op een grijze achtergrond, maar dat lost een Ctrl-A wel op 
Ik heb die avr042 wel bekeken maar die datasheets zijn net puzzles.
Ik zal kijken naar die debounce, want ik heb volgens mij hier al problemen mee gehad. Beginner zijnde had ik dit niet eens door.
Hopelijk kan ik nu weer verder. Hartstikke bedankt allemaal.
BlackUnknown
[Bericht gewijzigd door BlackUnknown op ]