Forum: Mikrocontroller und Digitale Elektronik Probleme mit Atmega48 Timer


von klingel (Gast)


Lesenswert?

Hallo,
Ich bin noch ein ziemlicher Neuling in diesem Gebiet, mir hat jetzt auch 
kein anderer Beitrag aus dem Froum weitergeholfen, deshalb frage ich nun 
endlich.

Ich arbeite ein wenigs das AVR-GCC-Tutorial hier durch, und wollte es 
nun hinbekommen,dass meine LED bis 9 zählen im sekunden abstand. Mein 
Quellcode dazu:
1
#include <avr/io.h>
2
#define Byte unsigned char
3
4
void delay_ms(int ms) ;
5
6
int main(void)
7
{
8
  DDRB=0xFF;
9
  Byte zahl=0;
10
11
  while(1) {
12
    while (zahl<10) {
13
      PORTB = 0xFF-zahl;
14
      zahl++;
15
      delay_ms(1000);
16
    }
17
  }
18
  return 0;
19
}
20
21
void delay_ms(int ms) {
22
23
  TCCR0B |= (1<<CS01) | (1<<CS00) ;
24
  int i ;
25
  for(i=0; i<ms; i++) {
26
27
    while(TCNT0<156) ;
28
    TCNT0=0;
29
  }
30
  TCCR0B=0;
31
}

Leider brauche ich aber für eine sekunde ca. 10s. Also anders gesagt, 
ich muss davon ausgehen, dass ich nur einen CPU Core von 1MHz habe, 
damit ich eine sekunde rausbekommen, bei meinem Quellcode.
Kann mir jemand vielleicht sagen, woran es liegt?

von Peter Diener (Gast)


Lesenswert?

Hallo,

die Fuse für die Clockgeneration könnte auf den internen RC Oszillator 
gestellt sein, anstatt auf das Quarz. Das ist sogar die 
Defaulteinstellung.

Dann hast du etwaa 1MHz.

Peter

von klingel (Gast)


Lesenswert?

okay, schon mal vielen Dank für die schnelle Antwort! Leider kenne ich 
mich damit noch nicht aus, kann mir jemand vielleicht einen Link geben 
wo ich mir das mal durchlesen kann?

von Peter Diener (Gast)


Lesenswert?

Hallo,

die Fuses stellst du mit deinem Programmer ein, idR. nachdem du das 
Hexfile reingeladen hast.

Welche Software nimmst du dazu? (Ponyprog, AVRISP, AVRPROG, AVRDUDE, 
Galep...)

Wie die Fuses gesetzt gehören, steht im Datenblatt des Controllers unter 
dem Punkt Memory Programming. Von hier wird dann auf einpaar weitere 
Kapitel verwiesen.


Peter

von klingel (Gast)


Lesenswert?

Also ich benutze das AVR Workpad, bei meinem mySmartUSB dabei.
Also habe jetzt mal im Datenblatt ein bisschen was gelesen, mein 
RC-Oszillator hat 8Mhz, also müsste es ja eigentlich auch in die 
Richtung 1s gehen. Es sie denn die 8Mhz sind durch 8 geteilt, aber ich 
verstehe nicht genau unter welcher Bedingung das passiert, aus dem 
Datenblatt:

3. If 8 MHz frequency exceeds the specification of the device (depends 
on VCC), the
CKDIV8 Fuse can be programmed in order to divide the internal frequency 
by 8.

von klingel (Gast)


Lesenswert?

Ok, habe jetzt gesehen, dass mein Programmer, ein RC Takt standartmäßig 
durch 8 teilt... des erklärt ja dann einiges..

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.