binäruhr - verliert zeit [code]

OP #1271372
hi

zu übungszwecken will ich 6 LEDs ansteuern die im sekunden takt 
hochzählen und bei 60 wieder auf null springen..
funktioniert soweit eigentlich auch ganz gut...nur verliert meine Uhr 
zeit...

meine vermutung:
entweder habe ich mich mit der quarzfrequenz und dem hochzählen vertan 
so das er minimal zulangsam hochzählt

oder

der code selbst verbraucht irgendwie zeit sodas sie langsamer 
läuft..wobei das ja eigentlich nicht sein kann da das ganze über 
interrupt und counter läuft...

quarzfrequenz : 16MHZ
uC            : Atmega8


mein gedanke dahinter:

zähler läuft mit 16MHZ/1024(prescaler) = 15625HZ
zählt also pro sekunde bis 15625
interrupt wird alle 255 ausgelöst.
da der zähler 0,01632 sek braucht um bis 255 zu zählen addiere ich
pro interupt 1632 auf meinen zähler der bei 100.000 voll ist und die 
sekunde inkrementiert.
anschließend subtrahiere ich vom zähler wieder 100.000 und es geht von 
vorne los der überschuss bleibt also drin.


achja noch was anderes
wenn ich meine 6 leds an die pins pd0 bis pd5 hänge schaltet eine nicht 
richtig...sie leuchtet zwar aber nur gaaaanz schwach...gleiches hatte 
ich auch als ich die komplette schaltung auf die PCx ports umgebaut 
hatte.
ich habe es auch an einem weiteren atmega8 probiert > gleiches ergebnis

deshalt habe ich die 5te stelle auf den PD6 pin gelegt da gehts 
:confused:
macht dummerweise nur mehr arbeit da man nicht mehr einfach PORTD = sek 
sagen kann...


gruß

edit:
mit zeitverlieren meine ich so zirka: 1sek/min
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/delay.h>
4
 
5

6
volatile int  sek, min;
7
volatile int32_t zahler;
8
main()
9
{
10
 
11
 
12

13
   //Timer 0 konfigurieren
14
     DDRD  = 0b01101111;          //definiert portC ping 0-3 als ausgang
15
     
16
  PORTD = 0b01101111;          //setzt die ausgänge 0-3 vom port C auf logisch 0
17
     TCCR0 = (1<<CS00) | (1<<CS02);   //1024er prescaler
18
  min=0;
19
  sek=0;
20
int test;
21
  test=0;
22
 
23

24
   TIMSK|=(1<<TOIE0);        //timer overflow interrupt
25
   //Globale Interrupts aktivieren
26
   sei();
27
   
28
   while(1)
29
     {
30

31
test=sek;
32
if(test & 0b00010000) {test |= 0b01000000;}
33

34
    PORTD = test;
35

36
  }
37

38
}
39
 
40
 
41
ISR(TIMER0_OVF_vect)
42
{
43
  zahler +=1632;
44
if(sek ==60)       {min++; sek=0;}
45
  if(zahler >=100000)   {sek++; zahler -= 100000;}
46

47
}
OP #1272034
kann sich denn keiner einen reim draus machen, warum einer der pins 
keine leistung bringt?
wie gesagt, aus PD4 kommt keine leistung (bei zwei uCs getestet)
gleiches hatte ihc auch an den PC ports einer ging nicht richtig

es kam was aber nur so das die led ganz schwach geleuchtet hat. es war 
so grade von aus zuunterscheiden
#1272037
S. S. schrieb:

> wie gesagt, aus PD4 kommt keine leistung (bei zwei uCs getestet)
> gleiches hatte ihc auch an den PC ports einer ging nicht richtig

1
DDRD  = 0b01101111;

Wie soll da auch "Leistung rauskommen", wenn es ein Eingang ist?
Gast #1272052
Hi

>wie gesagt, aus PD4 kommt keine leistung (bei zwei uCs getestet)

> DDRD  = 0b01101111;          //definiert portC ping 0-3 als ausgang

Wenn die zweite Zeile dein gültiger Code ist, hast du PD4 als Eingang 
konfiguriert.

MfG Spess
OP #1272055
nein ist nicht der code mit dem ich das problem hatte!ich habe ja extra 
die eine led auf den anderen port gelegt um das problem zu umgehen.#

im original code war der eine port um den es geht als ausgang definiert. 
ich habe es auch noch an den PCx ports probiert > gleiches problem (ein 
port wollte nicht richtig)
und dann noch an einem ganz zweiten atmega8 iC

an der programmierung lag des definitiv nicht, da die led ja geleuchtet 
hat als sie es sollte nur eben vieeeeel zu dunkel (an der led und dem 
vorwiderstand lag es nicht!)
betreibe jetzt die gleiche konfiguration nur an einem anderen pin und es 
geht
Gast #1272063
Hi

>hat wann sie es sollte nur eben vieeeeel zu dunkel (an der led und dem
>vorwiderstand lag es nicht!)

Das kann eine LED unter Umständen auch an einem Eingang. Mit dem Setzen 
des Portpins wird der interne PullUp-Widerstand eingeschaltet. Bei einer 
Low-Current-LED kann da durchaus ein 'Glimmen' zu sehen sein.

MfG Spess

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.