Forum: Mikrocontroller und Digitale Elektronik ATTiny85 als Oszillator (8.192 MHz XTAL, output 2.048 MHz)


von Ernst H. (eamsel)


Lesenswert?

Hallo Schwarmwissen,

so langsam verzweifele ich an der KI bei diversen Suchmaschinen. Da 
kommt nur noch Unsinn heraus. Und man merkt täglich, dass man alt wird 
und die Zeiten der PDP11/40 (VAX, Z80, 6802, ...) vorbei sind.

Mein Problem: Ich benötige für ein (FPGA-)Projekt einen externen 2.048 
MHz Takt. Dazu habe ich einen AT85 (fuse EF,DF,FF) mit einem 8.192 MHz 
Quarz zum Laufen gebracht.

Jetzt benötige ich einen exakten 2.048 Takt auf PB0, PB1 oder PB2. Da 
sollte ja eigentlich eine Interrupt-Routine mit OCR0x genügen.

Kann mir einer aus dem Schwarmwissen einen Tipp geben?

Bitte kein RTFM. Danke.

Ernst

von S. L. (sldt)


Lesenswert?

1
.include    "tn85def.inc"
2
3
    sbi     DDRB,0                      ; OC0A
4
    ldi     r16,(1<<WGM01)+(1<<COM0A0)  ; CTC, toggle OC0A
5
    out     TCCR0A,r16
6
    ldi     r16,2 -1
7
    out     OCR0A,r16
8
    ldi     r16,(1<<CS00)               ; /1
9
    out     TCCR0B,r16
10
    rjmp    pc

von Rick (rick)


Lesenswert?

Ernst H. schrieb:
> Ich benötige für ein (FPGA-)Projekt einen externen 2.048 MHz Takt.
I.d.R. hat man beim FPGA (viel) mehr Freiheiten seinen Takt zu 
gestalten.

Um was für ein FPGA handelt es sich denn?
Hast du Zugriff auf das FPGA-Design?
Wenn ja, welche Taktquellen stehen im bzw. am FPGA zur Verfügung?

Beitrag #7902620 wurde vom Autor gelöscht.
Beitrag #7902622 wurde vom Autor gelöscht.
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ernst H. schrieb:
> Da sollte ja eigentlich eine Interrupt-Routine mit OCR0x genügen.

Du willst jeden zweiten CPU-Takt einen Ausgangspegel umschalten und 
denkst, dass man dazu eine längliche ISR benutzen kann?

Entweder nimmst du einen Waveform-Ausgang des Timers (wie gezeigt 
wurde). Alternativ produziert die Folge
1
1: sbi x,POUTB
2
   cbi x,POUTB
3
   rjmp 1b

gerade so dein 1:4, aber nicht mit 50 % Tastverhältnis.

: Bearbeitet durch Moderator
von Wastl (hartundweichware)


Lesenswert?

Ernst H. schrieb:
> so langsam verzweifele ich an der KI bei diversen Suchmaschinen.

Da sieht man mal wieder dass man mit Brain-Anwendung oft viel
weiter kommt als mit Belästigung diverser KI-Maschinen. Noch
dazu bei so einfachen Problemstellungen.

Bei dir braucht es allerdings noch etwas Nachhilfe bei den
Grundlagen zur Mikrocontroller-Programmierung. Da hilft auch
keine KI. Vor den Erfolg haben die Götter der Schweiss gesetzt.

von S. L. (sldt)


Lesenswert?

> Alternativ produziert die Folge ...

Der vorausgesetzte ATtiny85 gehört zur AVRe-Klasse, folglich benötigt 
sbi bzw. cbi 2 Takte, die gezeigte Folge erzeugt 1:6.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

ok

von Jens M. (schuchkleisser)


Lesenswert?

Warum nimmt man statt 8MHz Quarz plus programmiertem Controller nicht 
sofort einen 2MHz Oszillator? Offensichtlich sind für den Controller 
keine weiteren Aufgaben geplant außer der Erzeugung des Takts.
Ein entsprechender Oszillator dürfte ähnlich im Stromverbrauch sein 
(wenn nicht geringer) und benötigt m.E. definitiv weniger Platz.
Oder ist das so ein "Einzelstück, ich hab aber jede Menge 8er Quarze und 
Attinys in der Lade liegen, die kommen dann endlich mal weg"-Ding?
Ich meine außerdem, das diverse PICs einen Quarz/4-Hardwareausgang 
haben, d.h. das ginge sogar ohne großes Programm ;) Bin mir aber nicht 
sicher ob das mit einem Quarz geht und nicht einen Oszi erfordert.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

S. L. schrieb:
> Der vorausgesetzte ATtiny85 gehört zur AVRe-Klasse, folglich benötigt
> sbi bzw. cbi 2 Takte, die gezeigte Folge erzeugt 1:6.

Dann eben so. Siehe pin toggle function im Datenblatt.
1
    ldi r16,0x7
2
    out DDRB, r16
3
loop:
4
    out PINB, r16
5
    out PINB, r16
6
    rjmp loop

von Carsten-Peter C. (carsten-p)


Lesenswert?

Moin,
vielleicht kannst du den Timer 0 in Mode 7 also Fast PWM laufen lassen. 
Im Register OCR0A müsste dann der Wert 4 stehen. Im Register OCA0B der 
Wert 2. Am Ausgang OCR0B – PB1 müsste dann ein Signal ganz ohne INT 
entstehen. Das habe ich jedoch nicht getestet.
Gruß
 Carsten

von Bernd N. (_bn_)


Lesenswert?

Ernst H. schrieb:
> Jetzt benötige ich einen exakten 2.048 Takt auf PB0, PB1 oder PB2. Da
> sollte ja eigentlich eine Interrupt-Routine mit OCR0x genügen.
1
#include <avr/io.h>
2
3
void setup_timer0_toggle_2048mhz() {
4
    // Set PB0 (OC0A) as output
5
    DDRB |= (1 << PB0);
6
7
    // Timer0 in CTC-Modus (Clear Timer on Compare Match)
8
    TCCR0A = (1 << COM0A0) | (1 << WGM01); // Toggle OC0A on Compare Match, CTC mode
9
    TCCR0B = (1 << CS00);  // Prescaler = 1 → volle Taktfrequenz: 8.192 MHz
10
11
    OCR0A = 1; // Toggle alle 2 Takte → 8.192 MHz / 4 = 2.048 MHz Rechteck
12
}
13
14
int main(void) {
15
    setup_timer0_toggle_2048mhz();
16
17
    while (1) {
18
    }
19
}
Kanns leider mangels HW nicht testen.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Carsten-Peter C. schrieb:

> vielleicht kannst du den Timer 0 in Mode 7 also Fast PWM laufen lassen.
> Im Register OCR0A müsste dann der Wert 4 stehen. Im Register OCA0B der
> Wert 2. Am Ausgang OCR0B – PB1 müsste dann ein Signal ganz ohne INT
> entstehen. Das habe ich jedoch nicht getestet.

Fast richtig. Die korrekten Werte sind:
OCR0A=3
OCR0B=1

Dann paßt das.

von Cartman E. (cartmaneric)


Lesenswert?

Ernst H. schrieb:
> Hallo Schwarmwissen,
>
> so langsam verzweifele ich an der KI bei diversen Suchmaschinen. Da
> kommt nur noch Unsinn heraus. Und man merkt täglich, dass man alt wird
> und die Zeiten der PDP11/40 (VAX, Z80, 6802, ...) vorbei sind.

Offenbar sind auch deine Synapsen dort zurückgeblieben.

> Mein Problem: Ich benötige für ein (FPGA-)Projekt einen externen 2.048
> MHz Takt. Dazu habe ich einen AT85 (fuse EF,DF,FF) mit einem 8.192 MHz
> Quarz zum Laufen gebracht.
>
> Jetzt benötige ich einen exakten 2.048 Takt auf PB0, PB1 oder PB2. Da
> sollte ja eigentlich eine Interrupt-Routine mit OCR0x genügen.

Ein 74xy74, als Muster eines Dual-D-Flipflops, kann das auch.
Das braucht dann natürlich noch einen 8192 kHz Taktgenerator.

Wobei jedes FPGA das ich kenne, dass auch mit ein wenig VHDL/Verilog
aus seinem primären Takt ableiten, und auf einem Pin ausgeben könnte.

von Ernst H. (eamsel)


Lesenswert?

Hallo zusammen,

Danke für die vielen Antworten.

vorab: ja, es ist ein "Einzelstück", zufällig hatte ich in meiner 
Bastelkiste mehrere Attiny 85,84 und 2313. Neben mehreren 16 MHz 
Oszillatoren hatte ich noch einige 16, 8 und 8.192 MHz Quarze. Ich 
benötige aber für mein Projekt nicht 2.000, sondern 2.048 MHz (2**11!). 
Also fiel meine Wahl auf den vorhandenen 8.192 MHz Quarz. Zur Zeit (auch 
aus der Bastelkiste) habe ich zum ersten Test einen Altera Cyclone ii 
EP2C5T144 Mini-Board. Mit dem 50 MHz Oszillator kann ich jedoch mit PLL 
keine 2.048.000 Hz erzeugen.

In einem anderen Thread werde ich mal mein Projekt vorstellen. Es geht 
ganz grob um "Geschichte der Computer", also um den "Nachbau" eines 
Rechners mit FPGA.

Neben diversen Assemblern programmiere ich u.A. auch in C, C++, Haskell, 
Clash, Perl, Verilog (aber nicht VHDL), Step-7, Rockwell ControlLogix, 
...

Manchmal hat man bei den einfachsten Problemen Aussetzer. Die meisten 
Probleme fangen an mit: "Mal >SCHNELL< ... (z.B. einen 2.048 MHz 
Quarzoszillator aufbauen)".

Ernst

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Brauchst du die 2.048Mhz als Taktsignal fuer irgendwas ausserhalb des 
FPGAs oder wuerde nicht auch ein entsprechendes CLK_Enable Signal 
innerhalb des FPGAs reichen, was halt alle 24..25 Taktzyklen (vom 
vorhandenen 50MHz Takt ausgehend) mal fuer einen Takt auf High geht, so 
dass sich im Mittel 2.048MHz ergeben?

Hier mal n Link, wie jemand aus 50MHz 4.43361875MHz generiert hat, und 
damit wohl zufriedener war, als ich erwartet hatte:

Beitrag "Re: krumme Frequenzen aus 50Mhz erzeugen"

Gruss
WK

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.