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
intmain(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
return0;/* 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
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 !
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.
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.
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.
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
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
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.
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.
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.
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.
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.
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
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. :-)
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
return0;/* 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.
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.
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.
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?
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.
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!