www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Port mit 8MHz toggeln


Autor: Mac Volt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich brauche zum Testen der Geschwindigkeit von Optokopplern eine 
Schaltung die mir verschiedene Frequenzen macht:
8kHz
80kHz
800kHz
8MHz

Anstelle eines Quarzosszillators und eine paar TTL 7490 Teiler durch 10 
überlege ich das mal mit einem ATtiny25 zu machen.
Ich würde das gerne mal in C programmieren. Leider bin ich mit den 
Timer-Registern des ATtiny25 nicht recht schlau.
Wie kann ich das programmieren?
Habe dieses Blinkprogramm:
#include <avr/io.h>
#include <avr/interrupt.h>

#define Led_gelb_toggle PINB = (1 << PIN4);

void Port_init(void);

int main(void)
{
  Port_init();
  while(1)
  {
    /*
    Portleitungen abfragen
    Geschwindigkeit einstellen
    */
  }
}
//***********************************************
void Port_init(void)
{
  DDRB = (1 << DDB4);  // PB4 als Output der  Led_gelb
  PORTB =  0;

  TCCR1 = 0b00001110;  // Prescaler = CK / 8192
  TIMSK |= (1 << TOIE1);  // Timer1 Overflow Interrupt Enable
  sei();        // Enable Interrrupt
}
//***********************************************
ISR(TIMER1_OVF_vect)
{
  Led_gelb_toggle // Led an PB4 toggeln
}
//***********************************************
Das blinkt schön mit 2Hz.
Wie aber kann ich jetzt auf 8MHz kommen?
Ist da ein PIC eventuel die bessere Wahl?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

der schnellste Umschalttakt per Timer im CTC-Mode ist Clock/2 mit 
Prescaler auf 1 und Comparewert auf 0. Dann den Ausgang festlegen und 
die Hardware das erledigen lassen.

Muß also mit 16MHz Takt laufen damit 8MHz rauskommen.
Bei einigen AVR kann man auch den Systemtakt auf einem Pin ausgeben 
lassen.

Gruß aus Berlin
Michael

Autor: Helmut -dc3yc (dc3yc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Quarzfrequenz für den Takt benutzt denn dein ATtiny? Wenn es 
weniger als 8MHz sind, wie soll der da eine höhere Frequenz draus 
machen? Er braucht ja auch ein paar Takte, um die Befehle abzuarbeiten.

Autor: CTC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entweder arbeitest du im CTC Modus oder mit der Harsware PWM.
Im 16 Bit CTC Modus berechnet sich die Frequenz zu:
f = (Taktfrequenz des µC)/(Prescaler*(1+OCR0A))

je nachdem wie du nun OCR0A einstellst kannst du deine Frequenz 
variieren und in der ISR des Pin toggeln. Aber nehmen wir mal an du 
stellst Prescaler auf 1 und OCR0A ebenfalls auf 1 --> f=8Mhz. Da du aber 
den Pin toggelst, hast du effektiv auch nur 4MHz. Ich weiss jetzt nicht 
ob ein Wert von OCR0A=0 zulässig ist, aber wenn ja, dann hast du deine 
8Mhz. Den Rest musst natürlich noch selber ausrechnen. Wie alles 
eingestellt wird steht im Datenblatt oder hier im Forum im GCC Tutorial.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sachte, der Tiny25 hat einen Highspeed-Timer, mit dem auch bei langsamem 
CPU-Takt über eine PLL bis zu 32MHz Pinfrequenz fabrizieren kann.

Autor: Mac Volt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Sachte, der Tiny25 hat einen Highspeed-Timer, mit dem auch bei langsamem
> CPU-Takt über eine PLL bis zu 32MHz Pinfrequenz fabrizieren kann.

Brauche mal ein paar Code-Schnipsel, drehe im Moment ziemlich am Rad.

Ächz keuch stöhn!

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

CTC schrieb:
> je nachdem wie du nun OCR0A einstellst kannst du deine Frequenz
> variieren und in der ISR des Pin toggeln. Aber nehmen wir mal an du
> stellst Prescaler auf 1 und OCR0A ebenfalls auf 1 --> f=8Mhz. Da du aber
> den Pin toggelst, hast du effektiv auch nur 4MHz. Ich weiss jetzt nicht
> ob ein Wert von OCR0A=0 zulässig ist, aber wenn ja, dann hast du deine
> 8Mhz. Den Rest musst natürlich noch selber ausrechnen. Wie alles
> eingestellt wird steht im Datenblatt oder hier im Forum im GCC Tutorial.

Ja, Comparewert 0 im CTC-Mode ist zulässig und erzeugt Clock/2.
Ist in den Datenblättern nicht überall direkt erwähnt, wenn man sich 
aber das Timingdiagramm des CTC-Mode genauer anschaut, sieht man, warum 
es so funktioniert.

Gruß aus Berlin
Michael

Autor: A. K. (prx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mit einem solchen Teil mal einen Taktgenerator gebaut, der über 
ein Poti und dem Kalibrierregister des Oszillators durchstimmbar ist, 
Code anbei.

Autor: Mac Volt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Ich habe mit einem solchen Teil mal einen Taktgenerator gebaut, der über
> ein Poti und dem Kalibrierregister des Oszillators durchstimmbar ist,
> Code anbei.

Bin dabei das durchzuarbeiten. Vielen lieben Dank, ist ganz toll!

Autor: Mac Volt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin im Programm *32MHz.c* über dieses gestolpert:
loop_until_bit_is_set(PLLCSR, PLOCK);  // wait until PLL locked

@ A. K. (prx):
ob ich diese Funktion mal sehen dürfte?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich greif A.K. mal vor (scheint schon weg zu sein)
#define loop_until_bit_is_set(p,b)   { while( !( (p) & (1<<(b)) ) ) ; }

einfach eine while-Schleife, die das Bit PLOCK im Register PLLCSR 
abfrägt und solange looped, solange es nicht gesetzt ist. Allerdings aus 
Makro ausgeführt, damit es keine Probleme bei der Parameterübergabe 
gibt.

Ohne das Makro hätte man einfach geschrieben
   while( ! ( PLLCSR & (1<<PLOCK) ) )
     ;

Autor: Mac Volt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Funktion:

loop_until_bit_is_set(bla, blub);

scheint recht universell zu sein, es werden anscheinend zwei Werte 
übergeben,
die Adresse des Registers und die Bitposition.
Finde es so etwas besser lesbar, die Übergabe der Parameter kostet 
natürlich Resourcen...
Habe mich nur gewundert, das die Funktion im Programm 32MHz.c nirgendwo 
deklariert noch definiert ist.
Würde diese Definition halt gern mal sehen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.