es soll eine led an PB0 flackern lassen, es passiert aber nichts. nach
dem einschalten ändert sich nichts an der led. mit "_delay_ms"
funktioniert das togglen einwandfrei, wo liegt denn da der fehler?
der attiny läuft bei 8Mhz mit internem oszillator.
Adrian Figueroa schrieb:> TCCR1 |= ((1 << CS13) | (1 << CS12)); // ps 4096 -> 2kHz
das sind aber keine 4096, sondern 2048.
Deine 10Hz sind also eher 20Hz. Und wenn man nicht so genau schaut, dann
ist das nicht so sehr ein kräftiges Flackern, sondern schon fast ein
gleichmässiges Leuchten.
> CTC Mode einstellen vergessen!
Aber ich setze doch den counter manuell zurück? Ich möchte selbst
steuern, wann er sich zurücksetzt.
> das sind aber keine 4096, sondern 2048.
ok, ich hab mal vier bits gesetzt (CS10 bis 13) -> ca. 16k Prescaler
Da sollte ich doch eigentlich was sehen.
> Ich würde das trotzdem so machen:
das ist ja nur ein beispielprogramm ;) ich möchte später IR-Sequenzen
auslesen, dazu wird der empfänger einen interrupt erzeugen, der dann den
aktuellen zählerstand ausliest und dann wieder nullt! dafür muss ich ihn
manuell setzen können.
> schau mal Datenblatt des ATtiny45 ab seite 89. es fehlen noch ein paar> register einträge.
ich habe mal alles zu timer1 gelesen. :)
mir fällt kein versäumnis auf. ich will weder vergleichsregister setzen,
noch pwm nutzen. Ich brauche keine interrupts, auch keinen fast mode
oder sowas. der zähler soll nur zählen und ich möchte ihn manuell
auslesen.
Adrian Figueroa schrieb:> ok, ich hab mal vier bits gesetzt (CS10 bis 13) -> ca. 16k Prescaler
CS13? Reden wir vom gleichen Controller?
Der Attiny45 hat nur CS10-CS12 in diesem Register.
Adrian Figueroa schrieb:> DDRB ^= (1 << PB0);
So setzt/toggelt man keinen Port!
Sondern so: PORTB ^= (1 << PB0);
Und das funktioniert im zweiten Beispiel?
> So setzt/toggelt man keinen Port!> Sondern so: PORTB ^= (1 << PB0);
oh ja... hat bei timer0 geklappt, weil ich den ja pin vorher schon
eingeschaltet habe, ich schalte also zwischen ein- und ausgang hin und
her, also einmal mit internem pullup und einmal ohne.
> du schmeißt die Timer-Bezeichnungen durcheinander!
naja, wenn ich den timer nicht benutze, ist das ja nicht schlimm, oder?
..die konzentration lässt nach.. neuer versuch ;) das hier läuft
jedenfalls nicht.
Was erwartest Du? Du benutzt einen Vorteiler von 1024, bekommst bei 8
MHz Systemtakt also eine AN/AUS-Dauer von jeweils 25,6 ms -- also
nichts, was man als Blinken identifizieren würde!
Ich zähle erst noch bis 200!
Mit dem Timer0, den ich auch auf 1024er Prescaler gestellt habe und
einem Counter von 200, konnte ich das Blinken klar sehen, mit Timer1
bekomme ich nur ein dauerleuchten!
Adrian Figueroa schrieb:> Ich zähle erst noch bis 200!
Genau davon bin ich auch ausgegangen:
200*(1024/8000000Hz)= 25,6 ms
> Mit dem Timer0, den ich auch auf 1024er Prescaler gestellt habe und> einem Counter von 200, konnte ich das Blinken klar sehen, mit Timer1> bekomme ich nur ein dauerleuchten!
Natürlich kann man ein "Blinken" von 20 Hz wahrnehmen; genau das
bekommst Du mit Deinem zuletzt oben gezeigten Programm. Schau aber mal
nach, ob mit der Hardware alles OK ist, also die LED wirklich an PB0
hängt usw.
Ja, die Hardware stimmt soweit. Ich kann alles schalten.
Wie gesagt, wenn ich TCNT1 durch TCNT0 ersetze und entsprechend den
Timer0 auf Prescaler 1024 einstelle, klappt alles einwandfrei!
Deine Terminologie finde ich etwas seltsam. 20 Hz "Flimmern" nennst Du
"Blinken"?
Du zeigst uns wirklich Dein aktuelles Programm (also ohne Setzen der
PSR1/PCKE Bits)? CKSEL Fuse?
> Du zeigst uns wirklich Dein aktuelles Programm
Ja.
> also ohne Setzen der PSR1/PCKE Bits
ich habe sonst nichts gesetzt. ich habe auch mal zuvor die register zu
null initialisiert.
> CKSEL Fuse?
CKSEL = 0010, SUT=10, den Taktteiler habe ich ausgeschaltet (CKDIV8=1
[active low?]).
Die Fuses sind also 0xE2(low) 0xDF(high) 0xFF(ext.)
Die genannten Fuses stimmen. Du bist Dir sicher, dass Du den aktuellen
Code im Flash stehen hast? Und dass der Compiler für den Attiny45
kompiliert? Und dass an PB0 sonst nichts mehr hängt? Mal einen anderen
Pin versucht?
Versuche doch auch einmal einen größeren Divisor als 1024; beim Timer1
kann man doch bis 16384 gehen.
Hm.. Ja, gerade nochmal neu geflasht.
PB0 funktioniert einwandfrei mit Timer0! Ich habe auch schon PB1 und PB3
getestet, immer das selbe. Die if Bedingung wird nie erfüllt. Wenn ich
sowas reinschreibe wie "PORTB |= (1<<PB0)" und die LED vorher aus war,
geht sie dann nicht an.
Ich habe schon alle möglichen Prescaler benutzt.. fürs erste werde ich
wohl bei Timer0 bleiben, ich weiß nicht was falsch sein soll.
Ein anderer attiny45 zeigt übrigens das gleiche verhalten ;)
Ich glaube nicht, dass man dir noch helfen kann wenn ich ehrlich bin.
- Der Code ist fehlerfrei
- Der Controller ist nicht defekt
- Der Systemtakt scheint zu stimmen
Was anderes kommt gar nicht in Frage, ausser dass dein Compiler aus
irgend einem komischen Grund den Timer1 nicht kennt..
Was benutzt du eig. für eine Entwicklungsumgebung?
Womit flasht du den Controller?
Oder du verarscht uns einfach :P
Wenn ich in die if-Bedingung TCNT1==0 einsetze, dann dimmt er die led,
ich muss also davon ausgehen, dass der zähler nicht hochzählt.
> Was benutzt du eig. für eine Entwicklungsumgebung?> Womit flasht du den Controller?
Winavr/avrdude mit einem china-usbasp..
so sieht das aus: ;)
Seh' ich so wie "Digitalism".
Zeig vielleicht auch mal die *.lss Datei (Du hast noch nicht gesagt,
welche Winavr Version Du verwendest. Ich weiß nicht, ob alte
Compiler-Versionen jemals mit dem Timer1 Probleme hatten... aber
trotzdem.).
> Mal eine ganz doofe Frage: Ziehst du eigentlich auch deinem Programmer> ab, um zu testen? PB0 und PB1 liegen nämlich auf MISO/MOSI.
Oh! :) den habe ich tatsächlich noch dran :D probier ich demnächst mal
ohne ;)
> Timer0 hat CS00-02 und Timer1 hat CS10-13 und die Bits liegen auch> anders. Ich denke hier liegt dein Problem?
nein, ich habe die richtigen bits gesetzt, siehe oben
Das *.lss Listing ist in Ordnung: Registeradressen und Code passen zum
Attiny45.
"thomase" hat Dich auf den noch eingesteckten Programmer aufmerksam
gemacht. Nachdem Du mir vorher geantwortet hattest, dass an PB0 sonst
nichts mehr hängt, war wohl doch noch der Programmer dran... Ist er
jetzt immer noch verbunden?
Bei praktisch jedem Deiner Code-Schnipsel hast Du ++mehrere++ Dinge
geändert. In der *.lss Datei schreibst Du
1
if (TCNT1 == 100)...
Jetzt wieder
1
if(TCNT1 > 200)...
.
Mir ist zwar klar, dass das nicht ändern sollte, aber trotzdem ist das
kein guter Stil für die Fehlersuche. Zusätzlich veränderst Du immer
wieder den Wert für den Timer-Vorteiler. Das ist im Allgemeinen kein
guter Ansatz, um einen Fehler einzugrenzen.
Was nötig ist, um hier weiterzukommen:
- Dein aktuelles Programm
- der Aufbau (gutes Foto, Schaltplan, am besten auch mit den
Verbindungen zum Oszi sichtbar)
Adrian Figueroa schrieb:> TCCR1 |= (1 << CS10) | (1 << CS11) | (1 << CS13);> TCCR0B |= (1<<CS02) | (1<<CS00);
da stimmt doch was mit deinen Bildern nicht, du stellst hier zwei total
unterschiedliche Teiler ein, aber die sich ergebende Frequenz ist
gleich???
Electronics'nStuff schrieb:> @TE Watchdog Fuse gesetzt beim Attiny?
Weiter oben hat der TE geschrieben, dass die High Fuse 0xDF ist, also
ist der WDT aus.
> "thomase" hat Dich auf den noch eingesteckten Programmer aufmerksam> gemacht. Nachdem Du mir vorher geantwortet hattest, dass an PB0 sonst> nichts mehr hängt, war wohl doch noch der Programmer dran... Ist er> jetzt immer noch verbunden?
nein, nicht mehr.
Hier bilder vom Aufbau mit dem Code:
Thomas Eckmann schrieb:> Am Controller fehlt ein 100nF Stützkondensator.
Sehe ich auch so. Mit kurzen Leitungen, möglichst direkt von Pin 8 nach
Pin 4. Und da kein BOD aktiviert ist, gleich noch einen Widerstand (15 k
oder so) von Pin 8 nach RESET.
ich habe einen hinzugefügt, keine änderung. noch ein bild:
50mV/cm Gleichspannungskompensiert (Amplitude ca. 150mV), Timebase 0,1us
bei 5-Fach streckung! Das sind dann ca. 17Mhz... ?! Ich weiß ja nicht,
was das sein soll, ich tippe auf eine wertlose Messung ;)
http://www.abload.de/img/dsc06350v9xoz.jpg
aber es geht mit dem "nop"... seltsam, dass er das für timer0 dann
drinlässt
Man kann mal die Profi´s fragen ob das ein Feature oder Bug is.
Hier liest bestimmt keiner mehr von denen mit :)
Sollte sich niemand melden einfach ein neues Thema aufmachen mit
aussagekräftiger Überschrift.
Jörg Esser schrieb:> Hiermit gehts dann. Scheint was wegoptimiert zu werden?
Unsinn.
Ich weiss ja nicht, was der WAI da veranstaltet. Aber ein
funktionierendes Programm habe ich ihm schon gestern abend geschickt:
Thomas Eckmann schrieb:> Das läuft auf meinem Attiny 25 so, wie du es dir vorstellst:
Wenn er das nimmt, für den Attiny45 kompiliert, mit Optimierung -0s,
dann läuft das auch. So ein Popelkram ist absolut Pillepalle. Dafür
braucht man 5 Minuten, wenn überhaupt. Und nicht 2 Tage, die das jetzt
schon dauert.
Da wird nichts wegoptimiert und da wurde jetzt auch kein Compilerbug
entdeckt.
Es bringt überhaupt nichts an irgendwelchen Einstellungen, sei es an den
CS-Bits noch an der Optimierung rumzuspielen. Der Fehler liegt irgendwo
anders. Mit hoher Wahrscheinlichkeit sitzt er vor dem PC.
Weil die Watchdog-Fuse gesetzt ist, das falsche Hexfile geflasht wird,
irgendein vermurxtes Makefile benutzt wird, an statt sich das erzeugen
zu lassen oder was auch immer. Nein. Und der Controller ist auch nicht
kaputt.
mfg.
Was soll ich sagen? Es läuft eben nicht, auch wenn der Code korrekt ist.
Ich habe ein neues makefile gemacht und die fuses neu geflasht...
hier mal das makefile, ist das vielleicht kaputt?
Adrian Figueroa schrieb:> Was soll ich sagen? Es läuft eben nicht, auch wenn der Code korrekt ist.> Ich habe ein neues makefile gemacht und die fuses neu geflasht...> hier mal das makefile, ist das vielleicht kaputt?
Warum wurschtelst du dir damit überhaut einen ab? Lass dir das
automatisch erzeugen.
Womit programmierst du überhaupt? Oder habe ich das irgendwo überlesen?
mfg.
> Warum wurschtelst du dir damit überhaut einen ab? Lass dir das> automatisch erzeugen.
dafür nehme ich mfile aus dem winavr paket. mit winavr und programmers
notepad schreibe ich auch.
Adrian Figueroa schrieb:> dafür nehme ich mfile aus dem winavr paket. mit winavr und programmers> notepad schreibe ich auch.
Installier dir AVR-Studio und du hast diese ganzen Probleme nicht.
mfg.
Also ich kann das hier nachvollziehen mit Winavr unter eclipse. Basta!
Keine Ahnung was avrstudio macht.
Um das ganz genau zu sehen muss man sich halt mal den ganzen Compile
Prozess
und Assembler Code anschauen. Einmal mit NOP und einmal ohne.Fertig.
Sorry aufm iPad geschrieben.
Jörg Esser schrieb:> rozess> und Assembler Code anschauen. Einmal mit NOP und einmal ohne.Fertig.
Wenn der einzige Unterschied dabei, nicht das eingefügte NOP ist, ist
das Ganze absoluter Müll.
mfg.
ich habe atmel studio ausprobiert. natürlich ist mein usbasp dazu nicht
kompatibel, deswegen benutze ich avrdude zum flashen der .hex, die der
debugger erzeugt: kommt das gleiche raus.
ich benutze die vorlage für den attiny45, also kann mein makefile nicht
falsch sein!
Timer0 geht, Timer1 nicht.
Bin noch ziemlich neu in C und mit Timer hab ich auch nichts gemacht
(kommt bald), aber da ich mit dem Tiny 13 was machen will mit C und
schon gemacht habe, hab ich natürlich auch schon die Auswirkungen des
fehlenden 100nF gespürt. Da kommt es zu so manchem komischen Verhalten.
Unter Timer 1 stand, dass er eine Pause von 100 µs braucht um sich zu
stabilisieren. Kann das auch damit zu tun haben? Oder ist die Frage
völlig bescheuert?
Adrian Figueroa schrieb:>> Kann das auch damit zu tun haben?>> aber dann sollte er doch nach 100us laufen? :)
Das ist eben die Frage, die ich mir stellte. Kommt er so überhaupt in
den richtigen Takt?
Auch die 100nF sind so ein Ding. Hatte schon ganz viel mit nem ATmega
328 gemacht und da gab es nie Probleme auf dem Steckbrett, auch ohne
einen Kondensator und erst nachdem ich mir nicht erklären konnte, wieso
der Tiny so ein merkwürdiges Verhalten an den Tag legte, machte ich mal
die 100nF dazu und siehe da, alles lief wie es erwartet wurde.
Ohne, dass ich jetzt hier zur Schlacht um die Entwicklungsumgebung
aufrufen will, aber ich schließe mich einem Vorredner an und finde es
auch richtig das Atmel Studio zu nehmen.
Es ist ein Monster und auf meinem Netbook braucht es etwas, bis alles da
ist, aber da das nun mal die neuste Software und das Zugpferd von AVM
ist, finde ich sollte man das nehmen. Zumindest für Testzwecke, wenn es
auf anderen Umgebungen Fehler gibt.
> finde es auch richtig das Atmel Studio zu nehmen.
ja, das überleg ich mir, nur wird mein programmer sowieso nicht direkt
unterstützt (auch wenn das nicht unbedingt tragisch ist)
Adrian Figueroa schrieb:>> finde es auch richtig das Atmel Studio zu nehmen.>> ja, das überleg ich mir, nur wird mein programmer sowieso nicht direkt> unterstützt (auch wenn das nicht unbedingt tragisch ist)
So ein "Dragon" ist eine feine Sache und kostet nicht viel. Damit ist
dann auch debuggen ne feine Sache.
Da ich selbst noch ein blutiger Anfänger bin, hat es was gebraucht bis
ich beim Drachen war. Ist jetzt mein "Lieblingsspielzeug".
Der Drachen ist das Schweizer Taschenmesser überhaupt... hatte mit dem
STK-500 angefangen und mir dann bald den Dragon wg. USB geholt...
Programmieren (SPI, HV, JTAG, [PDI]), Onboard-Debuggen (JTAG, DebugWire)
und das für fast alle AVRs von Tiny über Mega bis XMega. Was will man
mehr?
Grüße
Markus
Echt Geisterstunde hier;)
C Code sieht gut aus, Assembler Listing sieht gut aus.
ATTin45 hat da sicher keinen Bug, das hätte man schon früher gemerkt.
Das einzige was scheisse aussieht ist der kleine einsame Käfer
auf dem Steckbrett. Man muss kein Hellseher sein um da
schlimmes zu denken.
Vieleicht hat er ja Timer1 per Fuse auf ATTiny15 kompatibel
gefused? Aber das würde es auch nicht erklären.
Ich bin mal gespannt ob hier noch irgendeine sinnvolle
Erklärung zu dem Phänomen rauskommt.
Thomas Eckmann schrieb:> Wenn er das nimmt, für den Attiny45 kompiliert, mit Optimierung -0s,> dann läuft das auch. .....
Du lässt Dich hier ja ganz schön überheblich über den TE aus.
Ich hatte auch massive Zweifel, konnte die Ergebnisse des TEs aber mit
einem Attiny45-20PU mit den o.g. Fuses (siehe
Beitrag "Re: Attiny45, timer tut nichts?" ) 100% verifizieren.
Einen Attiny25 habe ich nicht da, kann also Dein Ergebnis hinsichtlich
des Attiny25 nicht testen. Mit dem Attiny85 erhalte ich identische
Ergebnisse wie unten beschrieben.
Kompiliert mit -Os (-O1 ändert nichts), Atmel Studio 6.0.1882, d.h.
AVR_8_bit_GNU_Toolchain_3.4.0_663.
Hardware: Mit 5V betriebener Attiny45-20PU (Date code (?) 1108, auf der
Unterseite steht noch "L8 TAIWAN 16") auf einem STK500.
Wie schon der TE fand, geht dies:
1
while(1) {
2
asm volatile("NOP");
3
6a: 00 00 nop
4
if(TCNT1 > 200) {
5
6c: 8f b5 in r24, 0x2f ; 47
6
6e: 89 3c cpi r24, 0xC9 ; 201
7
70: e0 f3 brcs .-8 ; 0x6a <main+0x14>
8
PORTB ^= (1 << PB0);
9
72: 88 b3 in r24, 0x18 ; 24
10
74: 89 27 eor r24, r25
11
76: 88 bb out 0x18, r24 ; 24
12
TCNT1 = 0;
13
78: 1f bc out 0x2f, r1 ; 47
14
7a: f7 cf rjmp .-18 ; 0x6a <main+0x14>
Das aber nicht:
1
while(1) {
2
//asm volatile("NOP");
3
if(TCNT1 > 200) {
4
6a: 8f b5 in r24, 0x2f ; 47
5
6c: 89 3c cpi r24, 0xC9 ; 201
6
6e: e8 f3 brcs .-6 ; 0x6a <main+0x14>
7
PORTB ^= (1 << PB0);
8
70: 88 b3 in r24, 0x18 ; 24
9
72: 89 27 eor r24, r25
10
74: 88 bb out 0x18, r24 ; 24
11
TCNT1 = 0;
12
76: 1f bc out 0x2f, r1 ; 47
13
78: f8 cf rjmp .-16 ; 0x6a <main+0x14>
Bei identischer Initialisierung funktioniert (d.h. 20Hz Rechteck an PB0)
auch Folgendes:
1
while(1) {
2
if (TCNT1 > 200) {
3
PORTB^=(1<<PB0);
4
68: 91 e0 ldi r25, 0x01 ; 1
5
{
6
DDRB |= (1 << PB0) | (1 << PB1);
7
PORTB |= (1 << PB0)| (1 << PB1);
8
TCCR1 |= (1 << CS10) | (1 << CS11) | (1 << CS13);
9
while(1) {
10
if (TCNT1 > 200) {
11
6a: 8f b5 in r24, 0x2f ; 47
12
6c: 89 3c cpi r24, 0xC9 ; 201
13
6e: e8 f3 brcs .-6 ; 0x6a <main+0x14>
14
PORTB^=(1<<PB0);
15
70: 88 b3 in r24, 0x18 ; 24
16
72: 89 27 eor r24, r25
17
74: 88 bb out 0x18, r24 ; 24
18
TCNT1=0;
19
76: 1f bc out 0x2f, r1 ; 47
20
asm volatile("NOP");
21
78: 00 00 nop
22
7a: f7 cf rjmp .-18 ; 0x6a <main+0x14>
Relevant scheint das Nullen des TCNT1 zu sein, denn mit
1
while(1) {
2
if (TCNT1 > 200) {
3
6a: 8f b5 in r24, 0x2f ; 47
4
6c: 89 3c cpi r24, 0xC9 ; 201
5
6e: e8 f3 brcs .-6 ; 0x6a <main+0x14>
6
PORTB^=(1<<PB0);
7
70: 88 b3 in r24, 0x18 ; 24
8
72: 89 27 eor r24, r25
9
74: 88 bb out 0x18, r24 ; 24
10
76: f9 cf rjmp .-14 ; 0x6a <main+0x14>
bekomme ich das erwartete Signal (schnelles Umschalten an PB0 bei jedem
Durchgang wenn TCNT1>200) -- siehe Bild.
Dies wird auch bestätigt durch korrektes Funktionieren (Rechteck an PB0
und Rechteck der halben Frequenz an PB1) hiervon:
1
while(1) {
2
PORTB=TCNT1;
3
68: 8f b5 in r24, 0x2f ; 47
4
6a: 88 bb out 0x18, r24 ; 24
5
6c: fd cf rjmp .-6 ; 0x68 <main+0x12>
Die Ergebnisse bleiben entsprechend, wenn man für das Toggle des PB0
1
PINB|=(1<<PB0);
2
6e: b0 9a sbi 0x16, 0 ; 22
schreibt, so dass nicht 3 Maschinenbefehle nötig sind.
Ich kann mich nicht erinnern, in den letzten Jahren je die Notwendigkeit
gesehen zu haben, einen TC manuell auf Null zu setzen, wo es doch den
CTC-Modus gibt! Das wird der größten Mehrheit der Entwickler so gegangen
sein...
Ein Prozessor-Bug ist durchaus als Ursache denkbar, insbesondere da das
Zusammenspiel der Verzögerungen beim TimerCounter1 beim Attiny45 im
Datenblatt doch etwas kryptisch beschrieben ist.
Im Netz fanden sich Hinweise auf ein Problem mit dem TC1 beim Attiny45
mit BASCOM. Da ich von BASCOM keine Ahnung habe und die entsprechenden
Themen nicht verfolgt habe, weiß ich nicht, ob das ein reines BASCOM
Problem ist/war, oder ob die BASCOM Entwickler auf das hier diskutierte
mögliche Problem mit dem ATtiny45 hereingefallen sind.
@ Fred S. (kogitsune)
Hab auch noch ein paar von den Tinys. Danke für die deutlichen
Ausführungen.
Dann weiß ich ja woran ich denken muss, wenn ich mit den Timern
Probleme kriege.
Hi,
Im Datenblatt steht beim TCNT1 Register...
"Timer/Counter1 is realized as an up counter with read and write access.
Due to synchronization of the CPU, Timer/Counter1 data written into
Timer/Counter1 is delayed by one and half CPU clock cycles in
synchronous mode and at most one CPU clock cycles for asynchronous mode"
Das hört sich zumindest schonmal ein bisschen "verdächtig" an.
Evtl. läuft da wirklich etwas schief, wenn in sehr kurzen Abständen
hintereinander auf das TCNT1 lesend/schreibend zugegriffen wird.
Normalerweise würde ich es auch immer vermeiden, schreibend auf den
Counter zuzugreifen während er läuft.
Im Errata steht nix, aber das hat ja nichts zu sagen...
Grüße
Markus
> Normalerweise würde ich es auch immer vermeiden, schreibend auf den> Counter zuzugreifen während er läuft.
Im Grunde macht der CTC Mode ja nichts anderes?
Beim Timer0 ist es zwar auch nicht weiter problematisch, das Nop bringt
aber immerhin einen ganzen Takt mehr, das ist vielleicht genug.
Noch eine Ergänzung:
Im Attiny15-Kompatibilitätsmodus (low Fuse 0xF3 [SUT1:0=0b11,
CKSEL=0b0011], high Fuse 0xDF und extended Fuse 0xFF) führt dieser Code
(Timer- und Port-Initialisierung wie oben, d.h.
1
DDRB |= (1 << PB0) | (1 << PB1);
2
PORTB |= (1 << PB0)| (1 << PB1);
3
TCCR1 |= (1 << CS10) | (1 << CS11) | (1 << CS13);
) zu einem Rechtecksignal an PB0:
1
while(1) {
2
if (TCNT1 > 200 ) {
3
68: 8f b5 in r24, 0x2f ; 47
4
6a: 89 3c cpi r24, 0xC9 ; 201
5
6c: e8 f3 brcs .-6 ; 0x68 <main+0x12>
6
PINB|=(1<<PB0);
7
6e: b0 9a sbi 0x16, 0 ; 22
8
TCNT1=0;
9
70: 1f bc out 0x2f, r1 ; 47
10
72: fa cf rjmp .-12 ; 0x68 <main+0x12>
Ändert man die low Fuse auf 0xE2, ist wieder ein NOP erforderlich, damit
ein Rechtecksignal (natürlich anderer Frequenz!) entsteht:
Hallo Jörg,
zeigst Du bitte auch die zugehörige *.lss? Das ursprüngliche Beispiel in
c hatte ich mit Atmel Studio 6 (GCC 4.6.1) kompiliert.
Allerdings lässt sich das Problem auch mit Assembler nachweisen:
1
.org 0 ; interrupt vectors not required, program starts right here
Mit auskommentiertem "nop" (wie im Listing oben) erhalte ich an PB0 das
Signal "2 cycles", füge ich das "nop" ein, erscheint das Signal "3
cycles" an PB0.
Gruß
Fred