PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt verhält ich komisch ...



H3llGhost
08.01.2008, 20:48
Hallo Leute,

ich habe ein Programm geschrieben, wo ein Timer-Interrupt benutzt wird.
Nur dieser verhält sich etwas komisch, sprich der eine Motor geht aus und der andere an ...
Ich habe keine Ahnung, woran das liegen kann ...
Bitte helft mir ... :-)

Hier ist der Code:



.include "m8def.inc"

;31248 1 Sek
.EQU TIME05 = 65536 - 15624 ; 0,5 Sekunden
.EQU TIME2 = 65536 - 62496 ; zwei Sekunde
.EQU TIME1 = 65536 - 31248 ; eine Sekunde

.def temp = r16
.def temp = r21
.def temp = r22
.def updown = r23

.org 0x0000
rjmp start
.org OVF0addr ;Interrupt-handler für 8 Bit Timer0
rjmp interrupt

start:
ldi updown, 0b00000000

ldi r20,HIGH(TIME2) ;Trick, um Timer0 auf 16 Bit zu erweitern
ldi temp,LOW(TIME2) ;Starwert Timer
out TCNT0,temp
ldi temp,(1<<CS02|1<<CS00) ;Prescaler Systemtakt/1024
out TCCR0,temp
ldi temp,(1<<TOIE0) ;Timer Interrupt über TOV0 erlauben
out TIMSK,temp ; "

ldi temp, (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1)
out TCCR1A, temp
ldi temp, (1 << CS11)
out TCCR1B, temp

ldi temp,25
out OCR1BH, temp
out OCR1BL, temp
ldi temp,150
out OCR1AH, temp
out OCR1AL, temp


cbi DDRD, PD7
cbi PORTD, PD7
sbi PORTC, PC0
sbi PORTC, PC1

sei ;global Interrupts einschalten

;Stackpointer setzen wg. Unterprogramm
ldi temp,HIGH(RAMEND)
out SPH,temp
ldi temp,LOW(RAMEND)
out SPL,temp

SBI DDRB, DDB1 ; Motordatenrichtungsbit setzen
SBI DDRB, DDB2
SBI DDRB, DDB4
SBI DDRB, DDB5
SBI DDRD, DDD4
SBI DDRD, DDD5
SBI PORTB, PB1 ; Motorenports PB1 und PB2 auf 5V schalten
SBI PORTB, PB2
sbi PORTD, PD5
sbi PORTB, PB5

sbi DDRC, DDC0
sbi DDRC, DDC1

;Hauptprogramm:
loop: ;leere Schleife
rjmp loop

;Interrupt Handler
interrupt: ;LEDs toggeln
inc r20 ;Timererweiterung inkrementieren
brne interrupt2 ;wenn r20=0, zu interrupt2 springen
ldi r20,HIGH(TIME2) ;sonst Starwert Timer neu setzen

sbrs updown,7 ;0 hoch, 1 runter
rjmp switch0
sbrc updown,7
rjmp switch1

switch0:
ldi updown, 0b10000000
ldi temp,150
out OCR1BH, temp
out OCR1BL, temp
ldi temp,25
out OCR1AH, temp
out OCR1AL, temp
cbi DDRC, DDC0
cbi DDRC, DDC1
sbi PORTD, PD6
sbi DDRD, DDD6
rjmp interrupt2

switch1:
ldi updown, 0b00000000
ldi temp,25
out OCR1BH, temp
out OCR1BL, temp
ldi temp,150
out OCR1AH, temp
out OCR1AL, temp
sbi DDRC, DDC0
sbi DDRC, DDC1
cbi PORTD, PD6
cbi DDRD, DDD6
rjmp interrupt2

noswitch:
interrupt2:
ldi temp,LOW(TIME2) ;Startwert Timer neu
out TCNT0,temp
reti


Danke im Voraus!

H3llGhost
09.01.2008, 08:14
Ach ja Leute ...

Ich habe eine Info für euch ...
Es muss irgendwie mit dem Timer0 zu tun haben.

damaltor
09.01.2008, 13:55
was soll das für ein trick sein? du zählst doch einfach in einer interruptschleife einen register runter?

ich glaube du vergisst nach einem überlauf dieses registers dieses wieder auf seinen startwert HIGH(...) zu setzen

H3llGhost
09.01.2008, 15:09
Hier ist der Code:



.include "m8def.inc"

;31248 1 Sek
.EQU TIME05 = 65536 - 15624 ; 0,5 Sekunden
.EQU TIME2 = 65536 - 62496 ; zwei Sekunde
.EQU TIME1 = 65536 - 31248 ; eine Sekunde

.def temp = r16

.org 0x0000
rjmp start
.org OVF0addr ;Interrupt-handler für 8 Bit Timer0
rjmp interrupt


start:
ldi r20,HIGH(TIME2) ;Trick, um Timer0 auf 16 Bit zu erweitern
ldi temp,LOW(TIME2) ;Starwert Timer
out TCNT0,temp
ldi temp,(1<<CS02|1<<CS00) ;Prescaler Systemtakt/1024
out TCCR0,temp
ldi temp,(1<<TOIE0) ;Timer Interrupt über TOV0 erlauben
out TIMSK,temp ; "

;Hauptprogramm:
loop: ;leere Schleife
rjmp loop

;Interrupt Handler
interrupt: ;LEDs toggeln
inc r20 ;Timererweiterung inkrementieren
brne interrupt2 ;wenn r20=0, zu interrupt2 springen
ldi r20,HIGH(TIME2) ;sonst Starwert Timer neu setzen

[...]

interrupt2:
ldi temp,LOW(TIME2) ;Startwert Timer neu
out TCNT0,temp
reti


Du meinst ich muss am Ende auch noch ldi temp,HIGH(TIME2) einfügen?

damaltor
09.01.2008, 15:58
ich kenne mich mit asm nicht genu aus. aber ich denke das wäre einen versuch wert.

H3llGhost
09.01.2008, 16:15
Aber das wird ja schon kurz davor getan ...
Nach dem "brne" ...

damaltor
10.01.2008, 00:42
na gut, dann kann ich nicht helfen...

H3llGhost
10.01.2008, 11:05
Ist ja kein Problem ... ;-)
Ich habe es ja jetzt auch am Laufen ...

Mich würde nun mal interessieren wie man die Zeit für den Timer0 mit einer 16-Bit-Erweiterung berechnen würde ...