- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 30

Thema: [erledigt] globale Variable in ISR ändern + im Hauptprogramm

  1. #11
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    Praxistest und DIY Projekte
    Gut.
    Im Grunde verhält sich dein Programm einfach so, als würde da nicht "volatile" stehen.
    Kannst du die "*.LSS" - Datei posten ? Da müßte drinstehen, was der Wurstel tatsächlich übersetzt hat oder nicht.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    20.07.2007
    Beiträge
    38
    Hai,

    so wie es aussieht, übersetzt der Compiler die Variablen-Deklaration überhaupt nicht ?! HAb mal den Code bis zur ersten ISR gepostet. Die Variablen-Deklaration müsste vorher sein, ich finde sie aber nicht.

    Code:
    main.elf:     file format elf32-avr
    
    Sections:
    Idx Name          Size      VMA       LMA       File off  Algn
      0 .text         00000356  00000000  00000000  00000094  2**1
                      CONTENTS, ALLOC, LOAD, READONLY, CODE
      1 .data         00000004  00800060  00000356  000003ea  2**0
                      CONTENTS, ALLOC, LOAD, DATA
      2 .bss          00000001  00800064  00800064  000003ee  2**0
                      ALLOC
      3 .stab         00000360  00000000  00000000  000003f0  2**2
                      CONTENTS, READONLY, DEBUGGING
      4 .stabstr      00000071  00000000  00000000  00000750  2**0
                      CONTENTS, READONLY, DEBUGGING
      5 .debug_aranges 00000020  00000000  00000000  000007c1  2**0
                      CONTENTS, READONLY, DEBUGGING
      6 .debug_pubnames 00000060  00000000  00000000  000007e1  2**0
                      CONTENTS, READONLY, DEBUGGING
      7 .debug_info   00000202  00000000  00000000  00000841  2**0
                      CONTENTS, READONLY, DEBUGGING
      8 .debug_abbrev 0000012f  00000000  00000000  00000a43  2**0
                      CONTENTS, READONLY, DEBUGGING
      9 .debug_line   00000217  00000000  00000000  00000b72  2**0
                      CONTENTS, READONLY, DEBUGGING
     10 .debug_frame  00000060  00000000  00000000  00000d8c  2**2
                      CONTENTS, READONLY, DEBUGGING
     11 .debug_str    00000127  00000000  00000000  00000dec  2**0
                      CONTENTS, READONLY, DEBUGGING
     12 .debug_loc    00000058  00000000  00000000  00000f13  2**0
                      CONTENTS, READONLY, DEBUGGING
    Disassembly of section .text:
    
    00000000 <__vectors>:
       0:	0e c0       	rjmp	.+28     	; 0x1e <__ctors_end>
       2:	27 c0       	rjmp	.+78     	; 0x52 <__bad_interrupt>
       4:	26 c0       	rjmp	.+76     	; 0x52 <__bad_interrupt>
       6:	26 c0       	rjmp	.+76     	; 0x54 <__vector_3>
       8:	37 c0       	rjmp	.+110    	; 0x78 <__vector_4>
       a:	23 c0       	rjmp	.+70     	; 0x52 <__bad_interrupt>
       c:	22 c0       	rjmp	.+68     	; 0x52 <__bad_interrupt>
       e:	21 c0       	rjmp	.+66     	; 0x52 <__bad_interrupt>
      10:	20 c0       	rjmp	.+64     	; 0x52 <__bad_interrupt>
      12:	1f c0       	rjmp	.+62     	; 0x52 <__bad_interrupt>
      14:	1e c0       	rjmp	.+60     	; 0x52 <__bad_interrupt>
      16:	1d c0       	rjmp	.+58     	; 0x52 <__bad_interrupt>
      18:	1c c0       	rjmp	.+56     	; 0x52 <__bad_interrupt>
      1a:	1b c0       	rjmp	.+54     	; 0x52 <__bad_interrupt>
      1c:	1a c0       	rjmp	.+52     	; 0x52 <__bad_interrupt>
    
    0000001e <__ctors_end>:
      1e:	11 24       	eor	r1, r1
      20:	1f be       	out	0x3f, r1	; 63
      22:	cf ed       	ldi	r28, 0xDF	; 223
      24:	cd bf       	out	0x3d, r28	; 61
    
    00000026 <__do_copy_data>:
      26:	10 e0       	ldi	r17, 0x00	; 0
      28:	a0 e6       	ldi	r26, 0x60	; 96
      2a:	b0 e0       	ldi	r27, 0x00	; 0
      2c:	e6 e5       	ldi	r30, 0x56	; 86
      2e:	f3 e0       	ldi	r31, 0x03	; 3
      30:	03 c0       	rjmp	.+6      	; 0x38 <.do_copy_data_start>
    
    00000032 <.do_copy_data_loop>:
      32:	c8 95       	lpm
      34:	31 96       	adiw	r30, 0x01	; 1
      36:	0d 92       	st	X+, r0
    
    00000038 <.do_copy_data_start>:
      38:	a4 36       	cpi	r26, 0x64	; 100
      3a:	b1 07       	cpc	r27, r17
      3c:	d1 f7       	brne	.-12     	; 0x32 <.do_copy_data_loop>
    
    0000003e <__do_clear_bss>:
      3e:	10 e0       	ldi	r17, 0x00	; 0
      40:	a4 e6       	ldi	r26, 0x64	; 100
      42:	b0 e0       	ldi	r27, 0x00	; 0
      44:	01 c0       	rjmp	.+2      	; 0x48 <.do_clear_bss_start>
    
    00000046 <.do_clear_bss_loop>:
      46:	1d 92       	st	X+, r1
    
    00000048 <.do_clear_bss_start>:
      48:	a5 36       	cpi	r26, 0x65	; 101
      4a:	b1 07       	cpc	r27, r17
      4c:	e1 f7       	brne	.-8      	; 0x46 <.do_clear_bss_loop>
      4e:	36 d0       	rcall	.+108    	; 0xbc <main>
      50:	81 c1       	rjmp	.+770    	; 0x354 <_exit>
    
    00000052 <__bad_interrupt>:
      52:	d6 cf       	rjmp	.-84     	; 0x0 <__vectors>
    
    00000054 <__vector_3>:
    }
    
    // Eine nichtunterbrechbare Interrupt-Service-Routine
    SIGNAL (TIM1_COMPA_vect)
    {
      54:	1f 92       	push	r1
      56:	0f 92       	push	r0
      58:	0f b6       	in	r0, 0x3f	; 63
      5a:	0f 92       	push	r0
      5c:	11 24       	eor	r1, r1
      5e:	8f 93       	push	r24
       // ISR-Code
       //PORTB ^= (1<<PB2);
    	 //PORTB |= (1 << PB2);    // setzt Bit 3 an PortB auf 1
    	 PORTB &= ~(1 << PB2);   // loescht Bit 3 an PortB
      60:	c2 98       	cbi	0x18, 2	; 24
    	 Zeittick = Zeittick + 1;
      62:	80 91 64 00 	lds	r24, 0x0064
      66:	8f 5f       	subi	r24, 0xFF	; 255
      68:	80 93 64 00 	sts	0x0064, r24
      6c:	8f 91       	pop	r24
      6e:	0f 90       	pop	r0
      70:	0f be       	out	0x3f, r0	; 63
      72:	0f 90       	pop	r0
      74:	1f 90       	pop	r1
      76:	18 95       	reti
    
    00000078 <__vector_4>:
    
    }
    
    SIGNAL (TIM1_OVF_vect)
    {
    .......
    Muss ich mir wohl was anderes einfallen lassen, hat jemand eine Idee ?

    Internette Grüße
    Stefan

    Nachtrag: es sieht so aus, als würde der Compiler sämtliche Variablen-Deklarationen außerhalb des HAuptprogramms bzw. der Unterprogramme ignorieren?!

  3. #13
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Code:
     
    62:   80 91 64 00    lds   r24, 0x0064 
    66:   8f 5f              subi   r24, 0xFF   ; 255 
    68:   80 93 64 00    sts   0x0064, r24
    Das wär ja ok.

    Jetzt haben wir aber den anderen Teil noch nicht gesehn.

    Sparst Du ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    20.07.2007
    Beiträge
    38
    nö, ich spare nicht. Ich erhielt nur die Nachricht, dass mein Beitrag zu lang wäre, daher dachte ich, ich beschränke mich auf den (wichtigen?) Anfang. Aber ich kann die Datei natürlich auch als Attachment dranhängen, hatte ich garnicht dran gedacht.

    Internette Grüße
    Stefan

    die Datei bitte in main.lss umbenennen, ist unsinnig 21kb zu zippen, aber anders akzeptiert das Forum die Datei nicht (?)
    Angehängte Dateien Angehängte Dateien

  5. #15
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich dachte nur, weil grad' der interessante Teil gefehlt hat

    Also, an der Variablen "Zeittick" liegt es jedenfalls nicht
    Sie ist auf der addresse 0x0064, und genau da greifen sowohl die ISR's als auch dein Main-Vergleich hin.
    Code:
    // Eine nichtunterbrechbare Interrupt-Service-Routine
    SIGNAL (TIM1_COMPA_vect)
    {
    	 Zeittick = Zeittick + 1;
      62:	80 91 64 00 	lds	r24, 0x0064			
      66:	8f 5f       	subi	r24, 0xFF	; 255
      68:	80 93 64 00 	sts	0x0064, r24
    
    }
    SIGNAL (TIM1_OVF_vect)
    {
    	Zeittick = Zeittick + 1;
      86:	80 91 64 00 	lds	r24, 0x0064
      8a:	8f 5f       	subi	r24, 0xFF	; 255
      8c:	80 93 64 00 	sts	0x0064, r24
    
    }
    
    int main (void) 
    {
          while(1) 
         {
    	 if (Zeittick >= 3)
      f8:	80 91 64 00 lds	r24, 0x0064
      fc:	83 30       	  cpi	r24, 0x03	; 3
      fe:	e0 f3       	  brcs	.-8      	; 0xf8 
                    {
    	     PORTB |= (1 << PB3);    // setzt Bit 3 an PortB auf 1
     100:	c3 9a       	sbi	0x18, 3	; 24
     102:	fa cf       	rjmp	.-12     	; 0xf8 <__stack+0x19>
                    }
         }
    }
    Das kann man also vergessen. Beide ISR's zählen am Zeitticker ?

    Jetzt muß man das Timer u. Interrupt Setup auf Richtigkeit checken, denn wenn die laufen, MUSS die main-routine irgendwann >=3 erkennen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    20.07.2007
    Beiträge
    38
    ich hab die Variable Zeittick mal in beide ISR geschrieben um überhaupt eine Reaktion zu bekommen, leider Fehlanzeige. Die Interrupts arbeiten einwandfrei, ich nutze sie ja auch um Port-Pin PB2 zu manipulieren und der tut wie von ihm erwartet. Ich hätte jetzt spontan auf ein Peoblem mit dem Compiler getippt (AVR-GCC), aber du hast recht, wenn man sich die Speicherzugriffe mal ansieht, sollte es laufen

    Internette Grüße
    Stefan

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo,

    Kann sein, daß Du ein Hardwareproblem hast ?
    PB3 geschossen, LED defekt, kalte Lötstelle ?
    An der Software liegt es meiner Meinung nach nicht.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    20.07.2007
    Beiträge
    38
    Hai,

    ich hab auch schon daran gedacht, aber die LED funktioniert. Wenn ich sie direkt ansteuere tut sie wie erwartet. Ich fürchte das wird so langsam mystisch und transzendental. Werde mir wohl einen anderen Weg suchen müssen
    Sollte ich noch was finden, meld ich es hier. Hat denn noch niemand mit dem Tiny25 gearbeitet und könnte mal das Programm ausprobieren ?
    Ich bleib am Ball

    Internette Grüße
    Stefan

  9. #19
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Da ich T25 da habe und mein stk500 ausgepackt liegt, habe ich mal eben schnell ein Testaufbau gemacht und Dein Programm geflasht.

    PB3 Bleibt in der Tat Low, PB 2 Toogelt fröhlich vor sich hin.

    Ich habe kurz Dein Code überflogen , was fällt auf, außer, daß Dein getipse keien Sau lesen kann(will) ?

    in TCCR1 ist PWM1A gesetzt, was sagt das Dattenblatt dazu :

    When set(one) this Bit enables PWM mode based on comparator OCR1A in Timer/Counter1 and the counter value is reset to $00 in the CPU clock cycle after a compare match with OCR1C register value

    Man schaue was Du in OCR1C drin hast ? 0b11111111

    Frage, findet ein Überlauf statt ?

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #20
    Benutzer Stammmitglied
    Registriert seit
    20.07.2007
    Beiträge
    38
    Hai Sebastian,

    ja, genau weil PB2 toggelt, weiß ich, dass die ISR angesprungen wird. Es geht mir ja auch um PB3. Die sollte reagieren. Das tut sie auch nicht, wenn ich Zeittick in beiden ISR inkrementiere. Daraus schließe ich, dass etwas mit der Übergabe der Variablen Zeittick nicht stimmt. PB2 tut wie von ihm erwartet, es geht aber um PB3 (kann man übrigens in meinem Code durchaus erkennen, oder ? )

    Internette Grüße
    Stefan

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests