Probleme mit Atmega48 Timer

Gast #1062048
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?
Gast #1062056
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
Gast #1062063
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?
Gast #1062065
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
Gast #1062152
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.