Problem in die ISR zu gelangen

OP #3316853
Lesenswert?

Hallo,

nach einigen Arduino Experimenten habe ich mich nun mal an die 
Programmierung mit einem Programmiergerät gewagt. Das ganze klappt auch 
ganz gut. Ein Problem habe ich lediglich hinsichtlich der Interrupts. 
Ich habe mein Programm nun schon so weit gekürzt, dass es ledglich 
folgende Funktionalität erfüllen soll:

Am Datenausgang des Pins D2 liegt nach Initialisierung eine Spannung an, 
eine LED wird somit zum leuchten gebracht.

Die ISR soll ca. alle 500ms Sekunden aufgerufen werden und die Spannung 
vom o.g. Pin nehmen.

Problem ist nun, dass die Spannung leider bestehen bleibt, die ISR also 
anscheinend nicht aufgerufen wird. Im Folgenden zeige ich noch kurz mein 
Programm:
1
int main(void)
2
{
3
    cli();
4
    DDRD|=(1<<2); //Setze DD2 als Ausgang
5
    PORTD=0b00000100; //Setze Keinen Output-Pin auf High
6
    TCCR1B = (1<<CS02); //Prescaler auf 256 setzen
7
    TCNT1=15625;           //Setze Timer auf 15625
8
    TIMSK = (1<<TOIE1); //Interrupt Aktivieren
9
    sei();
10
    
11
    while(1){
12
        asm ("nop");
13
    }
14
    return 0;   /* never reached */
15
}
16

17
ISR(TIMER1_OVF_vect)
18
{
19
     PORTD=0b00000000;
20
     TCNT1=15625;
21
}
Ich hoffe jemand kann mir helfen, sitze schon viel länge dran als 
notwendig :D

PS. Es handelt sich um einen Attiny 2313

Gruß
Dede
Gast #3316861
Lesenswert?

chris schrieb:
> die Ints ansich freigeben zu anfang des Hauptprogramm mit SEI und dann
> die für T1 das TOIE1 in der TIMSK

Quark

>   DDRD|=(1<<2); //Setze DD2 als Ausgang
>   PORTD=0b00000100; //Setze Keinen Output-Pin auf High

100 ist um 3 Stellen geshiftet nicht um 2 !
#3316872
Lesenswert?

Dennis Assenmacher schrieb:
> Die ISR soll ca. alle 500ms Sekunden aufgerufen werden und die Spannung
> vom o.g. Pin nehmen.
Wie kommst du darauf? Mit welcher Frequenz läuft der Controller oder 
besser mit welcher Frequenz glaubst du daß er läuft? Wie sind die Fuses 
eingestellt?
> Problem ist nun, dass die Spannung leider bestehen bleibt, die ISR also
> anscheinend nicht aufgerufen wird. Im Folgenden zeige ich noch kurz mein
Vielleicht wird sie ja irgendwann aufgerufen und du bist nur zu 
ungeduldig.

mfg.
Gast #3316878
Lesenswert?

oh ich sehe hab mich verguckt int main is da ja alles drin ;-)

es gibt zwei möglichkeiten entweder du tooglest den pin in der isr 
selbst oder du nutzt die entsprechenden pins der timer OCRX im ctc mode 
oder pwm mode.
Gast #3316889
Lesenswert?

Karsten S. schrieb:
> chris schrieb:
>> die Ints ansich freigeben zu anfang des Hauptprogramm mit SEI und dann
>> die für T1 das TOIE1 in der TIMSK
>
> Quark
>
>>   DDRD|=(1<<2); //Setze DD2 als Ausgang
>>   PORTD=0b00000100; //Setze Keinen Output-Pin auf High
>
> 100 ist um 3 Stellen geshiftet nicht um 2 !

Naja dann würde die led ja gar nicht leuchten, was sie ja tut
Gast #3316905
Lesenswert?

Laut der iotn2313.h (eingebunden über die io.h) gelten (bei AVR-GCC) 
folgende Makros:

/* Timer/Counter1 Overflow */
#define TIMER1_OVF_vect      _VECTOR(5)
#define SIG_OVERFLOW1      _VECTOR(5)
#define SIG_TIMER1_OVF      _VECTOR(5)

Bei mir hilft es gelegentlich, die ISR mit SIG_OVERFLOW1 oder gleich mit 
_VECTOR(5) aufzurufen.
#3317047
Lesenswert?

da es untergegangen ist:
Wie schnell läuft der µC?

Dann kann man auch mal rechnen, wie lange es tatsächlich dauert, bis ein 
Timer vom 15625 bis 65535 zählt, bei einem Prescaler von 256.

Wenn das noch die default-mässigen 1Mhz des Tiny2313 sind, dann dauert 
das nämlich rund 12 Sekunden.
#3317114
Lesenswert?

Dennis Assenmacher schrieb:
> flash:  all
>   $(AVRDUDE) -U flash:w:main.hex:i -c avrispmkII -p attiny2313 -P usb -U
> hfuse:w:0xd9:m -U lfuse:w:0x24:m
>
> Läuft auf 8Mhz.

No.
Nicht mit der Fuse Einstellung.

Du hast zwar 8Mhz intern selektiert, aber die CKDIV8 aktiv.
Ergo läuft dein µC mit 1Mhz, was sich auf die Zeiten auswirkt. Warte mal 
gaaaaaaanz lange. Nach ca 4 Sekunden sollte die LED ausgehen. Und 4 
Sekunden können lang sein, wenn man auf etwas wartet.
OP #3317125
Lesenswert?

Karl Heinz Buchegger schrieb:
> Dennis Assenmacher schrieb:
>> flash:  all
>>   $(AVRDUDE) -U flash:w:main.hex:i -c avrispmkII -p attiny2313 -P usb -U
>> hfuse:w:0xd9:m -U lfuse:w:0x24:m
>>
>> Läuft auf 8Mhz.
>
> No.
> Nicht mit der Fuse Einstellung.
>
> Du hast zwar 8Mhz intern selektiert, aber die CKDIV8 aktiv.
> Ergo läuft dein µC mit 1Mhz, was sich auf die Zeiten auswirkt. Warte mal
> gaaaaaaanz lange. Nach ca 4 Sekunden sollte die LED ausgehen. Und 4
> Sekunden können lang sein, wenn man auf etwas wartet.

Ne ich hab schon 5 Min gewartet und das sind, bei aller Subjektivität 
nicht 4 Sekunden :D
#3317137
Lesenswert?

Dennis Assenmacher schrieb:

> Ne ich hab schon 5 Min gewartet und das sind, bei aller Subjektivität
> nicht 4 Sekunden :D

ok.
Dann schalte die CKDIV8 erst mal aus.
Das ist dann laut
http://www.engbedded.com/fusecalc/
ein Low-Byte von A4 und ein Highbyte von D9

Und dann poste dein komplettes(!) Programm, so wie es jetzt ist, damit 
man das mal in den Simulator laden kann.

Weiters: bist du dir 100% sicher, wie die LED angeschlossen ist und 
daher leuchtet, wenn der Pin auf 1 gestellt wird? Ich würde die LED in 
der ISR blinken lassen, dann spielt das keine Rolle. Es soll schon 
vorgekommen sein, dass Programmierer die LED Aussage genau verkehrt rum 
hatten und du in Wirklichkeit deine LED 0.5 Sekunden nach Programmstart 
einschaltest anstatt ausschaltest. Was man natürlich ganz schlecht 
sieht. :-)
OP #3317161
Lesenswert?

Karl Heinz Buchegger schrieb:
> Dann schalte die CKDIV8 erst mal aus.
> Das ist dann laut
> http://www.engbedded.com/fusecalc/
> ein Low-Byte von A4 und ein Highbyte von D9

Ok hab ich gemacht.

Hier mein Programm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
int main(void)
5
{
6
    cli();
7
    DDRD=(1<<3); //Setze DD3 als Ausgang
8
    PORTD=0b00000000;//Setze Keinen Output-Pin auf Highdsad
9
    TCCR1B = (1<<CS12); //Prescaler auf 256 setzen
10
    TCNT1=65535-15625;           //Setze Timer
11
    TIMSK = (1<<TOIE1); //Interrupt Aktivieren
12
    sei();
13
    
14
    while(1){
15
        asm ("nop");
16
    }
17
    return 0;   /* never reached */
18
}
19

20
ISR(TIMER3_OVF_vect)
21
{
22
     PORTD=0b00001000;
23
     TCNT1=65535-15625;
24
}

Hab das ganze mal um einen Pin verschoben und eingeführt, dass am Anfang 
keine Spannung anliegt und im Interrupt die LED leuchten soll. Nun 
bleibt die LED folglich aus. Ändere ich in der main() 
PORTD=0b00000000; auf PortD=  PORTD=0b00001000; ist die LED auch an. Er 
geht folglich nur nicht in den Interrupt und initialisiert richtig.
OP #3317239
Lesenswert?

Karl Heinz Buchegger schrieb:
> Dennis Assenmacher schrieb:
>> Karl Heinz Buchegger schrieb:
>>> Dennis Assenmacher schrieb:
>>>
>>>> ISR(TIMER3_OVF_vect)
>>>
>>> Wieso auf einmal TIMER3 ?
>>
>> war nur ein copy paste fehler
>
> Wie kann an dieser Stelle ein Copy&Paste Fehler enstehen.
>
> Ansonsten: schlechte Nachricht.
> Korrigiert auf TIMER1 zeigt der Simulator, dass alles in Ordnung ist.
> Die ISR wird angesprungen.

Puh!

Vielen Dank erstmal fürs gegenchecken. Dann stimmt wohl was mit meinem 
Diamex Programer nicht, oder viel wahrscheinlicher hab ich was falsch 
gemacht.
#3317255
Lesenswert?

Dennis Assenmacher schrieb:
> Stefan Ernst schrieb:
>> Poste den Build-Output.
>> Ich tippe auf so was wie "nicht für den richtigen Controller
>> kompiliert/gelinkt"
>
> Sorry aber was genau soll ich posten? was avrdude ausgibt?

Nö.
Er meint den Output vom Compiler

Soll schon vorgekommen sein, dass man sich ein vorhandenes Projekt als 
Grundlage genommen hat und dann vergessen hat, den µC-typ umzustellen. 
Und so compiliert man dann für zb einen Mega8 und versucht das auf einem 
Tiny2313 laufen zu lassen ohne es zu merken.
OP #3317261
Lesenswert?

Karl Heinz Buchegger schrieb:
> Dennis Assenmacher schrieb:
>> Stefan Ernst schrieb:
>>> Poste den Build-Output.
>>> Ich tippe auf so was wie "nicht für den richtigen Controller
>>> kompiliert/gelinkt"
>>
>> Sorry aber was genau soll ich posten? was avrdude ausgibt?
>
> Nö.
> Er meint den Output vom Compiler
>
> Soll schon vorgekommen sein, dass man sich ein vorhandenes Projekt als
> Grundlage genommen hat und dann vergessen hat, den µC-typ umzustellen.

Gelöst :D

Genau das war das Problem. Hab dem avrdude den richtigen Controller 
angegeben während der Compiler nen Atmega8 stehen hatte. Vielen, vielen 
Dank an alle!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren