PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger hat Technisches Problem (Verständnis) mit PWM Prog.



servo
20.01.2007, 21:00
Wünsche einen guten Abend!
Bin Anfänger I/O setzen, warteschleifen und einfache Programmabläufe gehen
langsam immer besser. ( vorkentnisse: 7 Jahre Maschinenbau als Energie-Anlagenelektroniker )
Ich versuche mich mit Assembler bekannt zu machen weil ich mir gedacht hab
wenn schon Strauss dann Johann Strauss!

Hab folgendes Porblem:
Da ich mich jetzt auf das ansteuern von Servos stürzen will hab ich im Internet Progamme gesucht um das Gesamtbild besser vertehen zu können.
Mir ist nicht klar wir im nachfolgendem Programm Register 22 mit TCNT0
verbunden ist, bzw. es wird r22 incrementiert und TCNT0 erhöht seinen wert. Hab schon sämtliche Bücher und Datenblätter durchforstet und nichts gefunden was die beiden in zusammenhang bringen würde.

.include "m16def.inc" ; Definitionen für Atmel ATmega8

.def cnt1 = r20 ;count1
.def temp = r21

;################################################# ############################;

.org 0x000
rjmp INIT ; Reset Handler

.org OVF0addr
rjmp Timer0 ; Timer0 Overflow Handler

;################################################# ############################;

.equ frequenz = 7372800 ; Frequenz in Hz
.equ start= 206
;################################################# ############################;

INIT:

ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp

ldi temp, 0b11111111
out DDRD, temp ; Port B -> Ausgang
ldi temp, 0b00000000
out PORTD, temp


ldi temp, 0b00000001 ; Timer0 Interrupt aktivieren
out TIMSK, temp


ldi temp, start ; Startwert des Timers
out TCNT0, temp

ldi temp, 0b00000010 ; Prescaler auf 8
out TCCR0, temp

sei ; Interrupts aktivieren

ldi cnt1, 0
rjmp MAIN

;################################################# ############################;

MAIN:
sbic PINA,0

inc r22
rjmp MAIN



;################################################# ############################;

Timer0:

comp1: ldi temp,1
cpse cnt1,temp
rjmp comp2
sbi portd,0

comp2: ldi temp, 10
cpse cnt1,temp
rjmp comp3
cbi portd,0

comp3: ldi temp,210
cpse cnt1,temp
rjmp restart
ldi cnt1,0

restart:
ldi temp, start
out TCNT0, temp
inc cnt1
reti

währe Dankbar wenn einer die 5W Birne in meinem Kopf auf 5,1W erhöhen könnte.

cipoint
20.01.2007, 22:29
Was soll das Programm denn machen? R22 hat gar keine Bedeutung im Programm.

servo
20.01.2007, 22:42
Zur Erklärung:
Ich Arbeite mit dem Programm AVR Studio 4 wo ich die Möglichkeit habe mir Schritt für Schritt anzuschauen.

Der Abschnitt des Programmes der gleich nachfolgt läuft solange im kreis bis im TCNT0 ein overflow stattfindet ( 255+1 ).

MAIN:
sbic PINA,0

inc r22
rjmp MAIN

Wenn es Stattfindet springt der Programmablauf auf:

.org OVF0addr
rjmp Timer0 ; Timer0 Overflow Handler

Und weiter auf das Label "Timer0"

uwegw
20.01.2007, 22:45
Und was ist daran so schlimm? Der Timer läuft über, und weils so konfiguriert wurde, wird ein Interrupt ausgelöst. Daher erfolgt der Sprung zu OVF0addr und von dort in die Interruptroutine ab Timer0.

Oder was ist jetzt genau dein Problem?


TCNT0 und r22 haben nixhts miteinander zu tun. r22 wird in der main-Schleife weitergezählt, während TCNT0 vom Hardware-Timer unabhängig vom restlichen Programmablauf weitergesetzt wird.

servo
20.01.2007, 22:49
OK. Ich muss mich Entschuldigen da meine Erste Antwort keine wirkliche
Antwort war. ( meine Schuld )

Du hast Recht.

Ich hab noch mal nachgeschaut was mit R22 im Programm passiert und hab festgestellt dass nichts passiert!
aber warum wird ein inc "r22" geschrieben und TCNT0 wird erhöht?

uwegw
20.01.2007, 22:51
ich habs grad per edit nachgeschoben: TCNT0 wird vom Timer beeinflusst [und zwar alle 1,085 µsec. un 1 erhöht] (siehe Datenblatt!). r22 wird anscheinend nicht weiter genutzt.

servo
20.01.2007, 23:07
da geb ich dir völlig recht uwegw. Aber mein Problem ist das logische Verständniss das ein "r22 incrementiert wirt" und TCNT0 erhöht wirt.
Wie das Programm abläuft versteh ich ( glaub ich ).

Aber wo ist die logik bei "inc r22" und die erhöhung von TCNT0???
Wo hängt es irgentwo zusammen???
und der zusammenhang muss bestehen, sonst würd das Programm nicht
funktionieren.

es tut mir leid das ich als Anfänger solche Fragen stelle, aber wenn ich Privat
was Lernen will dann gescheit.

cipoint
20.01.2007, 23:10
Statt inc R22 kannst du auch dec R22 schreiben. Dann wird der R22 bei jedem Durchlauf um 1 erniedrigt. Aber der TCNT0 wird trotzdem hochgezählt. Das sind zwei verschiedene Paar Schuhe (Zähler ;-) ).

servo
20.01.2007, 23:13
An cipoint.

Das Programm lässt den Atmega16 eigentlch nur ein unveränderbares
PWM Signal ausgeben das den Servo auf ein und der selben Stelle hält.

servo
20.01.2007, 23:21
Ahhhhhh!!! durch die antwort von cipoint
Wenn ich jetzt auf dem Donnerbalken die Richtige Eingebung hatte wird mit inc r22 der Atmega nur auf trap gehalten damit die CPU immer schön Weiterarbeitet und der Timer immer schön seine Tackte bekommt.
Richtig?


Oder Denk ich jetzt in eine völlig falsche richtung?

uwegw
21.01.2007, 17:55
sozusagen. man könnte aber das dec r22 eigentlich auch weglassen, dann beschäftigt sich der AVR halt nur mit den Sprüngen im Kreis. Oder man setzt nen nop rein...

servo
22.01.2007, 16:05
wunderbar

dann will ich mal vielen dank sagen.

so jetzt sind wir bei einer 5,1W Birne in meinem Kopf, mal schauen
wann die grenze zu 5,2 überschritten wird O:)

ich meld mich !