Atmega8 - 4MHz Osszi - Arbeitstakt messen oder auslesen

Gast #177108
Hallo.

Atmega8, 4MHz Osszilator.
Wie kann ich den freuenz (Takt) mit einem ossziloskop messen oder
auslesen, bei der der mc z.B. eine For-Schleife abarbeitet.

LED an.
for (i = 0x0; i < 0xffffff; i++){}
LED aus.

Kann ich dies auch anders realisieren um Energie zu sparen?
Habe leider keine Ahnung von Interrupts (Anfänger).

Danke.
#177109
Ein Oszi ist nur ein Schätzeisen, nur etwa 10..1% genau (ein Ossi ist
was völlig anderes).

Entweder einfach den erzeugten Assembler ansehen und die Befehle
addieren oder im Simulator sich die Laufzeit anzeigen lasssen.

Oder vor Programmeintriit eine Timer starten und danach wieder stoppen,
das ganze dann über die UART ausgeben lassen.

Letzteres ist sinnvoll bei Echtzeitanwendungen, die nicht angehalten
werden dürfen.


Peter
Gast #177110
Erstmal vielen dank @ Peter.

Ich programmiere in C (Versuch ich auf jeden Fall). Also wenn ich dich
so richtig verstehe, kann ich so programmieren, dass ich am Anfang der
Funktion eine Zeit starte und wenn diese Zeit abgelaufen ist steigt es
aus der Funktion wieder raus, richtig?

Das wäre natürlich super toll, genau sowas möchte ich eigentlich
realisieren. Kannst du mir (oder auch irgendjemand aus dem Forum)
verraten, wie das geht?

Gruß Calik
Gast #177111
Tach.

Also ich habe nun die FAQ in AVR-libs und Datenblatt die entsprechenden
Stellen gelesen.Ich habe schon einiges dazugelernt, ich weiss aber immer
nicht so richtig, wie ich das programmieren kann.

#include <avr/io.h>
#include <inttypes.h> //variablen für den timer
#include <avr/signal.h>

#define F_CPU   4000000   // 4MHz
#define UART_BAUD_RATE   9600
#define UART_BAUD_SELECT (F_CPU/ (UART_BAUT_RATE*161)-1)



void Phase1 (void);
void Phase2 (void);
void Phase3 (void);
void Stoerung (void);
void InitVar (void);

typedef unsigned char BYTE;
typedef unsigned char  uint8_t;
typedef unsigned char  uint16_t;

BYTE   x;

int main (void){
   Phase1();
   Phase2();
   Phase3();
} //end of main


void InitVar (void){

   /* Port C, Pin 0..3 als Output */
   DDRC=(1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);
   /* Pullups */
   PORTB=(1<<PB1)|(1<<PB0);
   PORTD=(1<<PD7)|(1<PD6)|(1<<PD5)|1<<PD4);

}

void Phase1 (void){
   InitVar();
   if (bit_is_clear (PINB, PINB1){
   PORTC=0x03;  // Ausgänge setzen
   } //end of if

   while (1){
   read_timer1();
   x=PORTD;
   if (x!=0x05){
   Stoerung ();
   } // end of if
   } //end of while

   read_timer1 (void){

     unsigned int i;
     unsigned char sreg;

     /* Set TCNT1 to 0x01FF */

     TCNT1 = 0x1FF;

     /* Read TCNT1 into i */
     i = TCNT1;

     uint8_t sreg;
     uint16_t val;

     sreg=SREG;
     cli();

     SREG=sreg;

     return i;
   } //aus avr-libs und Datenblatt


Also meine Frage an alle:

 wie muss ich prog, damit 30 minuten die Ausgänge 0 und 1 von PORTC
high bleiben und nur bei Störung (Eingänge PORTD überwachen) oder bei
Zeitablauf (30 MINUTEN)diese verlässt?
Und sonst irgendwelche Fehler?

Danke schon mal für eure Hilfe.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.