Forum: Mikrocontroller und Digitale Elektronik Problem mit einfachem 8bit Timer (ATMEGA8515)


von deacy (Gast)


Lesenswert?

Hallo,

ich hoffe, ihr könnt mir weiterhelfen. Hab ein kleines einfach Programm 
geschrieben um die timer zu verstehen....leider klappts das ganze nur in 
der simulation so, wie ich es will (LEDS an PORTB sollen blinken) ATMEGA 
8515 @ 4MHz
1
#include <avr/io.h>        
2
#include <stdint.h>
3
4
int main (void) { 
5
6
int count=0;
7
8
DDRB  =  0xFF;
9
10
TCCR0  |=  ((1<<CS02) | (1<<CS00));
11
12
while(1){
13
  PORTB=0xff;
14
  if(TOV0==1){
15
    TIFR |= (1<<TOV0);
16
                count=count+1;
17
             if(count==3906){
18
    PORTB  =  0x00;
19
    count=0;
20
              };
21
  };
22
};
23
24
};

Meiner rechnung nach sollte bei nem prescaler von 1024 und 4mhz in der 
sekunde 3906 overflows stattfinden....also sollte portb alle 1 sec 
einmal ganz kurz blinken....bei mir sinds aber bestimmt 10 mal pro 
sec...der avr läuft auch sicher auf 4mhz quarz!!

Wo ist mein fehler?

Vielen dank für eure hilfe!

Deacy

die LEDs an meine STK500 sind augenscheinlich dauernd an, obwohl ich nen 
prescaler von 1024 verwende....das sollte ja zumindest

von Karl H. (kbuchegg)


Lesenswert?

deacy wrote:
>
> Wo ist mein fehler?

Mindestens 2 Fehler

Fehler 1
Das hier ist die Codesammlung. Hier wird fertiger, lauffähiger
Code präsentiert.

Fehler 2
    if(TOV0==1){

Seit wann fragt man denn ein Bit in einem Register so ab?
TOV0 ist ein Bit im Register TIFR, wie man unschwer erkennen
kann, wenn man sich ansieht wie du das Bit wieder löscht
    TIFR |= (1<<TOV0);

ALso sollte doch wohl TIFR in irgendeiner Form in der Abfrage
wohl vorkommen. Di Abfrage muss also umgangssprachlich
lauten: Ist das Bit TOV0 im Register TIFR gesetzt?
In C schreibt sich das dann

    if( TIFR & TOV0 ) {

Nach weiteren Fehlern hab ich dann nicht mehr Ausschau gehalten.

von deacy (Gast)


Lesenswert?

Vielen Dank,

das kommt davon wenn man sonst nur Variablen Programmiert hat.....jetzt 
funktionierts...danke!

Das Thema kann auch gerne gelöscht werden!

vg

Deacy

von Gabriel W. (gagosoft)


Lesenswert?

Karl heinz Buchegger wrote:

> In C schreibt sich das dann
>
>     if( TIFR & TOV0 ) {

Ich glaube Du hast bei Deiner Antwort auch einen kleinen Fehler
1
 if(TIFR & _BV(TOV0) {
TOV0 ist ja die Bitnummer, nicht die Bitmaske

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.