Hallo zusammen,
vorweg: Timer sind nicht meine Freunde!
Ok, ich habe einen Bascom Code welcher ein Martinshorn steuert. Das
Ganze läuft über den Timer0 des Attiny13:
1
Enable Interrupts
2
Timer0 = Timer , Prescale = 64
3
Tcnt0 = 97
4
On Timer0 Horn
5
Enable Timer0
6
7
...
8
9
Horn:
10
Toggle Portb.2
11
Toggle Portb.0
12
Tcnt0 = D
Funktioniert einwandfrei.
Umgeschrieben, nein eher portiert nach C und nix kommt aus dem
Lautsprecher:
Dominik Kristen schrieb:> ISR (TIM0_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */
TIM0 existiert nicht, versuchs mal mit TIMER0_OVF_vect.
Wo kommt die Variable D her und was macht sie?
Was du zeigst, ist nicht das ganze Programm...
Sorry, das hatte ich vergessen. C wird in der Schleife hochgezählt und
der variablen D dann 2 Werte übergeben um die 2 unterschiedlichen Töne
zu erzeugen.
Dominik Kristen schrieb:> Ok, ich versuch es mal mit TIMER0_OVF_vect
Nicht 'versuchen'.
Wenn der Name der ISR nicht koscher ist, dann gibt es vom Compiler eine
Warnung. Die darfst du nicht einfach ignorieren. Kommt vom Compiler
Karl Heinz schrieb:> Nicht 'versuchen'.
War vielleicht meine Schuld. Ich hatte oben geschrieben:
npn schrieb:> TIM0 existiert nicht, versuchs mal mit TIMER0_OVF_vect.
War mißverständlich ausgedrückt...
öhm,
wenn ich TIMER0 schreibe kommt aber die Warnung:
../Sirene.c:12: warning: 'TIMER0_OVF_vect' appears to be a misspelled
signal handler
Bei TIM0 kommt keine!?!?!
Dominik Kristen schrieb:> öhm,> wenn ich TIMER0 schreibe kommt aber die Warnung:>> ../Sirene.c:12: warning: 'TIMER0_OVF_vect' appears to be a misspelled> signal handler>> Bei TIM0 kommt keine!?!?!
Mit welchem C-Compiler arbeitest du?
Wenn's ein anderer als GCC ist, schau dir mal die Definition der
Handler-Namen an, vermutlich lauten die bei deinem Compiler anders...
TIM0_OVF_vect is korrekt.
Schau in den Solution Explorer unter 'Dependencies'. Dort ist ein File
iotn13.h aufgeführt. Dort stehen unter anderem die Namen aller Interrupt
Vektoren drinn.
ok. falscher Name wars nicht.
Das ganze Programm bitte und nicht nur Ausschnitte.
Dominik Kristen schrieb:> öhm,> wenn ich TIMER0 schreibe kommt aber die Warnung:>> ../Sirene.c:12: warning: 'TIMER0_OVF_vect' appears to be a misspelled> signal handler>> Bei TIM0 kommt keine!?!?!
Laut Datenblatt ist das der richtige Name.
Wie sieht denn dein Programm sonst aus?
Hast du die Portpin als Ausgang definiert?
Dominik Kristen schrieb:> Wie gesagt, der Bascom Code gibt ein Martinshorn wieder!
Das mag schon sein. Nur interessiert der BASCOM Code nicht mehr. Der C
Code ist interessant. Und zwar der vollständige.
Dominik Kristen schrieb:> Also ich arbeite mit AVR Studio 4.18 und WinAVR-20100110 als> Avr-gcc> compiler.> Wo sehe ich die Definitionen denn?
Wenn du beispielsweise mit dem ATMega8 arbeitest, ist dafür ein File
zuständig, welches "iom8.h" heißt. Dort sind dann unter anderem folgende
Zeilen drin:
Dominik Kristen schrieb:> int A, B, C, D;
da fehlt zumindest für D ein volatile
> TCCR0B |= (1<<CS01) | (1<<CS00);>> TCCR0A |= (1<<WGM01);
Aha!
Darf man fragen, warum du da WGM01 setzt?
Ist das krank...
Es funktioniert Karl-Heinz!
Also fast jedenfalls!
WGM01 rausgenommen und die variable D als volatile.
Oh man... was man alles missachten kann! :-S
Aus dem Piezo Speaker kommt jetzt die Sirene! Aber deeeeeeeeeeeeutlich
leiser als mit dem bascom Code! Warum?
Karl Heinz schrieb:> TIM0_OVF_vect is korrekt.
Hallo Karl Heinz,
stimmt, beim Tiny13 steht das so drin. Aber bei allen ioxx.h die ich
habe, steht nicht "TIM0_..._vect" sondern "TIMER0_..._vect". Die
Schreibweise mit "TIM0" kenne ich gar nicht. Ist da mal was geändert
worden?
Dir scheint nicht klar zu sein, wie da offenbar die Tonerzeugung
funktioniert.
Du hast 2 Pins, PB0 und PB2 an denen der Lautsprecher (oder Summer)
hängt. Damit sich da an der Membran was tut, müssen die immer
gegengleich sein. Wenn PB0 auf 1 ist, dann muss PB2 auf 0 sein, damit
die Membran in die eine Richtung schwingt; wenn PB0 auf 0 ist, dann muss
PB2 auf 1 sein, damit die Membran in die andere Richtung schwingt.
Durch regelmässiges Umpolen der beiden Leitungen schwingt dann die
Membran ständig vor und zurück, was den Ton ergibt.
Damit du hier
1
PORTB^=(1<<PB0);// Toggle PB0 z. B. angeschlossene LED
2
PORTB^=(1<<PB2);// Toggle PB0 z. B. angeschlossene LED
aber einfach nur Toggeln brauchst. müssen die beiden Pins von Beginn an
erst mal unterschiedlich stehen. Der eine auf 0, der andere auf 1. Nur
dann ergibt sich dann nach dem Toggler, dass der eine auf 1 steht und
der andere auf 0; und beim nächsten Durchlauf dann wieder zurück.
Im BASCOM Code ist das hier
1
Portb = &B00000011 'Pullup Portb.1; Portb.0=1
am Anfang nach der Initialisierung sicher gestellt.
In deinem Code sehe ich aber nichts dergleichen.
Deine Portpins PB0 und PB2 haben immer den gleichen Pegel. Wodurch an
der Membran keine DIfferenz entsteht und die Membran sich daher nicht
rührt.
Wenn sich da überhaupt was rührt, dann ist das die kleine Zeitdifferenz
zwischen den beiden Portoperationen, die eine winzige Bewegung der
Membran bewirkt.
npn schrieb:> Karl Heinz schrieb:>> TIM0_OVF_vect is korrekt.>> Hallo Karl Heinz,> stimmt, beim Tiny13 steht das so drin. Aber bei allen ioxx.h die ich> habe, steht nicht "TIM0_..._vect" sondern "TIMER0_..._vect". Die> Schreibweise mit "TIM0" kenne ich gar nicht. Ist da mal was geändert> worden?
Atmel ist da leider nicht einheitlich.
Karl-Heinz, du bist ein Teufelskerl!
Danke, das wars!!
Ich Depp hab das total überlesen, da ich nur auf Pullup Portb.1 geachtet
habe, was im Bascom Code ja der Schalter ist. Oh man! Kopfklatsch
Übrigens schön erklärt! So versteht das jeder!
Danke!
Dominik Kristen schrieb:> hm.. gute Frage.. muss ich da nicht in den CTC Mode?
Verwendet der BASCOM Code den CTC Modus?
Wenn nein, warum solltest du dann im C Code einen verwenden?
Dominik Kristen schrieb:> Karl-Heinz, du bist ein Teufelskerl!> Danke, das wars!!> Ich Depp hab das total überlesen, da ich nur auf Pullup Portb.1 geachtet> habe,
Was lernen wir daraus:
Kommentare sind Schall und Rauch. Was zählt ist der Code und was er
bewirkt.
Karl Heinz schrieb:> Dominik Kristen schrieb:>> hm.. gute Frage.. muss ich da nicht in den CTC Mode?>> Verwendet der BASCOM Code den CTC Modus?> Wenn nein, warum solltest du dann im C Code einen verwenden?
Ich habe früher mit Bascom angefangen.
Wenn ich da heute so drüber nachdenke... oh man!
Da wird der Timer ja nur durch
1
Config Timer0 = Timer, Prescale = 64
definiert. Ich seh da nix mit CTC oder PWM oder sonst was :(
Karl Heinz schrieb:> Atmel ist da leider nicht einheitlich.
Ja, ich seh's gerade. Scheinbar habe ich bis jetzt nur mit µC
gearbeitet, wo "TIMER0..." gültig ist. Danke für die Aufklärung :-)