Hi!
Bin ein Neuling betreffend µCs.
Wollte bei meinem Atmega8 mit den externen Interrupts experimentieren.
Ich verwende das "Atmel Evaluations-Board Version 2.0.1" von Pollin.
Code rüberspielen ist kein Problem. Aber da ist noch irgend ein
logischer Fehler oder es fehlt irgendetwas. Liegt das am MCUCR? Habe
versucht auf "Any logical change on INTx generates an interrupt request"
zu stellen -- ISCx1 = 0, ISCx0 = 1.
Ich will per Tastendruck eine der zwei LEDs auf dem Board ausschalten.
Die Spannungspegel kommen auch am Controller an.
Also muss wohl oder übel ein Fehler im Code sein. peinlich :)
Hoffe ihr könnt mir helfen!
Danke im Voraus
Peter
@Sepp:
Entprellen ist doch Nebensache, weil ich die LED im Interrupt ja eh nur
ausknipse. Oder ist da brauchbarer Code dabei?
@Walter:
Dachte dafür ist das "sei()"?
Danke derweil
Peter
Frank wrote:
> @Walter:> Dachte dafür ist das "sei()"?
das ist für die globale Aktivierung, aber du musst natürlich noch die
ext. Interrupts selber enablen...siehe Tut
> Danke derweil> Peter
wie nun, Frank oder Peter
>@Walter:>Dachte dafür ist das "sei()"?
Manchmal ist Denken Glückssache...
Guck dir die Register deiner Interrupts an. DA wird irgendein Bit
"...Enable" heissen.
das ist das Problem,........
Tasten niemals mit Interrupt entprellen oder Abfragen !!
Gibt nur Ärger !!
Oder wieviele Interrupts löst Deine Taste aus ??
Die "Nebensache" fängt eben im Detail an !!
@jussa
Alles klar, okay danke. "GICR" könnte der richtige Weg sein.
Frank war neulich hier an meinem Rechner und ich hab nicht drangedacht,
dass ich den Namen noch oben ändern muss.
@stephan-
Das ist momentan nur zum Debuggen. Da kommt später schon ein sauberer
high/low-Pegel von einem IC hin. Bis jetzt hab ich eh nur hardwareseitig
entprellt.
Hätte auch eine Frage zum Interrupt, programmiere in Assembler mit dem
AtMega16 und irgendwie bekomm ich das nicht hin. Habe BTN7 an PD3
angeschlossen und die LEDS an PD0:3. Ohne Interrupts kann ich die LEDS
ganz normal ansteuern, beim Interrupt gibts halt Probleme:
.NOLIST
.INCLUDE "m16def.inc"
.LIST
.equ temp, 0x10
.equ leds, 0x11
.section .text
.org 0x0000
rjmp main
.org INT1addr
jmp EXT_INT1
main:
ldi temp, lo8(RAMEND)
out SPL, temp
ldi temp, hi8(RAMEND)
out SPH, temp
ldi temp, 0x00
out DDRD, temp
ldi temp, 0xFF
out DDRC, temp
ldi temp, 0XFF
out PORTD, temp
ldi temp, 0b00001000
out MCUCR, temp
ldi temp, 0b10000000
out GICR, temp
sei
infinite_loop:
rjmp infinite_loop
EXT_INT1:
ldi temp, 0XFF
out PORTC, temp
reti
Vielleicht kann mir ja jemand helfen, sitz schon Ewigkeiten herum und
mir fällt nichts mehr ein.
Lg
Hi
>Ohne Interrupts kann ich die LEDS ganz normal ansteuern, beim Interrupt >gibts
halt Probleme:....
1.Welche?
2. ldi temp, 0b00001000
out MCUCR, temp
ldi temp, 0b10000000
out GICR, temp
Schreibe mal lieber 'ldi tmp, 1<<xyz' Mit der Bitbezeichnung xyz. Ist
sicherer und auch ohne Datenblatt lesbar.
MfG Spess
Mark Drobnick wrote:
> .equ temp, 0x10> .equ leds, 0x11> [...]> ldi temp, 0x00
Du solltest Dich vielleicht mal erkundigen, was .equ überhaupt macht! Es
macht jedenfalls nicht das, was Du vermutlich denkst...
Abgesehen ist das mit dem .equ syntaktisch falsch (und kann deshalb
schon mal gar nicht assemblieren).
Habs jetzt hinbekommen, das einzige was ich geändert hab war ein mal
zwei bei INT1addr, also ".org INT1addr * 2", weil die vordefinierten
Adressen anscheinend Word Format haben und der Assembler Byte haben
will.
Mit dem assemblieren hatte ich keine Probleme. Wie hätt ich das mit dem
.equ besser machen sollen?
lg
Assembler dürft avr-as, avr-gcc sein. Musste jetzt selber nachschaun
weil wir von der Uni schon ein fertiges Makefile bekommen haben und die
ganzen Packages schon installiert waren.
Mark Drobnick wrote:
> Assembler dürft avr-as, avr-gcc sein.Dürfte? Toll, da programmiert einer und weiß gar nicht, womit...
> Musste jetzt selber nachschaun
So, muss ich das?
Sehr nett danke, programmier seit gestern das erste mal einen
Microcontroller. Aber sinnlos zu diskutieren, jetzt hab ichs ja eh
hinbekommen.
Schönen Abend noch!