www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wieder mal ein Timer


Autor: Michael Ammann (ammannm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen

Will ein Programm schreiben welches jede milisekunde die Ausgänge anders 
ansteuert. An den Ausgängen sind LED . Die Daten nehme ich aus einem 
Array.
Hier der code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <array.h>
         
#define F_CPU 8000000UL
     
int zeile = 0;

int main()
{
    DDRA = 0b11111111;    //ausgang definieren
//Timer________________________________________________________________________________
      TIMSK |= (1 << TOIE0);          //Timer 0 mit "Overflow Itterrupt" aktivieren
    TCCR0 =(1<<CS00) | (1<<CS02);   //Prescaler auf 1024 stellen
    OCR0=156;            //Timer vorladen
    
    //Frequenz des Timers = 8000000 / 1024 / (256-156) = 1000 Hz
//_____________________________________________________________________________________

  while(1){
  
    //Endlosschlaufe nötig?
    PORTA = 0b11111110;
  }
}
 
ISR (TIMER0_OVF_vect)              
{
  // jede milisekunde (1000mal pro sec) wird die anzeige geändert
  
  if(zeile == 10){  //Wenn array einmal durchlaufen, von vorne beginnen
    zeile = 0;
  }else{ 
    PORTA = bitmap[0][zeile];  //bitmap = array in array.h Bibliothek
    //Hier würden weitere PORTS stehen vorerst zum testen ob stimmt nur PORTA
    zeile++;
  }
}

Beim Simulieren funktionierte es nicht wie erwünscht. Das Programm lief 
einmal durch und hörte auf. Die eingänge werden immer pro Interrupt ein 
und danach wieder ausgeschaltet. Schliesse ich den Ausgang B ans 
Osziloskop sehe ich eine Frequenz von 2MHz das mal 2 (da ich immer ein 
und aus schalte) = CPU Frequenz von 4MHz. Habe aber 8MHz Definiert!?
Warum kommt da nicht ein signal von 1000Hz heraus?

MfG Michael

(Das ganze gibt keine Propeller Uhr aber der Hintergedanke ist der 
selbe!)

Autor: Aehh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja. das Timer register TCNT0 sollte geladen werden, nicht das OCR0. Und 
dieses Register sollte man immer im Interrupt neu laden.

Autor: Kasperle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>jede milisekunde (1000mal pro sec) wird die anzeige geändert

Wer kann das sehen?

Autor: Michael Ammann (ammannm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Kamera die 1000 Fotos pro sec. macht z.B.!

Autor: Kasperle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha...
Am Anfang gleich mit hingeschrieben, dann kommen solche Fragen erst 
garnicht.

Autor: Gunb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Kasperle:

>Aha...
>Am Anfang gleich mit hingeschrieben, dann kommen solche Fragen erst
>garnicht.

Wozu? Ist doch unwichtig zu wissen.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm Timermodi, bei denen man nicht den Timerwert ändert, sondern das 
Rücksetzkriterium (CTC, FastPWM).
Damit kommt man ohne 1000fps-Kameras aus.

Autor: Michael Ammann (ammannm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze ist für eine Kamera. Um die Komme ich nicht rum, sei es eine 
50 Bilder oder 1000 Bilder pro sec. Kamera.
Habe die anderen Timer Modi nocht nicht ausprobiert und kenne sie auch 
nicht so gut, deswegen lieber mit dem "normalen".

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Habe die anderen Timer Modi nocht nicht ausprobiert und kenne sie auch
> nicht so gut, deswegen lieber mit dem "normalen".

Falscher Ansatz.

Du magst einen bestimmten Timermodus nicht kennen, das ist OK.
Aber wenn der Hinweis kommt, dass einer davon besser geeignet wäre, 
solltest du dem Hinweis nachgehen und den ausprobieren. So schwer sind 
die anderen Modi nicht.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt mal weg von den Timern:

In der Interrupt-Routine setzt du PortA im kHz-Takt um, richtig. Aber in 
der Main-Funktion deines Programms setzt den PortA im MHz-Takt zurück, 
das kann ja gar nicht klappen:
...
  while(1){
  
    //Endlosschlaufe nötig?
    PORTA = 0b11111110;
  }
...

Gruß, Klaus

Autor: Michael Ammann (ammannm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl heinz Buchegger
Stimmt, tut mir leid. Wenn ich hilfe brauche und welche bekomme sollte 
ich diesen auch versuchen!

@ Klaus
Ist mein fehler, habe diese Zeile noch nicht herausgenommen! Sollte 
nicht dort stehen! Danke!

Versuche nun mal die anderen Timer Modi!

MfG Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.