-
-
Neuer Benutzer
Öfters hier
Anfänger hat Technisches Problem (Verständnis) mit PWM Prog.
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.
-
Was soll das Programm denn machen? R22 hat gar keine Bedeutung im Programm.
-
Neuer Benutzer
Öfters hier
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"
-
Erfahrener Benutzer
Robotik Einstein
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.
-
Neuer Benutzer
Öfters hier
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?
-
Erfahrener Benutzer
Robotik Einstein
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.
-
Neuer Benutzer
Öfters hier
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.
-
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 ).
-
Neuer Benutzer
Öfters hier
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.
-
Neuer Benutzer
Öfters hier
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?
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen