Forum: Compiler & IDEs Atmega8 - 4MHz Osszi - Arbeitstakt messen oder auslesen


von Calik (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Calik (Gast)


Lesenswert?

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

von Calik (Gast)


Lesenswert?

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.

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.