Hallo liebe Leute,
ich hätte da mal eine Frage an die ATmega Cracks... :)
Ich programmiere gerade mit einem Arduino mit dem ATmega2560 per Atmel
Studio in Assembler, um mich da ein wenig einzuarbeiten.
Konkret geht es um die Timer.
Ich habe (nachfolgend) ein Programm, das den TIMER0 nutzt. Per ISR wird
ein Ausgangspin (Digital Pin 11) getoggelt UND per CompareMatch-Einheit
soll der zugehörige Ausgang OC0A (Digital Pin 13) im Toggle Modus
betrieben werden.
Der ISR-Teil läuft auch, aber am Digital Pin 13 (OC0A) erscheint NICHT
das Rechtecksignal...
Sieht jemand einen Grund dafür?
Eine weitere Frage hätte ich noch...bei der Initialisierung von TIMSK0
funktioniert der Befehl "out" nicht...ich muss hier statt dessen "sts"
verwenden...das ist mir völlig unklar...
Nachtrag: Ich verwende das Atmel Studio in der Version 7.0.1931 mit den
installierten Packages in der Version 7.0.122
Der Assembler meldet mir bei Verwendung von out bei dem Beschreiben von
TIMSK0 den Fehler "Operand 1 out of range: 0x6e"
LG Uwe
Uwe H. schrieb:> Der Assembler meldet mir bei Verwendung von out bei dem Beschreiben von> TIMSK0 den Fehler "Operand 1 out of range: 0x6e"
Glaube der Meldung!
Glaube der Meldung!
(verwende stattdessen STS)
Uwe H. schrieb:> bei der Initialisierung von TIMSK0> funktioniert der Befehl "out" nicht...ich muss hier statt dessen "sts"> verwenden...das ist mir völlig unklar...
in und out können nur die Adressen 0-63 ansprechen. Darüber muss man
ld(s) und st(s) verwenden. Steht aber so im Datenblatt Kapitel "AVR
Memories". siehe dazu auch die "Register Summary".
Hi
>Der ISR-Teil läuft auch, aber am Digital Pin 13 (OC0A) erscheint NICHT>das Rechtecksignal...
Setze mal das OCR0A-Register auf einen Wert zwischen 100 und 255.
>Eine weitere Frage hätte ich noch...bei der Initialisierung von TIMSK0>funktioniert der Befehl "out" nicht...ich muss hier statt dessen "sts">verwenden...das ist mir völlig unklar...
in/out können nur die Register im IO-Breich ($00..$3F) adressieren. Das
sind die Register die im Datenblatt in 'Register Summary' mit zwei
Adressen gekennzeichnet sind. TIMSK0 (Adresse $6E) liegt aber im
erweiterten IO-Bereich der nur mit sts ansprechbar ist.
MfG Spess
Uwe H. schrieb:> aber am Digital Pin 13 (OC0A) erscheint NICHT> das Rechtecksignal... Sieht jemand einen Grund dafür?
TCCR0A ist falsch intitialisiert.
OCR0A nicht auf Wert gesetzt.
(Hab grad nur das Datenblatt zum At90CAN da, daher mal selber nachsehen)
Herzlichen Dank für die fachkundige Antwort hinsichtlich IN/OUT bzw.
LDS/STS!
Habe es gerade nachgeschlagen...Unterschied ist, das IN/OUT nur einen
Maschinenzyklus benötigen, LDS/STS jedoch zwei Maschinenzyklen.
Hinsichtlich des fehlenden Signals an OC0A haben Eure Hinweise leider
nicht geholfen. Ich habe die Timer0 Initialisierung nun wie folgt
geändert. Es erscheint trotzdem kein Signal.
Any further hints?
Uwe H. schrieb:> soll der zugehörige Ausgang OC0A (Digital Pin 13)
Bist du sicher, dass der OC0A an Digital Pin 13 liegt? Ich meine mich
dunkel zu erinnern, dass die OCs alle in den analog Bereich geroutet
sind?! Zumindest schließe ich aus dem Digital Pin, dass du mit nem
Arduino Mega2560 rummachst. Evtl einfach mal die anderen Pins nach ner
Reaktion belauschen.
MfG Chaos
Liebe Helfer,
danke für die Hinweise mit dem Makros ;) auch wenn das nichts mit der
Frage nach dem fehlenden Signal zu tun hat, aber wohl mit dem IN/OUT
bzw. LDS/STS wie ich vermute...
Mittlerweile habe ich mir für alle sechs Modi (CTC, Fast PWM etc.)
Testprogramme geschrieben und die arbeiten auch alle wie erwartet.
Nur im Normal-Mode bekomme ich am Pin OC0A (Ja, beim Arduino mit dem
2560 ist das der DigitalPin 13) einfach kein Signal erzeugt.
Im Datenblatt des ATmega 2560 findet sich auf Seite 120 folgender
Hinweis:
"Using the Output Compare to generate waveforms in Normal mode is not
recommended, since this will occupy too much of the CPU time."
Ob im Rahmen eines Re-Designs vom 2560 diese Betriebsart einfach deshalb
entfernt wurde und deshalb nichts am Pin liefert?
Reine Spekulation!
LG Uwe Homm
Kurzer Nachtrag: Ich kontrolliere die Signale mit einem Oszilloskop.
> alle sechs Modi ... die arbeiten auch alle wie erwartet.
Da zögere ich jetzt mit meiner Vermutung, trotzdem: OC0A liegt beim
ATmega2560 auf B7, wurde dieser Pin als Ausgang definiert? In INIT_TMR0
sehe ich davon nichts, dort hätte ich es erwartet.
Danke, dass Du Dich nochmal mit meinem Problem beschäftigst!
Ja, POPRTB7 ist als Ausgang definiert...siehe mein erstes Posting. Ich
habe das ganz am Anfang in dem Bereich "Initialisierung nach Neustart"
gemacht.
LG
Uwe Homm
Tja, ich habe keinen ATmega2560 (geschweige denn einen Arduino), aber
auf dem verwandten ATmega1284 läuft es, und in dessen Datenblatt steht
derselbe zitierte Hinweis; der sich übrigens wohl nur auf die
Interruptverwendung bezieht, denn davor steht: "The Output Compare Unit
can be used to generate interrupts at some given time."
Das Testprogramm hat sich NUR dahingehend geändert, dass ich auf den
Vorschlag von Thomas F. (igel) (13.07. um 11:31) und dessen Vorgänger
das Register OCR0A bei der Timerinitialisierung mit einem Wert vorbelegt
habe (siehe meinen Post vom 13.07. um 12:48 Uhr). Inwiefern ich TCCR0A
falsch eingestellt hätte, ist mir unklar.
DAS war die einzige Änderung gegenüber meinem ersten Posting.
LG
Uwe Homm
Uwe Homm schrieb:> habe das ganz am Anfang in dem Bereich "Initialisierung nach Neustart"> gemacht.
Habe das mal in der Arduino IDE getestet.....
PB7 und PB5 flackern friedlich vor sich hin
1
intmain()
2
{
3
DDRB|=_BV(PB5)|_BV(PB7);
4
TCNT0=100;
5
OCR0A=101;// setze OCR0A < 101, und die LED bleibt aus)
6
TCCR0A=(1<<COM0A0);
7
TCCR0B=(1<<CS02)|(1<<CS00);
8
TIFR0=(1<<TOV0);
9
TIMSK0=(1<<TOIE0);
10
sei();
11
for(;;);
12
}
13
14
ISR(TIMER0_OVF_vect)
15
{
16
TCNT0=100;
17
PINB=(1<<PB5);
18
}
Dein Fehler ist offensichtlich!
Du setzt bei jeder Gelegenheit TCNT0 = 100.
Aber OCR0A steht auf Auslieferungszustand == 0
Selbst 100 reicht nicht.
Der Schwellwert wird nie durchlaufen.
Damit bleibt PB7 dauerhaft aus.
OCR0A MUSS größer 100 eingestellt werden.
Danke...Du bist mein Held :)
DAS habe ich total aus den Augen verloren.
Nun geht das Testprogramm auch; gleiches Signal wie am Pin 11 durch den
OVERFLOW Interrupt.
LG
Uwe Homm
S. Landolt schrieb:> (und ursprünglich um Assembler)
Ja, ich machs mir lieber mit einem Compiler...(wenn es irgendwie geht)
Für ASM habe ich noch nicht mal eine eingerichtete Testumgebung.
(ok, *.S Dateien in Arduino Libs bekomme ich gerade noch hin)
S. Landolt schrieb:> Ihre Hilfe
? ?
Deine!
Ansonsten, danke für die Blumen.
Irgendwie bin ich überrascht, dass meins geholfen hat.
Denn, dass, und auch mit welchem Wert OCR0A vorbesetzt werden muss,
wurde ja schon im Thread genannt.
Als da keine (positive) Reaktion drauf erfolgte, musste es getestet
werden.
Dass ich geduzt werde, daran habe ich mich gewöhnt (werd's ja sogar auf
Wahlplakaten von Laternenpfählen herunter). Selbst jedoch mir sonst
völlig unbekannte Menschen zu duzen, daran werde ich wohl nie gewöhnen.
Lassen wir es dabei bewenden, und nichts für ungut.