Datum: 05.07.2008 00:06
hallo, Ich versuche hier einen simplen Piezo ohne Elektronik an einem Tiny13V zu betreiben. Angeschlossen ist er an PB0:
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int main (void) { DDRB|=(1<<0); TIMSK0|=(1<<TOIE0); sei(); TCCR0B|=(1<<CS01); //TCCR0B|=(1<<CS00); for(;;) { PORTB&=~(1<<0); // _delay_ms(1); } return 0; } ISR(TIM0_OVF_vect) { PORTB|=(1<<0); } |
Den genauen Resonanzbereich des Piezo kenne ich nicht, allerdings meine ich, dass er um die 5KHz liegt, also müsste mind. eine der Prescaler-Einstellungen ein hörbares akustisches Signal produzieren: der Tiny13V läuft normalerweise auf 4MHz, CLKDIV8 ist gesetzt, d.h. er müsste tatsächlich auf 500 KHz laufen. 500KHz/8 = 63 KHz 500KHz/64 = 7.8 KHz 500KHz/256 = 2 KHz Liegt alles noch im hörbaren Bereich, trotzdem tut sich nichts. Wo liegt der Denkfehler? Danke Dominik
Datum: 05.07.2008 00:32
for(;;)
{
PORTB&=~(1<<0);
// _delay_ms(1);
}
return 0;
}
ISR(TIM0_OVF_vect)
{
PORTB|=(1<<0);
}
Hier wird PB0 in der ISR 1, dann sofort wieder 0 (innerhalb ein paar
Taktzyklen).
Probier mal PB0 in der ISR zu togglen:
for(;;)
{
;
}
return 0;
}
ISR(TIM0_OVF_vect)
{
PORTB^=(1<<0);
}
Datum: 05.07.2008 00:54
leider immer noch nichts :( Werde morgen mal versuchen den Piezo auszutauschen.
Datum: 05.07.2008 01:24
Ein Oszilloskop / Multimeter mit vernünftiger Frequenzmessung hab ich leider nicht, hab jetzt einfach mal eine LED an PB0 gesetzt, und die blinkt bei Prescaler = 1024 gerade mal ein mal pro Sekunde, d.h. das Ausgangssignal muss aus irgendeinem Grund viel zu langsam sein.
Datum: 05.07.2008 03:19
Hallo Dominik, bist Du Dir sicher, dass CKSEL nicht "11" ist (=128kHz int. Oszillator)? Bei FOSC=128kHz (ohne CKDIV8) und Timer Prescaler=1024 wäre Deine LED 0,49s an und 0,49s aus.
Datum: 05.07.2008 06:49
Dominik Hensler wrote: > Ein Oszilloskop / Multimeter mit vernünftiger Frequenzmessung hab ich > leider nicht, hab jetzt einfach mal eine LED an PB0 gesetzt, und die > blinkt bei Prescaler = 1024 gerade mal ein mal pro Sekunde, d.h. das > Ausgangssignal muss aus irgendeinem Grund viel zu langsam sein. Nein. Du vergisst, dass der Overflow-Interrupt ausgelöst wird, wenn der Timer überläuft, was alle 256 Timer-Takte der Fall ist. > 500KHz/8 = 63 KHz > 500KHz/64 = 7.8 KHz > 500KHz/256 = 2 KHz > > Liegt alles noch im hörbaren Bereich, trotzdem tut sich nichts. Wo liegt > der Denkfehler? Was du hier ausrechnest, ist die Frequenz, mit der der Timer läuft. Die Frequenz deines Ausgangssignals liegt nochmal um den Faktor 512 darunter. Also: 500KHz/8 /512 = 122 Hz 500KHz/64 /512 = 15 Hz 500KHz/256 /512 = 4 Hz
Datum: 05.07.2008 09:47
Ah, verstehe. Dann bleibt mir wohl nichts übrig als die Taktfrequenz wieder auf 4MHz raufzusetzen und den erhöhten Stromverbrauch in Kauf zu nehmen. Nur Interessehalber - was würde ich eigentlich machen, wenn ich eine höhere Frequenz als 4.000.000 / 512 = 7,8 KHz bräuchte?
Datum: 05.07.2008 09:55
Zum Beispiel den Timer im CTC-Modus benutzen. Da kannst du genau einstellen, bis wo er laufen soll. Übrigens kannst du den Timer auch so einstellen, daß er automatisch PB0 toggelt, sodaß du dir die ISR auch sparen kannst.
Datum: 05.07.2008 10:06
Dominik Hensler wrote: > Ah, verstehe. Dann bleibt mir wohl nichts übrig als die Taktfrequenz > wieder auf 4MHz raufzusetzen und den erhöhten Stromverbrauch in Kauf zu > nehmen. Nein, mit 500kHz Systemtakt kannst du problemlos ein paar kHz für den Piezo erzeugen. Verwende am besten den CTC-Mode, den Rolf auch schon erwähnt hat.
Datum: 05.07.2008 12:00
hab`s jetzt erstmal interrupt gesteuert versucht:
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int main (void) { DDRB|=(1<<0); TCCR0B|=(1<<WGM02); //TCCR0A|=(1<<2); TIMSK0|=(1<<OCIE0B); sei(); OCR0B=10; TCCR0B=(CS00); for(;;) { } return 0; } ISR(TIM0_COMPB_vect) { PORTB^=(1<<0); PORTB|=(1<<3); _delay_ms(1000); } |
Die letzten beiden Anweisungen in der ISR hab ich nur testweise reingeschrieben um zu gucken ob der Interrupt überhaupt ausgelöst wird. Scheint aber nicht der Fall zu sein. Muss ich ausser WGM02 im TCCR0B Register noch irgendwas anderes setzen?
Datum: 05.07.2008 12:25
Dominik Hensler wrote:
TCCR0B|=(1<<WGM02);
...
TCCR0B=(CS00);
|
Du setzt das oben gesetzte Bit wieder auf 0. Macht aber nicht wirklich was, denn mit WGM:100 bekommst du eh keinen CTC-Mode. Schau nochmal in das Datenblatt.
Datum: 05.07.2008 12:47
ah, ok hab's schon.. CTC funktioniert jetzt, allerdings gibt der Piezo immer noch keinen Ton von sich :/ OCR0B=10 müsste doch eigentlich ausreichen?
Datum: 05.07.2008 13:02
Wieso OCR0B? Im CTC-Modus stellst du den Wert über ORC0A ein. Abgesehen davon würde bei einem Takt von 500 kHz bei einem Compare-Match-Wert von 10 der Port 50k mal pro Sekunde getoggelt, also hättest du eine Frequenz von 25 kHz, die eher schwer zu hören ist ;-)
Datum: 05.07.2008 15:10
Nee, ich benutze doch den B-Kanal des Timers und der eingestellte Wert wirkt sich ja auch auf die blink-Frequenz der LED aus. Welchen Compare Match Wert würdest du vorschlagen?
Datum: 05.07.2008 16:04
> Nee, ich benutze doch den B-Kanal des Timers
Wie das? Laut dem aktuellen Datenblatt kann man beim Tiny13 den
CTC-Modus nur mit ORC0A benutzen.
Datum: 05.07.2008 16:12
Hmmm.. in meinem steht nichts davon. Unter "ORC0B"steht der gleiche Text wie unter "ORC0A".
Datum: 05.07.2008 16:17
Wo steht da was vom CTC-Modus? Schau im Datenblatt in Kapitel 11.9.1 (in der aktuellen Version auf Seite 72). Da sind die Timer-Modi gelistet. Dort gibt es nur einen CTC-Modus, nämlich Mode 2 (also WGM1 auf 1, alle anderen auf 0). Und bei dem ist für TOP ORCA eingetragen. Für OCRB gibt es keinen Modus.
Datum: 05.07.2008 16:29
scheint aber genauso gut zu funktionieren. Benutze jetzt Kanal A, kann aber keinen Unterschied feststellen.
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel


