Rechteckgenerator 1MHz ATMega88 [erledigt]

Hallo.
Im deutschsprachigen Forum gibt's kein Unterforum für Microcontroller, darum schreib ich es hier hinein. Falls es gänzlich falsch ist, eröffne ich einen neuen Thread im entsprechenden Forum.

Es geht um folgendes: ich möchte mit einem ATMegax8 (48 oder 88) ein Rechtecksignal als Clock (1MHz) erzeugen (CTC, an OC1A).
Mangels Oszilloskop kann ich das korrekte Funktionieren nicht überprüfen, daher wäre es nett, wenn jemand bestätigen (oder verneinen) könnte, daß meine Werte korrekt sind:

ATMegax8 @8MHz, Square 1MHz:

OCR1A = 3
Prescaler = 1
(TCCR1A = 0x40 & TCCR1B = 0x09)

Danke für's Lesen und ggf. antworten.
phedon

Ich habe einen logischen Analysator, aber keinen ATMega88. Ein ATMega328 hat aber auch die von Dir genutzten Register. Wenn Du also ein Testprogramm bereitstellst, könnte ich mal schauen, was rauskommt.

Hallo,

das passt soweit, wenn du den Taktpin noch als Ausgang schaltest. Programmierst du in der Arduino IDE, resette alle Konfig-Timerregister pauschal. Dann spielt der Timer nicht wilde Sau. Hinweis. Tue dir und den Mitmenschen einen Gefallen und gewöhne dir die Hexschreibweise ab. Für Coolness gibts keine Punkte. Lesbarkeit leidet und die Fehlersuche noch viel mehr.

Eine Variante mit ICR1 als TOP. Für andere µC Pin anpassen.

/* 
 *  Doc_Arduino - german Arduino Forum
 *  AVR ATmega2560
 *  15.08.2018
 *  
 *  Timer CTC Mode 12
 *  ICR1 = TOP
 *  µC Takt 16MHz
 */

const byte Takt_Pin = 11;   // Pin 11 = OC1A 

void setup() {

  pinMode(Takt_Pin, OUTPUT);
  set_Timer1();             
}  

 
void loop() {
  
}


// *** Funktionen *** ----------------------------------------------

void set_Timer1()  
{ 
  cli();
  TCCR1A = 0;     // Reset TCCR1A Control Register 
  TCCR1B = 0;     // Reset TCCR1B Control Register
  TIMSK1 = 0;     // Reset Interrupt Mask Register
  TCNT1  = 0;     // Reset Timer Counter
  ICR1 = 3;       // TOP, macht 2MHz mit Prescaler 1
  TCCR1A = (1<<COM1A0);                       // Toggle OC1A on compare match
  TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);   // Mode 12, Prescaler 1
  sei();
}

Hi und danke, sehr nett, @agmue.

Code wäre

#define F_CPU 8000000UL
#include <avr/io.h>

int main(void)
{
    DDRB |= (1<<PB1);

    OCR1A = 3;
    TCCR1A = (1<<COM1A0);                  // Toggle OC1A
    TCCR1B = (1<<WGM12) | (1<<CS10);  // CTC und Prescaler 1

    while (1)
    {
    }
}

Gruß und danke nochmal.

@Doc_Arduino.
Auch Dir danke, Posts haben sich überschnitten. Die HEX-Schreibweise hat nichts mit "Coolness" zu tun: die Angabe diente nur der Vollständigkeit; ich hatte sie ja oben schon aufgedröselt.

Gruß

Phedon

Hallo,

dann ist ja alles gut. Lieber einmal zu viel betont. :wink:
Wenn dir ein Oszi noch zu teuer ist, kannste dir auch einen Saleae Logicanalyzer Nachbau kaufen. Mittlerweile gibts die auch mit 16 Kanälen. Es werden laut meiner Erkenntnis immer die nachgebaut die original nicht mehr verkauft/hergestellt werden.

Leider gibt es bei beiden Programmen keine Ausgabe, zumindest "sieht" mein Saleae nichts am UNO-Ausgang :confused:

Kurios, sollte eigentlich funktionieren.
Hab mir einfach Quarzoszillatoren bestellt, die gibt's ja nun mal zu dem Zwecke. Zur Not hätte ich einen Tiny genommen und das per Code gemacht.

@doc_arduino: „noch zu teuer“ ist gut, eigentlich sind sie mir generell zu teuer (hab die Preise für 40MHz, 2-Kanal mal überflogen), ich hätte es ja jetzt nur einmal benötigt. Falls ich tatsächlich noch mal eins brauche, werde ich mir vielleicht eins gönnen, es gibt bei eBay gute gebrauchte Geräte (auch aus Schulbeständen) zu annehmbaren Preisen.

Gruß

Hallo,

@ agmue, hast du den Pin angepasst? Beim UNO Pin 9.

@ phedon: Preise liegen wie immer im Auge des Betrachters. Ich hätte noch ein analoges 30MHz Hameq mit 2 Kanälen rumstehen. Falls dafür Interesse besteht > PN.

@doc_arduino: ja, da hast Du Recht. Ich erweitere mal um „je sozialer der Beruf, desto mieser die Bezahlung“ (darum schau ich, was ich wirklich unbedingt brauche, 'n Oszi gehörte daher bislang nicht auf die must-have-Liste.) ¯_(ツ)_/¯
Ich überlege es mir und melde mich bei Dir. Danke für's Angebot.

Saleae Logic Analyzer 8 Channel für EUR 5,84. Das sollte auch bei einem sozialen Beruf drin sein. Mit der moralischen Betrachtung ist es dann wieder eine andere Sache.

Link nur zur Erläuterung, einfach der erste Treffer.

Hi

Nachdem ich meinen PC mittels 230V und DSO gegrillt hatte, legte ich mir ein Fluke PM3082 zu.
Für seltene Aufnahmen, also 1 Trigger alle paar Sekunden, war das DSO irgendwie um Längen schöner.
Auch kann man an dem Fluke wohl einen akademischen Grad vergeben bekommen :o
(genug Knöpfe sind Mal dran und ich muß echt öfter drücken, bevor ich Da ankomme, wo ich hin will)

Aber sonst ist das Teil, für meine Zwecke, dicke ausreichend!

Durch den Tot des DSO habe ich für das Fluke auch 4 Tastköpfe (ist 2+2, müsste nachlesen) - mehr als Zwei hatte ich aber noch nie gebraucht.

Für ein DSO spricht noch, daß man damit wesentlich flexibler ist - z.B. 'Mal gerade eben die Blinke-LED am Zähler messen' lässt sich mit Laptop & DSO einfacher realisieren, als mit einem Oszi-Koffer.

MfG

PS: LA habe ich ebenfalls - aber auch nur die kleine 8CH-Variante. (in der 'mit Gewissensbisse'-Version)

Doc_Arduino:
@ agmue, hast du den Pin angepasst? Beim UNO Pin 9.

Der "* AVR ATmega2560" ist ja doch ein anderer Prozessor. Du kannst einen aber auch aufs Glatteis führen :wink:

Mit Pin 9 geht es nun.

Beim Programm aus #3, abgeändert für IDE, bekomme ich mit UNO daher ohne #define F_CPU 8000000UL ein 8 MHz-Signal.

@agmue - ich schau mir das Teil mal an, ist ja vllt recht brauchbar.

Hallo,

ich habe es extra dazugeschrieben, wie immer wenn entscheidend, für welchen µC mein Code ist. :wink:

Nur wundern mich deine 8MHz. Folgender Code macht bei mir exakt das was er soll wie in #2. Takt 2MHz. Nur anderes TOP Register.

#include <avr/io.h>

int main(void)
{
    DDRB = (1<<PB5);    // Arduino Mega2560
 // DDRB = (1<<PB1);    // Arduino Uno und ATmega48/88/168

    OCR1A = 3;
    TCCR1A = (1<<COM1A0);             // Toggle OC1A
    TCCR1B = (1<<WGM12) | (1<<CS10);  // CTC und Prescaler 1

    while (1)
    { }
}