mikrocontroller.net

Forum: Compiler & IDEs AVR tiny13V Piezo piepsen lassen


Autor: gone gone (xcc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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);
}

Autor: gone gone (xcc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leider immer noch nichts :(

Werde morgen mal versuchen den Piezo auszutauschen.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was sagt den Dein Oszi?

Autor: gone gone (xcc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: obake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: gone gone (xcc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: gone gone (xcc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: gone gone (xcc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

Autor: gone gone (xcc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: gone gone (xcc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm.. in meinem steht nichts davon. Unter "ORC0B"steht der gleiche Text 
wie unter "ORC0A".

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: gone gone (xcc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
scheint aber genauso gut zu funktionieren. Benutze jetzt Kanal A, kann 
aber keinen Unterschied feststellen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.