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