mikrocontroller.net

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


Autor: Alexander Ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Danny (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Alexander Ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Malte Marwedel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wurstwasser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SERVOMOTOREN ANZUSTEUERN IST DER LETZTE SCHEIß!!!
GEHT DOCH ALLES NICHT

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.