Forum: Mikrocontroller und Digitale Elektronik Wieder mal ein Timer


von Michael A. (ammannm)


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:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <array.h>
4
         
5
#define F_CPU 8000000UL
6
     
7
int zeile = 0;
8
9
int main()
10
{
11
    DDRA = 0b11111111;    //ausgang definieren
12
//Timer________________________________________________________________________________
13
      TIMSK |= (1 << TOIE0);          //Timer 0 mit "Overflow Itterrupt" aktivieren
14
    TCCR0 =(1<<CS00) | (1<<CS02);   //Prescaler auf 1024 stellen
15
    OCR0=156;            //Timer vorladen
16
    
17
    //Frequenz des Timers = 8000000 / 1024 / (256-156) = 1000 Hz
18
//_____________________________________________________________________________________
19
20
  while(1){
21
  
22
    //Endlosschlaufe nötig?
23
    PORTA = 0b11111110;
24
  }
25
}
26
 
27
ISR (TIMER0_OVF_vect)              
28
{
29
  // jede milisekunde (1000mal pro sec) wird die anzeige geändert
30
  
31
  if(zeile == 10){  //Wenn array einmal durchlaufen, von vorne beginnen
32
    zeile = 0;
33
  }else{ 
34
    PORTA = bitmap[0][zeile];  //bitmap = array in array.h Bibliothek
35
    //Hier würden weitere PORTS stehen vorerst zum testen ob stimmt nur PORTA
36
    zeile++;
37
  }
38
}

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!)

von Aehh (Gast)


Lesenswert?

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

von Kasperle (Gast)


Lesenswert?

>jede milisekunde (1000mal pro sec) wird die anzeige geändert

Wer kann das sehen?

von Michael A. (ammannm)


Lesenswert?

Eine Kamera die 1000 Fotos pro sec. macht z.B.!

von Kasperle (Gast)


Lesenswert?

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

von Gunb (Gast)


Lesenswert?

@Kasperle:

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

Wozu? Ist doch unwichtig zu wissen.

von STK500-Besitzer (Gast)


Lesenswert?

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

von Michael A. (ammannm)


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".

von Karl H. (kbuchegg)


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.

von Klaus (Gast)


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:
1
...
2
  while(1){
3
  
4
    //Endlosschlaufe nötig?
5
    PORTA = 0b11111110;
6
  }
7
...

Gruß, Klaus

von Michael A. (ammannm)


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

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.