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.