Servotester mit ATMega8

Gast #1502610
Lesenswert?

Hallo,

ich versuche nebenbei etwas AVR zu lernen, doch es scheint so als ob ich 
an den einfachsten Sachen scheitere^^
1
.include "m8def.inc"
2
 
3
.def temp1         = r17
4
 
5
    rjmp    init
6
 
7
init:
8

9
  ldi      temp1, LOW(RAMEND)     ; Stackpointer initialisieren
10
    out      SPL, temp1
11
    ldi      temp1, HIGH(RAMEND)
12
    out      SPH, temp1
13
  
14
  cbi     DDRB,0          ;PB0 Eingang
15
  cbi     DDRB,1          ;PB1 Eingang
16
  sbi     PORTB,0        ;PB0 PullUp
17
  sbi     PORTB,1        ;PB1 PullUp
18
  sbi     DDRB,3          ;PB3 Ausgang
19

20
    ldi      temp1, 0b01101011    ;Timer2,FastPWM,Teiler_64
21
    out      TCCR2, temp1
22

23
  ldi     temp1,40        ;PWM_Wert:40
24
  out     OCR2,temp1
25
main:
26
    sbis    PINB,0          ;Erhöhe temp1 wenn PB0=0
27
  inc   temp1  
28
  sbis    PINB,1          ;Verringere temp1 wenn PB1=0
29
  dec    temp1
30
  rjmp     main

Das PWM funktioniert (mein Servo nimmt eine Position an, hehe) aber das 
mit dem Increase und Decrease hab ich mir wohl zu einfach vorgestellt...

Ich weis das es schon viele Codebeispiele für Servotester gibt, aber ich 
möchte gerne verstehen warum meins nicht funktioniert.

Funktion sollte klar sein:
PB3 gibt PWM Signal
PB0 und PB1 erhöhen bzw. verringern den Interruptwert. (verändern also 
Pulsfrequenz)

PS: Sorry wegen 0b01101011 das nächste mal wirds 1<<CS0 usw

mfg vincent
Gast #1502646
Lesenswert?

Argh, natürlich, manchmal ist man aber auch wie vernagelt.

Main: sieht jetzt so aus:
1
main:
2
    sbis    PINB,0          ;Erhöhe temp1 wenn PB0=0
3
  inc   temp1  
4
  sbis    PINB,1          ;Verringere temp1 wenn PB1=0
5
  dec    temp1
6
  out    OCR2,temp1
7
  rjmp    main

Passiert trotzdem nichts!?
Gast #1502650
Lesenswert?

Oh Sorry Doppelpost, aber es passiert doch was und zwar:

Wenn ich drücke geht er sofort unkontrolliert bis Anschlag, ich kann mir 
aber vorstellen das das was mit Taster-Entprellen zu tun haben könnte...
Gast #1502657
Lesenswert?

Die Servos erwarten eine Impulsbreite zwischen 1 und 2 ms, wobei 1,5 ms 
die Mittenstellung ist. Frequenz sollte ca. 45 Hz sein.
Wenn du einen der beiden Taster drückst, wird aufgrund der unverzögerten 
Schleife das Register irgendeinen zufälligen Wert annehmen, da auch 
keine "Begrenzung" einprogrammiert ist.
Gast #1502664
Lesenswert?

Stimmt, der µC fragt den Port ja etwas schneller ab als ich den wieder 
los lassen kann^^

Dann muss ich wohl noch eine kleine Zeitschleife oder so einbauen, die 
mir etwas Zeit lässt den Taster zu drücken und den Wert nur um 1 
verändert.

Ich habs jetzt aber verstanden, vielen Dank, ging echt schnell.

mfg vincent

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren