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.
Druckbare Version
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.
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.
Muss ich mir wohl was anderes einfallen lassen, hat jemand eine Idee ?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)
{
.......
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?!
Das wär ja ok.Code:
62: 80 91 64 00 lds r24, 0x0064
66: 8f 5f subi r24, 0xFF ; 255
68: 80 93 64 00 sts 0x0064, r24
Jetzt haben wir aber den anderen Teil noch nicht gesehn.
Sparst Du ?
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 (?)
:oops: Ich dachte nur, weil grad' der interessante Teil gefehlt hat :oops:
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.
Das kann man also vergessen. Beide ISR's zählen am Zeitticker ?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>
}
}
}
Jetzt muß man das Timer u. Interrupt Setup auf Richtigkeit checken, denn wenn die laufen, MUSS die main-routine irgendwann >=3 erkennen.
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
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
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
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
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 ? O:) )
Internette Grüße
Stefan