Muss man in Assembler nicht auch angeben um was für einen AVR es sich handelt?
Hi, ich hab mal was am ATmega8 ausprobiert und komm da im mom. nicht so richtig weiter. Den Code hab ich mit gepostet. Zur Funktion soviel: nachdem ein Wert überschritten worden ist, soll ein Portbit gesetzt werden. Es tut sich aber überhaupt nichts. Danke für alle tips und anregungen.
Hier der code:
.include "AVR.H"
;----------------------------------------------------------------------
; Reset and Interrupt vector ; VNr. Beschreibung
rjmp main ; 1 POWER ON RESET
reti ; 2 Int0-Interrupt
reti ; 3 Int1-Interrupt
reti ; 4 TC2 Compare Match
reti ; 5 TC2 Overflow
reti ; 6 TC1 Capture
reti ; 7 TC1 Compare Match A
reti ; 8 TC1 Compare Match B
reti ; 9 TC1 Overflow
reti ; 10 TC0 Overflow
reti ; 11 SPI, STC Serial Transfer Complete
reti ; 12 UART Rx Complete
reti ; 13 UART Data Register Empty
reti ; 14 UART Tx Complete
rjmp onADC ; 15 ADC Conversion Complete
reti ; 16 EEPROM Ready
reti ; 17 Analog Comparator
reti ; 18 TWI (I²C) Serial Interface
reti ; 19 Store Program Memory Ready
;----------------------------------------------------------------------
; Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,hi8(RAMEND)
out SPH,r16
; Hier Init-Code eintragen.
;--------ADC Init-------------------------------
ldi r16,0
out ADMUX,r16 ; ADC kanal 0 = PortC.0
ldi r16,0b11011101
out ADCSRA,r16 ; ADC enable, Interrupt enable, run-mode
;--------PORT Init-------------------------------
ldi r16,0b00000010
out DDRC,r16 ; PORTC.1 als ausgang
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++
mainloop: wdr
rcall wait
rcall wait
mov r20,r25 ; ADC Wert holen
cpi r20,0b00000010 ; falls ADC Wert höher als 2
brge mainloop ; die led an
sbi PORTC,1
rjmp mainloop
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++
onADC: cli ; Interrupts sperren
in r25,ADCH ; ADC 8 Bit Daten holen
sbi ADCSRA,6 ; nächste Wandlung starten
sei ; Interrupts wieder zulassen
reti
wait: push r24
ldi r24,0x13 ;hier delay einstellen
w1: subi r24,0x01
rcall wait20ms
brcc w1
pop r24
ret
wait20ms: ldi r16,255
ldi r17,104
w20ms: dec r16
brne w20ms
dec r17
brne w20ms
ret
Muss man in Assembler nicht auch angeben um was für einen AVR es sich handelt?
eigentlich schon, aber ich benutz das myAVR sisy studio. da ist die Anweisung für den mega8 bereits integriert.
also soweit wie ich das sehe fehlt das <<< sei >>> vor der mainloop... dein interrupt wird einfach nicht ausgelöst
Wenn ich mich nicht irre, ist der "RETI" als Interrupt-Vector zu kurz, es sind immer 4 Byte vorgesehen. Da gehört immer noch ein "NOP" dazwischen.
Das kannst du aber im Listing leicht kontrollieren.
Wenn ich mich aber schon irre, dann bitte ich im Strafe
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
beim Mega8 reicht ein RETI, erst meim m168 der x8 Serie müssen es zwei Befehlsworte sein (NOP, RETI oder JMP Marke)
Gruß
hast du das von Peter mal kontrolliert? bin auch der Meinung, dass da noch ein sei fehlt. Setz mal ein sei direkt hinter die Interrupttabelle in der Power On Instruktion.
Hi, und erst mal danke für die antworten. Das sei hab ich jetzt gesetzt. Obwohl ich dachte, dass es in meiner onADC - Funktion ausreicht paasiert nun folgendes: Board einschalten, 1 - 2 sek. warten und dann vemerken, dass die LED angeht. Natürlich unabhängig von der Stellung des potentiometers. Allerdings bleibt die LED aus, wenn statt BRGE, BRLO an der verzweigung steht. kann mir da jetzt aber garnichts darunter vorstellen !
und noch was ist mir aufgefallen... du musst unbedingt immer beide ADC-Werte (Low dann High) unmittelbar nacheinander auslesen sonst nimmt der ADC die Werte nicht als ausgelesen an... du hast doch SiSy... da ist Beispielcode für den ADC drin... und dann denke ich mal solltest du die LED auch ausschalten wenn der ADC-Wert wieder kleiner ist...
also ich habe dein onADC mal mit der onADC-Vorlage aus SiSy ersetzt und da gehts.
Alles, klar, klappt einwandfrei. Tausend Dank ! Im Atmel Handbuch steht jedoch, dass es ausreichend ist, ADCH auszulesen , falls eine 8-Bit Auflösung genau genug ist.
Lesezeichen