PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Takt dür den Schrittmotor erzeugen



sahra
19.10.2010, 11:37
hallo leute,
ich habe ein Programm geschrieben, mit dem will ich ein Takt über Poti erzeugen, aber leider hat es nicht funktionnier ich weiß nicht ob das an meinem Hardware liegt oder oder an dem programm: hier ist das Programm:



.include "m88def.inc"

; Anschlüße Port B
; PB0 Drehichtung
; PB1 Enable
; PD5 Takt
; PB4,PB5 sind Schalter
; Alle Anderen nicht belegt.

.def ADClow=r6
.def ADChigh=r7
.def rlow=r8
.def temp=r16 ;;temporäres Register (initialisierung, PortAusgabe)
.def temp2=r17
.def temp3=r18
















;Registerzuweisung-------------------------------------------------------


;Interrupt Vektor Tabelle


rjmp RESET ; PCINT0 Handler
.org 0x003
rjmp Reset; PCINT0_7
rjmp RESET ; PCINT1 Handler
rjmp RESET ;PCINT2 ; PCINT2 Handler
rjmp RESET ;WDT ; Watchdog Timeout Handler
rjmp RESET ;TIM2_COMPA ; Timer2 CompareA Handler
rjmp RESET ;TIM2_COMPB ; Timer2 CompareB Handler
rjmp RESET ;TIM2_OVF ; Timer2 Overflow Handler
rjmp RESET ;TIM1_CAPT ; Timer1 Capture Handler
rjmp RESET ;TIM1_COMPA ; Timer1 CompareA Handler
rjmp RESET ;TIM1_COMPB ; Timer1 CompareB Handler
rjmp RESET ;TIM1_OVF ; Timer1 Overflow Handler
rjmp RESET ;TIM0_COMPA ; Timer0 CompareA Handler
rjmp RESET ;TIM0_COMPB ; Timer0 CompareB Handler
rjmp RESET ;TIM0_OVF ; Timer0 Overflow Handler
rjmp RESET ;SPI_STC ; SPI Transfer Complete Handler
rjmp RESET ;USART0_RXC ; USART0 RX Complete Handler
rjmp RESET ;USART0_UDRE ; USART0,UDR Empty Handler
rjmp RESET ;USART0_TXC ; USART0 TX Complete Handler
rjmp RESET ;ADC_CP ; ADC Conversion Complete Handler
rjmp RESET ;EE_RDY ; EEprom Ready Handler
rjmp RESET ;ANA_COMP ; Analog Comparator Handler
rjmp RESET ;TWI ; 2-Wire Serial Interface Handler
rjmp RESET ;SPM_RDY ; Store Programm Memory Ready Handler

;------------------------------------------------------------------------
;Initialisierung---------------------------------------------------------
;------------------------------------------------------------------------


reset:
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp

;************************************************* ***************************
;* Timer0 initialisierung
;************************************************* ***************************
Tim0_init:
;* Timer0-Einstellung
ldi temp,(1<<com0b1)|(0<<com0b0)|(1<<WGM01)|(1<<WGM00); FastPWM, OC0A-nc
out TCCR0A,temp ;..und ausgeben
ldi temp,(1<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00) ;Taktvorteiler /64+FastPWM..
out TCCR0B,temp ;..aktivieren
ldi temp,255
out OCR0A,temp ;Maxwert
ldi temp,0
out OCR0B,temp ;Vergleichswert



;portd 5-7 auf Ausgang schalten
ldi temp,0b11110000
out ddrd,temp
;portb 0-3 auf Ausgang schalten
ldi temp,0b00001111
out ddrb,temp



; ADC Kanal und V_ref wählen
ldi temp,(1<<REFS0)|(0<<REFS1)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0)|(1<<ADLAR)
sts ADMUX,temp
; Digitaleingabepuffer des Pins deaktivieren
ldi temp,(1<<ADC0D)
sts DIDR0,temp

; ADC aktivieren + starten, VT=32
ldi temp,(1<<ADEN)|(1<<ADSC)|(0<<ADIE)|(1<<AdPS2)|(0<<ADPS1)|(1<ADPS0)
sts ADCSRA,temp



;------------------------------------------------------------------------
;Hauptprogramm-----------------------------------------------------------
;------------------------------------------------------------------------
Main:
rcall adc_single
sts OCR0b,ADChigh

sbic pinb,pb4
sbi portb,pb0
sbis pinb,pb4
cbi portb,pb0


sbic pinb,pb5
sbi portb,pb1
sbis pinb,pb5
cbi portb,pb1

rjmp main

;------------------------------------------------------------------------
;Hauptprogramm----------------------------------------------------------E
;------------------------------------------------------------------------






;Einen Wert auslesen

ADC_single:
rcall ADC_WAIT_CLEAR
rjmp ADC_read


;Einen Einzelnen Wert auslesen





;------------------------------------------------------------------------
;ADC aktivieren
ADC_START:



ADC_WAIT_CLEAR:
; Warten bis der ADC bereit ist
lds temp,ADCSRA
sbrc temp,ADSC
rjmp ADC_Wait_Clear
ret

ADC_read:
lds ADClow, ADCL
lds ADChigh, ADCH




ret
Code-Tags verwenden ! (PicNick, Mod)

ich bitte um Hilfe seite 2 Tage habe ich nach Fehler gesucht und trotzdem ohen Erfolg.
danke

Peter1060
19.10.2010, 11:58
moin moin,

ich kenne kein avr, beschreibe doch erstmal mit Worten was genau Du machen möchtest, erstelle mal einen PAP.

Mit gruß
Peter

sahra
19.10.2010, 12:15
danke für deine Antwort,
also über eine Poti gebe ich einen analogen Wert ein, und die wird über ADC Wandler in Digitale Wert konvertiert. Und diese Wert soll die Top Wert in Timer0(OCBR0), der Timer wird bis diesem Wert zählen dann wird er zurückgesetzt, dann werde ein Rechtecksignal bekommen, und das gebe als Takt für meinen Schrittmotor.
Ist es jetzt klar?
danke

PicNick
19.10.2010, 12:40
IO-Register (ADMUX, etc.) sollte man mit IN lesen und mit OUT schreiben.

Peter1060
19.10.2010, 12:43
teile das Program, lasse das mit der Analogeingabe erstmal weg.
Kannst Du mit einem Zahlenwert einen Ausgangstakt erzeugen?

PICture
19.10.2010, 12:55
Als PIC Benutzer kann ich dir bei AVR softwaremässig nicht helfen. Aus eigener Ehrfahrung mit µC bin ich aber sicher, dass mit ASM sich fast jede Impulsenfolge (laut Datenblatt) für die zu steuernder Hardware generieren lässt.

Die Steuerung für ein Schrittmotor ist ziemlich kompliziert, weil jede Spule exaxt zeitlich ein- und ausgeschaltet werden muss, wenn kein entsprechender Treiber, der nur Takt benötigt, verwendet wird.

MfG

sahra
19.10.2010, 13:08
teile das Program, lasse das mit der Analogeingabe erstmal weg.
Kannst Du mit einem Zahlenwert einen Ausgangstakt erzeugen?
danke das werde ich tun.

PicNick
19.10.2010, 13:21
IO-Register (ADMUX, etc.) sollte man mit IN lesen und mit OUT schreiben.

sahra
19.10.2010, 15:20
IO-Register (ADMUX, etc.) sollte man mit IN lesen und mit OUT schreiben.

mit atmega 88 geht nur mit ldi, und sts...

PicNick
19.10.2010, 16:17
Ah ja, da hast du recht. :oops:
da müssen wir was anderes finden