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
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 |
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.
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
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.
> 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.
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
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 |
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
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.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.