So wäre ich mal wieder,
Kurzer Überblick:
Ich hab jetzt alles so gemacht das ich beim Auslösen
des Timer Interuptes +1 in einen Register dazurechne
und diese mit einen anderen Register vergleiche.
Wenn dies zutrifft dann springe ich zu den Unterprogramm
wo ich das Bit einmal durch PortB schiebe und wieder
in die Hauptschleife Springe.
Das Vergleichregister soll mit einen Tastendruck den Wert +16 oder
-16 'gutgeschrieben bekommen' Somit ist das Vergleichregister
mit 17 Werten einzustellen und somit ist die Geschwindigkeit einzustellen.
Jetzt zu meinen Problem:
PD2 und PD3 sind aktiviert und die PullUps auch.
Bei Tastendruck wird entweder -16 und +16
gerechnet.Die Addition ist ein wenig umständlich gelöst
Für die Subthraktion gibt es einen direkt befehl für das addieren
hab ich nichts direktes gefunden.
Oder gibt es noch was zu beachten?
Und kann mal jemand über den Code gucken?
Beim Assembilieren gab es zumal keine Fehler.... \/
Edit:
So jetzt habe ich den Code weiter überarbeitet und im Simulator
von AVRStudio funktioniert dieser Super, sogar die Addition
im Vergleichsregister wird aufaddiert und alles stimmt.
Nur wenn ich das in Hardware aufbaue funktioniert
das ganze Nicht.
Aufgebaut ist das ganze auf einen MyAVRBoard+Breadboard.
Die LED's laufen einfach durch aber ein Tastendruck hat keinerlei
ausmaß auf deren Geschwindigkeit.
Die Ports habe ich auch schon gewechselt,statt die Spannung vom LPT
zu nehmen habe ich auch mal einen Akku + den 7806er genommen
und da hat sich auch nichts geändert.
Jetzt bin ich mal gespannt was ihr dazu sagt.
Liebe Grüße
Namenlos
Code:
.include "m8def.inc"
.def Arbeit = r16 ;Für die Initialisieung zuständig
.def Licht = r17 ;Werte für das Lauflicht
.def Zaehler = r18 ;Zähler für jeden Interrupt
.def Vergleich = r19 ;Vergleichs Register für den Zähler [ "Referenz" ]
.def Wert = r20 ;Wert für die Addition / Subthraktion
;Für den Vergleichswert
.def Reset = r21
.org 0x0000 ; Hauptprogramm
rjmp Hauptprogramm
.org OVF0addr ;Timer 0 Interrupt Vector Addresse [8 Bit-Timer ]
rjmp Timer1
Hauptprogramm: ;Initialisierung
ldi Arbeit, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, Arbeit
ldi Arbeit, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, Arbeit
ldi Arbeit,0b11111111
out DDRC, Arbeit ;Alle Pins am Port C durch Ausgabe 0b11111111 ins
;Richtungsregister DDRC als Ausgang konfigurieren
ldi Arbeit,0b11111000
out DDRB, Arbeit ;PB0 und PB1 und PB2 als Eingang Aktivieren
ldi Arbeit,0b00000111 ;PB0 und PB1 und PB2 bekommen Pullup Widerstände
out DDRB, Arbeit
ldi Arbeit,0b00000001 ;Vorteiler 1024 an Timer 0
out TCCR0,Arbeit ;Setze Bits [CS02 und CS00]
ldi Arbeit,0b00000001 ;Timer Interupt Aktivieren
out TIMSK,Arbeit ;Setze Bit [T0IE0]
ldi Licht,0b00000001 ; =1
out PortC, Licht ;Erste LED an PortC an
ldi Wert,0b00010000 ;Konstante für das Subtharieren/Addieren [ 16 ]
ldi Vergleich,0b00100000 ;Startwert für das Vergleichsregister
; [ 32 ]
ldi Reset,0b00000000 ;Lösche das Reset Register
sei ;Interrupt Aktivieren
Schleife: ;Hauptschleife
rjmp Schleife
Timer1: ;Aktion beim Timerinterupt
sbic PINB,0 ;Wenn Taster gedrückt PD2 = 0
rcall Addiere
sbic PINB,1 ;Wenn Taster gedrückt PD3 = 0
rcall Subthraiere
sbic PINB,2 ;Wenn Taster gedrückt PD4 = 0
rcall Wiederherstellen
inc Zaehler ;Addiere 1 zum Zähler Register
cp Zaehler,Vergleich ;Wenn der Zähler <= ist als der Vergleich ist
;Springe zu 'Bitschieben'
brge Bitschieben ;Ansonsten:
reti ;Verlasse den Interrupt Handler
Bitschieben: ;Aktion wenn der Vergleich größer war
ldi Zaehler,0b00000000 ;Setze den Zähler Zurück
rol Licht ;Bits 'schieben'
out PortC, Licht ;Gebe 'Licht' an PortC aus
inc Reset ;Erhöhe Inhalt von 'Reset' um +1
cpi Reset,7 ;Wenn Reset= 7 Springe zu Zuruecksetzen
brge Zuruecksetzen ;wenn nicht:
reti ;Verlasse den Interrupt Handler
Zuruecksetzen:
ldi Licht,0b00000001 ;Setze 'Licht' zurück'
out PortC, Licht ;und gebe es in PortC aus
ldi Reset,0b00000000 ;Lösche das Reset-Register
reti ;Verlasse den Interrupt Handler
Addiere:
add Vergleich,Wert ;Addiere 8 zu das Vergleichregister
ret ;Gehe wieder zurück
Subthraiere:
sub Vergleich,Wert ;Subthraiere 8 von dem Vergleichregister
ret ;Gehe wieder zurück
Wiederherstellen:
ldi Vergleich,0b00100000 ;Startwert für das Vergleichsregister
ret ;Gehe wieder zurück
Lesezeichen