Forum: Mikrocontroller und Digitale Elektronik Servotester mit ATMega8


von winni (Gast)


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

von Wichtel (Gast)


Lesenswert?

Du musst den neuen Wert (temp in/decrementiert) auch wieder in das 
OCR2-Register zurücksichern damit er wirksam werden kann.

von winni (Gast)


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!?

von winni (Gast)


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

von Icke (Gast)


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.

von winni (Gast)


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

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.