Hallo Profis,
will einen Servo je nach Schalterstellung (PIN-Abfrage) rechts oder
links laufen lassen. Das Programm hat ohne die Abfrage funktioniert und
je nach Zählwert in der ISR lief der Servo dann rechts oder links. Kaum
habe ich aber die Abfrage eingebaut und PortD als Eingang definiert,
löst der AV keinen Interrupt mehr aus.
Meine Vermutung liegt am "rjmp" beim Int-Handler - also dass der
Sprung zu weit ist? Kann das sein?
;Ansteuerung eines Modellbauservo
;Autor: Alexander Ernst am 4.6.2004
;cpu = ATmega8535
;---------------------------------------
.include "m8def.inc"
.def temp1 = r16
.org 0x000
rjmp def_timer0 ;Reset Handler
.org OVF0addr ;Timer0Flag 0x009
rjmp ihTimer0_ovf
;-----main------------------------------
def_timer0:
ldi temp1, LOW(RAMEND) ;Stack
out SPL, temp1
ldi temp1, HIGH(RAMEND) ;Stack
out SPH, temp1
ldi temp1,0xFF
out DDRC, temp1 ;PortC configured as output
ldi temp1,0x00
out DDRD, temp1 ;PortD cofigured as input
ldi temp1,0b00000101 ;define prescaler 1/1024
out TCCR0,temp1
ldi temp1,0b00000010 ;timer0 overflow interrupt
out TIMSK,temp1
ldi temp1, 0x63 ;reload timer0 20ms
out TCNT0, temp1
sei ;enable interrupt enable flag
rjmp main
;-------Interrupt_Timer0-------------------------------------------
ihTimer0_ovf: ;isr
sbi PORTC,0 ;Highsignal for 2ms
ldi r18,0x00
loop:
inc r18
brne loop
loop1:
inc r17 ;wert von main
brne loop
cbi PORTC,0
reti
;-------Abfrage_main-----------------------------------------------
main:
sbic PORTD,0
rjmp right
sbic PORTD,1
rjmp left
rjmp main
right:
ldi r17,0xFD
rjmp main
left:
ldi r17,0xE1
rjmp main ;endlosschleife
Der Code sieht für mich gar nicht so schlecht aus, bin aber auch nur Anfänger. Was mir aber aufgefallen ist: du verwendest den Mega8535, bindest aber die m8def.inc ein. Soweit nicht schlimm, nur das der RAMEND vom Mega8 bei $45F ist, beim Mega8535 aber bei $25F. Vielleicht ist das dein Problem. Hab dir die m8535def.inc angehängt. Gruß Danny
Hallo Danny, danke für die Infos. Aber leider hat es damit auch nicht geklappt. Beim Simulieren im AVR Studio springt er mir irgendwo in den Programmcode und fährt dann wieder zu meiner endlosschleife. Ich bin echt noch nicht dahinter gestiegen, warum er mir nicht meinen Timer0 InterruptHandler anspringt???? Noch ein Profi im Forum?
Hi... Du fragst nicht die Eingänge (PIND) sondern die Ausgangs/PullUp-Register (PORTD) ab... Den Rest des Programms habe ich aber nicht weiter analysiert, kann sein, dass da noch mehr ist... Bit- & Bytebruch... ...HanneS...
So jetzt, beim Interrupt springt er ja dauernd die Adresse 0x013 an. Das ist die Adresse für "Output Compare0 Interrupt Vector Address". Hab jetzt nen .org darauf gemacht und es geht. Was ist dann an 0x009 "Overflow0 Interrupt Vector Address" das? @Hannes...muß das dann PIND,0 heißen? Bin noch vom 8051'er etwas verwirrt - da isses ein bisschen einfacher;-) Gruß Alex
>muß das dann PIND,0 heißen? Müsste. Beim AVR Schreibst du auf PORTD und liest PIND. Hast du PortD als Eingang definiert(DDRD = 0) und schreibst auf PORTD aktivierst du bei den meisten AVRs Pull-up Widerstände. Liest du dann PORTD bekommst du die Information welche Pull-up Widerstände aktiv sind. Beim Lesen von PIND erhälst du dann die tatsächlich an den Eingängen anliegenden Pegel.
SERVOMOTOREN ANZUSTEUERN IST DER LETZTE SCHEIß!!! GEHT DOCH ALLES NICHT
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.