- Labornetzteil AliExpress         
Ergebnis 1 bis 8 von 8

Thema: Interrupt verhält ich komisch ...

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168

    Interrupt verhält ich komisch ...

    Anzeige

    E-Bike
    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:

    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!

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Ach ja Leute ...

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

  3. #3
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    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
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Hier ist der Code:

    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?

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    ich kenne mich mit asm nicht genu aus. aber ich denke das wäre einen versuch wert.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Aber das wird ja schon kurz davor getan ...
    Nach dem "brne" ...

  7. #7
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    na gut, dann kann ich nicht helfen...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    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 ...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress