Forum: Mikrocontroller und Digitale Elektronik Problem in die ISR zu gelangen


von Dennis A. (dede1989)


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

von chris (Gast)


Lesenswert?

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

von Blubber (Gast)


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 !

von Thomas E. (thomase)


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.

von chris (Gast)


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.

von Spess53 (Gast)


Lesenswert?

Hi

Wie ist die LED angeschlossen?

An welcher Stelle sollte die LED wieder eingeschaltet werden?

MfG Spess

von Thomas E. (thomase)


Lesenswert?

Karsten S. schrieb:

> 100 ist um 3 Stellen geshiftet nicht um 2 !

> Quark

von andy (Gast)


Lesenswert?

TCCR1B = (1<<CS02)

müsste (1<<CS12) sein,habe aber schon lange nichts mehr mit dem 2313 
gemacht.

gruss

andy

von Blubber (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Karsten S. schrieb:
>
>> 100 ist um 3 Stellen geshiftet nicht um 2 !
>
>> Quark

Hmjo... Hirnaussetzer...mein Fehler

von Thomas E. (thomase)


Lesenswert?

andy schrieb:
> TCCR1B = (1<<CS02)
>
> müsste (1<<CS12) sein,habe aber schon lange nichts mehr mit dem 2313
> gemacht.
>
> gruss
>
> andy

Das ist richtig. Da aber die Bitpositionen gleich sind, stört das keinen 
grossen Geist.


mfg.

von Dennis Assenmacher (Gast)


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

von Spess53 (Gast)


Lesenswert?

Hi

>TCCR1B = (1<<CS02)

>müsste (1<<CS12) sein,habe aber schon lange nichts mehr mit dem 2313
>gemacht.

Macht in dem Fall nichts weil beides eine 2 repräsentiert.

MfG spess

von Dennis Assenmacher (Gast)


Lesenswert?

Spess53 schrieb:
> Hi
>
> Wie ist die LED angeschlossen?
>
> An welcher Stelle sollte die LED wieder eingeschaltet werden?
>
> MfG Spess

Naja. Kathode mit Gnd Anode mit dem pin :D. Die Led soll erstmal nicht 
wieder angeschaltet werden. Mir gehts primär darum Oberhaupt in die isr 
zu kommen.

von Robert S. (Gast)


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.

von Karl H. (kbuchegg)


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.

von Dennis A. (dede1989)


Lesenswert?

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.

Sollte auch heißen:

TCNT1=65535-15625;

Hab nun alles soweit korrigiert, funktioniert nur noch immer nicht.

von Felix P. (fixxl)


Lesenswert?

Steht irgendwo im Quelltext
1
#include <avr/interrupt.h>
?

von Karl H. (kbuchegg)


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.

von Bäh (Gast)


Lesenswert?

Schalte doch mal alle Warnungen im Compiler an, vielleicht hilft das ja.

von Dennis A. (dede1989)


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

von Dennis A. (dede1989)


Lesenswert?

Felix Pflaum schrieb:
> Steht irgendwo im Quelltext#include <avr/interrupt.h>?

ja :D

von Karl H. (kbuchegg)


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. :-)

von Dennis A. (dede1989)


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.

von Karl H. (kbuchegg)


Lesenswert?

Dennis Assenmacher schrieb:


> ISR(TIMER3_OVF_vect)

Wieso auf einmal TIMER3 ?

von Dennis A. (dede1989)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Dennis Assenmacher schrieb:
>
>> ISR(TIMER3_OVF_vect)
>
> Wieso auf einmal TIMER3 ?

war nur ein copy paste fehler

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

Poste den Build-Output.
Ich tippe auf so was wie "nicht für den richtigen Controller 
kompiliert/gelinkt".

von Dennis A. (dede1989)


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.

von Dennis A. (dede1989)


Lesenswert?

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?

von Karl H. (kbuchegg)


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.

von Dennis A. (dede1989)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.