Forum: Mikrocontroller und Digitale Elektronik Servomotor ansteuern, kein Interrupt!!!


von Alexander Ernst (Gast)


Lesenswert?

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

von Danny (Gast)


Angehängte Dateien:

Lesenswert?

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

von Alexander Ernst (Gast)


Lesenswert?

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?

von ...HanneS... (Gast)


Lesenswert?

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...

von Alexander Ernst (Gast)


Lesenswert?

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

von Malte Marwedel (Gast)


Lesenswert?

>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.

von Wurstwasser (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.